共享内存及实验(读者写者问题) .pdfVIP

  1. 1、本文档共8页,可阅读全部内容。
  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课程设计报告

专业班级:

学号:

姓名:

Linux共享内存通信的原理分析及实验(读者写者问题)

一、原理说明及分析

1:共享内存的相关原理

1)共享内存就是内存中一个区域(段)的映射,这个区域可以被更多的进

程所共享。它是IPC机制中最快的一种形式,因为它不需要中间环节,而是直接把信息从

个内存段映射到调用进程的地址空间。因为进程可以直接读写内存,而不需要任何数据的

拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷

贝,而共享内存则只拷贝两次数据:一次从输入文件到共享内存区,另一次从共享内存区

到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有

新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,

数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射

时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。

2)一个段可以直接由一个进程创建,随后可以有任意多个进程对其进读和写。

但是,一旦内存被共享之后,对共享内存的访问同步需要由其他的IPC机制,例如信号量

来实现。Linux对共享内存的存取控制是通过对访问键和访问权限的检查来控制的。

2:mmap()及相关系统调用

1)mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普

通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问,不必再

调用read(),write()等操作。mmap()系统调用形式如下:

void*mmap(void*addr,size_tlen,intprot,intflags,intfd,off_t

offset)例如:p_map=(people*)

mmap(NULL,sizeof(people),PROT_READ|PROT_WRITE,MAP_SHARE|MAP_ANONYMOUS,-1,0);

2)系统调用mmap()用于共享内存有两种方式:

a)使用普通文件提供的内存映射:适用于任何进程之间;此时,需要打开或

创建一个文件,然后再调用mmap();典型调用代码如下:

fd=open(name,flag,mode);

if(fd0)

...

ptr=mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);

b)使用特殊文件提供匿名内存映射:适用于具有亲缘关系的进程之间;由于

父子进程特殊的亲缘关系,在父进程中先调用mmap(),然后调用fork()。那么在调用

fork()之后,子进程继承父进程匿名映射后的地址空间,同样也继承mmap()返回的地

址,这样,父子进程就可以通过映射区域进行通信了。见实验代码。

3:共享内存重要数据结构及实现过程:

1)重要数据结构如下图:structshmid_kernel;structvm_area_struct;

Structfile;structdentry;structinode;structaddress_space;

2)对mmap()返回地址的访问

前面对范例运行结构的讨论中已经提到,linux采用的是页式管理机制。对于用mmap()映

射普通文件来说,进程会在自己的地址空间新增一块空间,空间大小由mmap()的len参数

指定,注意,进程并不一定能够对全部新增空间都能进行有效访问。进程能够访问的有效

地址大小取决于文件被映射部分的大小。简单的说,能够容纳文件被映射部分大小的最少

页面个数决定了进程从mmap()返回的地址开始,能够有效访问的地址空间大小。超过这个

空间大小,内核会根据超过的严重程度返回发送不同的信号给进程。可用如下图示说明:

3)共享内存实现过程

a)pagecache及swapcache中页面的区分:一个被访问文件的物理页面都驻留在page

cache或swapcache中,一个页面的所有信息由structpage来描述。str

文档评论(0)

137****5455 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档