共享内存

来源:互联网 发布:863软件孵化器靠谱吗 编辑:程序博客网 时间:2024/05/22 15:18

进程加载到内存上运行,共享内存就是在内存上开辟一块空间,在各个进程中都有指针直接指向开辟的内存区域,访问时当做本进程中的一个内存控制直接操作。


共享内存也有内核对象来管理共享的内存区域,进程通过内核对象得到共享内存ID,进程中有一个指针指向共享内存首地址,将其连接起来。完成之后在断开连接。



操作:
1、创建/获取:int shmget(key_t key, size_t size, int flag);
size 该共享储存段的大小(字节),一般要设定,因为不知道是创建还是获取。
flag 权限以及控制, 按位或IPC_CREAT ,如果存在直接获取,如果不存在则创建。
成功返回共享储存ID,失败返回-1。
2、连接:第一次创建共享内存段时,它不能被任何进程访问。找到共享存储段首地址链接到进程的地址空间。
void *shmat(int shmid, const void *addr, int flag);
shmid 共享储存ID。
addr 共享内存连接到当前进程的地址位置,通常是一个空指针,让系统来选择共享内存出现的地址。
flag 一组位标志,可能的两个取值为SHM_RND(与addr联合使用控制共享内存连接的地址)和SHM_RDONLY(连接的内存只读)。
成功返回一个指向共享内存第一个字节(首地址)的指针,失败返回-1。
3、断开连接:当对共享存储段的操作结束时,调用shmdt脱接该段,但是并没有删除共享内存,最后一个进程结束后,删除链接,才会真正删除。
Int shmdt(void *addr);
参数addr是以前调用shmat时的返回值。
成功返回0,失败返回-1。
4、删除内核对象:int shmctl(int shmid,  int cmd,  struct shmid_ds *buf);
cmd 指定执行哪种操作(IPC_STAT    IPC_SET    IPC_RMID)
buf 指向包含共享内存模式和访问权限的结构。
成功返回0,失败返回-1。


两个以上的进程能够操作同一块物理空间的内存区域,所以共享的区域就成立临界资源,所以对于共享区域的访问要控制(信号量)。


例如:通过共享内存完成进程A获取用户输入,进程B输出单词个数。