Linux 进程间通信 - 共享内存 shmget 方式(转)共享内存区域是被多个进程共享的一部分物理内存
如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信
共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容
这块共享虚拟内存的页面,出现在每一个共享该页面的进程的页表中
但是它不需要在所有进程的虚拟内存中都有相同的虚拟地址
图 共享内存映射图象所有的 SystemVIPC对象一样,对于共享内存对象的获取是由 key控制
内存共享之后,对进程如何使用这块内存就不再做检查
它们必须依赖于其它机制,比如 SystemV的信号灯来同步对于共享内存区域的访问(信号灯如何控制对临界代码的访问另起一篇说话)
每一个新创建的共享内存对象都用一个 shmid_kernel数据结构来表达
系统中所有的shmid_kernel数据结构都保存在 shm_segs向量表中,该向量表的每一个元素都是一个指向shmid_kernel数据结构的指针
shm_segs向量表的定义如下:structshmid_kernel*shm_segs[SHMMNI];SHMMNI为128,表示系统中最多可以有128个共享内存对象
数据结构 shmid_kernel的定义如下:structshmid_kernel{structshmid_dsu;/*the followingareprivate*/unsignedlongshm_npages;/*sizeofsegment(pages)*/unsignedlong*shm_pages;/*arrayofptrstoframes-> SHMMAX*/structvm_area_struct*attaches;/*descrip