一、共享内存的概念
共享内存就是在内存上找一块空间,多个进程可以同时使用这块空间来传输数据,这块空间是这几个进程所共享的。
正因为这块空间共享,属于这几个进程中的每一个进程,所以这块内存属于临界资源,使用的时候需要用信号量进行同步控制。
共享内存是最快的一种IPC(进程间通讯方式)。
共享内存在各个进程中都有直接的指针指向开辟内存区域,在访问时当做本进程中的一块内存,直接访问。
二共享内存的实现
进程A、B通过访问内核对象,找到共享区域的首地址。
这块共享区域是共享的,既属于A,也属于B。所以这块内存既在A 中也在B中。
二共享内存的操作
(1)创建或者获取
int shmget(key_t key, size_t size, int shmflg);
成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。
调用失败返回-1。key 是键值,它有效地为共享内存段命名;size 开辟内存空间的大小;
shmflg是权限标志 shmflg: IPC_CREAT如果存在则获取,如果不存在,则创建。
(2)链接
第一次创建完共享内存时,它还不能被任何进程访问,shmat函数的作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间。 void *shmat(int shm_id, const void *shm_addr, int shmflg);
返回一个指向内存首地址的指针,shm_id是内存标识符;shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址;shm_flg是一组标志位,通常为0。
(3)断开链接
该函数用于将共享内存从当前进程中分离。不会将共享内存删除,只是使该共享内存对当前进程不再可用。
int shmdt(void *ptr);
ptr是shmat函数返回的地址指针,调用成功时返回0,失败时返回-1.
(4)删除内核对象
int shmctl(int shm_id, int command, struct shmid_ds *buf);
command是要采取的操作,它可以取下面的三个值:
四共享内存的实现