Linux共享内存.pptVIP

  1. 1、本文档共26页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux共享内存

操作系统与实验 第4章2 Linux 共享内存 4.5 Linux共享内存通信 4.5.1 共享内存通信概述 针对消息缓冲需要占用CPU进行消息复制的缺点,操作系统提供了一种进程间直接进行数据交换的通信方式——共享内存。顾名思义,这种通信方式允许多个进程共享同一块物理内存空间来实现进程之间的信息交换,其特点是没有中间环节,直接将共享的内存页面通过附接,映射到相互通信的进程各自的虚拟地址空间中,从而使多个进程可以直接访问同一个物理内存页面,如同访问自己的私有空间一样(但实质上不是私有的而是共享的)。因此这种进程间通信方式是在同一个计算机系统中的诸进程间实现通信的最快捷的方法,而它的局限性也在于此,即共享内存的诸进程必须共处同一个计算机系统,有物理内存可以共享才行。多进程共享内存如图4?4所示。 图4?4 共享内存通信 4.5.2 共享内存通信的数据结构 Linux内核维护一个关于共享内存的数据结构shmid_kernel,定义在文件/usr/rsc/linux-2.4/ipc/shm.c中。 如同消息队列中的系统数据结构msq_queue,该shmid_kernel结构中也将IPC中统一的kern_ipc_perm结构放在首位,kern_ipc_perm中同样给出了被共享内存的key值,并将key值作为共享内存的唯一标识,以及存取权限等信息。 图4?5 共享内存各数据结构之间的关系 4.5.3 共享内存通信的系统调用 与消息缓冲通信类似,Linux对共享内存通信也提供了4个系统调用函数: shmget() shmat() shmdt() shmctl() 下面分别予以介绍。 1.创建或获取一个共享内存 命令格式: shmget( key, size, flag ) 功能: 获得一个内部标识为shmid的共享存储区。 语句格式: int shmid = int shmget ( key_t key, int size, int flag ); 参数说明: key——共享存储区关键字,可以由用户指定,如果使用IPC_PRIVATE其值由系统产生。 size ——存储区的大小(字节数)。如果存储区定义为字符型,则大小为定义的字符个数;如果存储区定义为整型,大小可以使用sizeof (int)加以定义。 flag——用户设置的标志或访问方式,与消息缓冲shmget中的含义相同,在实验中,可以使用0666|IPC_CREAT,表示任意进程可读可写。 返回值: 正确返回:共享存储区的内部标识符shmid 错误返回:-1 2.将共享内存附接到进程的虚拟地址空间 命令格式: 字符型共享内存: shmat( int shmid, char *shmaddr, int msgflg, ulong *raddr ); 数值型共享内存: shmat( int shmid, int *shmaddr, int msgflg, ulong *raddr ); 功能: 逻辑上将内部标识符为shmid的共享存储区附接到进程的虚拟地址空间shmaddr。 语句格式: 字符型共享内存: viraddr =(char*)shmat ( shmid, shmaddr, shmflag ); 数值型共享内存: viraddr =(int*)shmat ( shmid, shmaddr, shmflag ); 参数说明: shmid——共享存储区的描述符,可以由shmget()的返回值得到; shmaddr——用户提供的共享存储区附接的虚地址,若shmaddr为0 ,则由系统选择一个适当的地址来附接该存储区; flag——规定了对该存储区的操作权限,以及系统是否要对用户规定的地址做舍除操作。如果flag中设置了SHM_RND表示操作系统在必要时舍去这个地址;如果设置了SHM_RDONLY则表示只允许读,flag为0表示可读可写。 viraddr——附接的虚地址,若定义为char *viraddr,则该共享内存作为字符存储区使用,若定义为int *viraddr,则该共享内存作为整型存储区使用。 实验中分别使用以下格式附接: 字符型: viraddr = (char *) shmat(shmid,0,0); 数值型: viraddr = (int *) shmat(shmid,0,0); 返回值: 正确返回:共享存储区附接后的虚地址; 错误返回:-1 3.将共享内存从进程的地址空间断开 命令格式: shmdt(viraddr); 功能: 将一个共享存储区从指定进程的虚拟地址空间断开。 参数说明: shmaddr——系统调用shma

文档评论(0)

118books + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档