快速业务通道

Linux进程间通信 共享内存

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-22

  共享内存(Shared Memory)

  共享内存区域是被多个进程共享的一部分物理内存.如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而 可以通过该区域进行通信.共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中 的内容.这块共享虚拟内存的页面,出现在每一个共享该页面的进程的页表中.但是它不需要在所有进程的虚拟内存中都有相同的虚拟地址.

  
                  图 共享内存映射图

  象所有的 System V IPC对象一样,对于共享内存对象的访问由key控制,并要进行访问权限检查.内存共享之后,对进程如何使用这块内存就不再做检查.它们依赖于其它机 制,比如System V的信号灯来同步对于共享内存区域的访问.

  每一个新创建的共享内存对象都用一个shmid_kernel数据结构来表达.系统中所有的shmid_kernel数据结构都保存在shm_segs向 量表中,该向量表的每一个元素都是一个指向shmid_kernel数据结构的指针.shm_segs向量表的定义如下:

  struct shmid_kernel *shm_segs[SHMMNI];

  SHMMNI为128,表示系统中最多可以有128个共享内存对象.

  数据结构shmid_kernel的定义如下:

  struct shmid_kernel

  {

  struct shmid_ds u; /* the following are private */

  unsigned long shm_npages; /* size of segment (pages) */

  unsigned long *shm_pages; /* array of ptrs to frames -> SHMMAX */

  struct vm_area_struct *attaches; /* descriptors for attaches */

  };

  其中:shm_pages是该共享内存对象的页表,每个共享内存对象一个,它描述了如何把该共享内存区域映射到进程的地址空间的信息.

  shm_npages是该共享内存区域的大小,以页为单位.

  shmid_ds是一个数据结构,它描述了这个共享内存区的认证信息,字节大小,一次粘附时间、分离时间、改变时间,创建该共享区域的进程,一次 对它操作的进程,当前有多少个进程在使用它等信息.其定义如下:

  struct shmid_ds {

  struct ipc_perm shm_perm; /* operation perms */

  int shm_segsz; /* size of segment (bytes) */

  __kernel_time_t shm_atime; /* last attach time */

  __kernel_time_t shm_dtime; /* last detach time */

  __kernel_time_t shm_ctime; /* last change time */

  __kernel_ipc_pid_t shm_cpid; /* pid of creator */

  __kernel_ipc_pid_t shm_lpid; /* pid of last operator */

  unsigned short shm_nattch; /* no. of current attaches */

  unsigned short shm_unused; /* compatibility */

  void *shm_unused2; /* ditto - used by DIPC */

  void *shm_unused3; /* unused */

  };

  attaches描述被共享的物理内存对象所映射的各进程的虚拟内存区域.每一个希望共享这块内存的进程都通过系统调用将其粘附(attach)到它 的虚拟内存中.这一过程将为该进程创建了一个新的描述这块共享内存的vm_area_struct数据结构.进程可以选择共享内存在它的虚拟地址空间的位 置,也可以让Linux为它选择一块足够的空闲区域.

  这个新的vm_area_struct结构除了要连接到进程的内存结构mm中以外,还被连接到共享内存数据结构shmid_kernel的一个链表中,该 结构中的attaches指针指向该链表.vm_area_struct数据结构中专门提供了两个指针:vm_next_shared和 vm_prev_shared,用于连接该共享区域在使用它的各进程中所对应的vm_area_struct数据结构.其实,虚拟内存并没有在

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号