快速业务通道

Linux进程间通信 共享内存

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-22
一组处理例程,其中的 nopage操作用来处理虚拟页对应的物理页不存在的情况.对共享内存,该操作是shm_nopage(定义在ipc/shm.c中).该操作在描述这个 共享内存的shmid_kernel数据结构的页表shm_pages中查找发生page fault异常的虚拟地址所对应的页表条目,看共享页是否存在(页表条目为0,表示共享页是第一次使用).如果不存在,它就分配一个物理页,并为它创建一 个页表条目.这个条目不但进入当前进程的页表,同时也存到shmid_kernel数据结构的页表shm_pages中.

  当下一个进程试图访问这块内存并得到一个page fault的时候,经过同样的路径,也会走到函数shm_nopage.此时,该函数查看shmid_kernel数据结构的页表shm_pages时, 发现共享页已经存在,它只需把这里的页表项填到进程页表的相应位置即可,而不需要重新创建物理页.,是第一个访问共享内存页的进程这一页被创建, 而随后访问它的其它进程仅把此页加到它们的虚拟地址空间.

  3. 分离.当进程不再需要共享虚拟内存的时候,它们与之分离(detach).只要仍旧有其它进程在使用这块内存,这种分离就只会影响当前的进程,而不会影响 其它进程.当前进程的vm_area_struct数据结构被从shmid_ds中删除,并被释放.当前进程的页表也被更新,共享内存对应的虚拟内存页被 标记为无效.当共享这块内存的一个进程与之分离时,共享内存页被释放,同时,这块共享内存的shmid_kernel数据结构也被释放.

  系统调用sys_ipc(call值为SHMDT)用于共享内存区与进程虚拟地址空间的分离,而真正完成分离动作的是函数sys_shmdt,其定义如 下:

  int sys_shmdt (char *shmaddr)

  其中shmaddr是进程要分离的共享页的开始虚拟地址.

  该函数搜索进程的内存结构中的所有vm_area_struct数据结构,找到地址shmaddr对应的一个,调用函数do_munmap将其释放.

  在函数do_munmap中,将要释放的vm_area_struct数据结构从进程的虚拟内存中摘下,清除它在进程页表中对应的页表项(可能占多个页表 项),调用该共享内存数据结构vm_area_struct的操作例程中的close操作(此处为shm_close)做进一步的处理.

  在函数shm_close(定义在ipc/shm.c中)中,找到该共享内存对象在向量表shm_segs中的索引,从而找到该共享内存对象,将该共享内 存在当前进程中对应的vm_area_struct数据结构从对象的共享内存区域链表(由vm_next_share和vm_pprev_share指针 连接)中摘下.如果目前与该共享内存对象粘附的进程数变成了0,则释放共享内存页,释放共享内存页表,释放该对象的shmid_kernel数据结构,将 向量表shm_segs中该共享内存对象所占用的项改为IPC_UNUSED.

  如果共享的虚拟内存没有被锁定在物理内存中,分离会更加复杂.在这种情况下,共享内存的页可能在系统大量使用内存的时候被交换到系统的交换磁盘.为了 避免这种情况,可以通过下面的控制操作,将某共享内存页锁定在物理内存不允许向外交换.共享内存的换出和换入,已在第3章中讨论.

  4. 控制.Linux在共享内存上实现的第四种操作是共享内存的控制(call值为SHMCTL的sys_ipc调用),它由函数sys_shmctl实现. 控制操作包括获得共享内存对象的状态,设置共享内存对象的参数(如uid、gid、mode、ctime等),将共享内存对象在内存中锁定和释放(在对象 的mode上增加或去除SHM_LOCKED标志),释放共享内存对象资源等.

  共享内存提供了一种快速灵活的机制,它允许进程之间直接共享大量的数据,而无须使用拷贝或系统调用.共享内存的主要局限性是它不能提供同步,如果两个进程 企图修改相同的共享内存区域,内核不能串行化这些动作,因此写的数据可能任意地互相混合.使用共享内存的进程设计它们自己的同步协议,如用信 号灯等.

  以下是使用共享内存机制进行进程间通信的基本操作:

 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号