- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux共享内存实例及文件映射编程及实现原理.txt如果我能够看到自己的影子,我想它一定很忧伤,因为我把快乐都留在了前面。容易伤害别人和自己的人,总是对距离的边缘模糊不清的人。目录
(一)IPC共享内存和文件映射的区别 1
(二)共享内存实现流程总结 1
(三)存储映射I/O(包含实现原理说明) 2
文件映射API补充 4
(四)IPC共享存储(包含实现原理说明) 6
(五)共享内存实现基本原理 10
(六)IPC共享内存实现机制 11
(七)文件映射的实现机制 13
(一)IPC共享内存和文件映射的区别
1. 文件映射的页框是磁盘文件高速缓存中的页框,内核线程pdflush会将页框中的内容回写进磁盘, 如果是私有映射类型,将会进行写时复制。而IPC共享内存映射的是一种特殊文件系统中的文件高速缓存,它没有相应的磁盘映像。
2. IPC共享内存只存在于内存中,系统重新启动,数据将会丢失。而文件共享映射会将数据写回磁盘。
3. IPC共享内存的大小是在创建的时候指定,而且大小不能改变,而文件在创建时大小为0,此时还不能建立映射,文件的大小会间接的决定映射区的大小。例如文件的大小是123,而要求映射的区域大小是4096*2,但实际只会分配4096的映射空间,此时引用4096以后的线性空间将引起缺页异常。
4. 当第一次读取共享内存时IPC共享内存对象将分配一个新的页框,而文件映射分配新页框的同时会将磁盘中的数据写入新页框。
5. IPC共享内存不需要写回磁盘操作,完全是为共享内存而设计,所以使用效率会更高。
6. IPC共享内存对象必须调用shmctl()显示的撤销,否则会一直保留着,使用key或者id号定位一个共享内存对象,key和id号的对应关系并不是固定的。例如,第一次使用key建立一个共享内存对象为shm1对应的id为id1,之后系统重新启动,然后再使用key建立一个共享内存对象shm2,对应的id是id2,此时id2和id1是不同的。而文件映射使用相同的路径将会定位相同的磁盘文件。
总结:IPC共享内存和文件映射的实现机制是一样的,文件映射的目的是加快对文件的读写速度,而IPC共享内存就是为了共享内存而设计的,所以效率会高一些。
(二)共享内存实现流程总结
1. 建立一个线性区对象struct vm_area_struct 并加入进程的内存描述符current-mm中。
函数mmap()和shmat()就是用于建立并注册线性区对象,这个对象中的struct file *vm_file指向映射文件的文件对象,vm_page_prot是线性区中页框的访问许可权。但此时并未修改进程的页表,而是注册相应的缺页异常回调函数,注册在对象的vm_ops。
2. 当进程第一次访问共享内存区时,由于相应的页表还未填写,将产生缺页异常,并根据线性地址找到对应的线性区对象,然后调用前边注册过的缺页异常回调函数,并根据vm_file文件对象和vm_page_prot的信息来填写相应的页表项,最后重新执行产生缺页异常的代码。
说明:文件映射和IPC共享内存映射的物理页框都是磁盘文件的页高速缓存中的,IPC共享内存使用一种特殊文件系统,这个文件系统并没有对应的磁盘映像,只是复用了文件系统的框架。更详细的内容参见后边的五,六,七节。
下面3,4节是《UNIX环境高级编程》对文件映射和IPC共享内存的讲解,已经说明的很详细了,我在它的基础上附加了一些内核实现原理的说明,实现原理说明部分放在括号内。
(三)存储映射I/O(包含实现原理说明)
存储映射I/O使一个磁盘文件与存储空间中的一个缓存相映射。于是当从缓存中取数据,就相当于读文件中的相应字节。与其类似,将数据存入缓存,则相应字节就自动地写入文件。这样,就可以在不使用read和write的情况下执行I/O。
为了使用这种功能,应首先告诉内核将一个给定的文件映射到一个存储区域中。这是由mmap函数实现的。
#include sys/types.h
#include sys/mman.h
void * mmap(void addr, size_t len, int prot, int flag, int fd, off_t off) ;
返回:若成功则为映射区的起始地址,若出错则为- 1
addr参数用于指定映射存储区的起始地址。通常将其设置为0,这表示由系统选择该映射区的起始地址。此函数的返回地址是:该映射区的起始地址。fd指定要被映射文件的描述符(fd用于定位是哪个磁盘文件的页高速缓存)。在映射该文件到一个地址空间之前,先要打开该文件。len是映射的字节数。off是要映射字节在文件中的起始位移量(下面将说明对off值有某些限制)。
在说明其余参数之前,先看一下存储映射文
您可能关注的文档
- 信号与信息处理专业排名.doc
- 学案幻灯片动态效果制作.doc
- 学校报刊.doc
- 学校学习实践科学发展观分析检查报告.doc
- 学医网站.doc
- 演示文稿创建软件PowerPoint2000基本操作.doc
- 液晶DID、等离.doc
- 液晶显示器问题大全.doc
- 一年级课外读物推荐.doc
- 以优盘为存储介质的MP3播放器设计.doc
- 调研:破解湿地固碳增汇“四难”困境推进生态价值高效转化.docx
- 税务局党业融合工作总结:党建领航,税业共进.docx
- 从民营企业看政府投资如何有效带动社会投资.docx
- 夯实党业融合根基,激活企业发展动能:党建引领工建、团建,激发员工活力的讨论交流.docx
- 医疗纠纷化解工作经验:建机制、循法理、重预防.docx
- 2025年8月主题党日活动方案(附学习计划).docx
- 2025年党员干部管理的经验材料.docx
- 县教育局局长在开学初工作部署会议上的讲话.docx
- 银行党委书记在党委理论学习中心组上关于“五个进一步到位”研讨发言材料.docx
- 在2025年全区食品安全工作会议上的讲话.docx
文档评论(0)