电脑共享内存在哪里?
电脑共享内存在哪里?共享内存指在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存。下面小编给大家介绍下电脑共享的相关知识,希望对大家有帮助!
电脑共享内存在哪里?
共享内存指 (shared memory)在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存。由于多个CPU需要快速访问存储器,这样就要对存储器进行缓存(Cache)。任何一个缓存的数据被更新后,由于其他处理器也可能要存取,共享内存就需要立即更新,否则不同的处理器可能用到不同的数据。共享内存是 Unix下的多进程之间的通信方法 ,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。
工作原理
由于多个CPU需要快速访问存储器,这样就要对存储器进行缓存(Cache)。任何一个缓存的数据被更新后,由于其他处理器也可能要存取,共享内存就需要立即更新,否则不同的处理器可能用到不同的数据。
下面实例演示了使用shmget函数创建一块共享内存。程序中在调用shmget函数时指定key参数值为IPC_PRIVATE,这个参数的意义是创建一个新的共享内存区,创建成功后使用shell命令ipcs来显示系统下共享内存的状态。命令参数-m为只显示共享内存的状态。
(1)在vi编辑器中编辑该程序如下:程序清单14-8 create_shm.c 使用shmget函数创建共享内存#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#include <stdlib.h>#include <stdio.h>#define BUFSZ 4096int main ( void ){int shm_id; /*共享内存标识符*/shm_id=shmget(IPC_PRIVATE, BUFSZ, 0666 ) ;//shm_id=shmget(999,BUFSZ,0666|O_CREAT);if (shm_id < 0 ) { /*创建共享内存*/perror( "shmget" ) ;exit ( 1 );}printf ( "successfully created segment : %d n", shm_id ) ;system( "ipcs -m"); /*调用ipcs命令查看IPC*/exit( 0 );}
(2)在shell中编译该程序如下:$gcc create_shm.c -o create_shm
(3)在shell中运行该程序如下:$./ create_shmsuccessfully created segment : 2752516------ Shared Memory Segments --------key shmid owner perms bytes nattch status0x0000000 66root 600 393216 2 dest0x00000 5209root 666 4096 00x0056a4d5 2686978 root 600 488 10x0056a4d6 2719747 root 600 131072 1root 666 4096 0
上述程序中使用shmget函数来创建一段共享内存,并在结束前调用了系统shell命令ipcs –m来查看当前系统IPC状态。
注意事项
共享内存相比其他几种方式有着更方便的数据控制能力,数据在读写过程中会更透明。当成功导入一块共享内存后,它只是相当于一个字符串指针来指向一块内存,在当前进程下用户可以随意的访问。缺点是,数据写入进程或数据读出进程中,需要附加的数据结构控制。
如何创建编辑
共享内存是存在于内核级别的一种资源,在shell中可以使用ipcs命令来查看当前系统IPC中的状态,在文件系统/proc目录下有对其描述的相应文件。函数shmget可以创建或打开一块共享内存区。
函数原型如下:#include <sys/shm.h>int shmget( key_t key, size_t size, int flag );
函数中参数key用来变换成一个标识符,而且每一个IPC对象与一个key相对应。当新建一个共享内存段时,size参数为要请求的内存长度(以字节为单位)。
注意:内核是以页为单位分配内存,当size参数的值不是系统内存页长的整数倍时,系统会分配给进程最小的可以满足size长的页数,但是最后一页的剩余部分内存是不可用的。
当打开一个内存段时,参数size的值为0。参数flag中的相应权限位初始化ipc_perm结构体中的mode域。同时参数flag是函数行为参数,它指定一些当函数遇到阻塞或其他情况时应做出的反应。