UNPv2第十二章:共享内存区
来源:互联网 发布:键鼠套装 知乎 编辑:程序博客网 时间:2024/06/05 02:40
12.1 概述:
共享内存区是最快的IPC形式,一旦这样的内存区映射到共享它的进程的地址空间,这些进程的数据传递就不再涉及内核。
12.2 mmap,munmap,msync函数
Mmap函数把一个文件或一个Posix共享内存区对象映射到调用进程的地址空间。使用该函数有三个目的:
使用普通文件提供内存映射
使用特殊文件提供匿名内存映射
使用shm:open提供无亲缘关系进程间的Posix共享内存区
#include<sys/mman.h>Void *mmap(void *addr, size_t len, int prot, int flag, int fd, off_t offset); 返回:成功时为被映射区的起始地址,出错时为MAP_FAILED
Addr可以指定描述字fd应被映射到的进程内空间的起始地址,通常为空,表示告诉内核自己去选择起始地址
Len是映射到进程地址空间的字节数,它从被映射文件的开头起offset字节处开始算。Offset通常为0
内存映射区的保护由prot参数指定,它使用图12.7中的常值。该参数的常见值是代表读写访问的PROT_READ|PORT_WRITE
Flags使用图12.8中的常值指定。MAP_SHARED或MAP_PRIVATE这两个标识必须指定一个,并可有选择的或上MAP_FIXED
可移植的代码应把addr=NULL,并且不指定MAP_FIXED
为从某个进程的地址空间删除一个映射关系,我们调用munmap
#include<sys/mmap.h>Int munmap(void *addr, size_t len); 返回:成功时为0,出错时为-1
可以通过调用msync()函数来实现磁盘文件内容与共享内存区中的内容一致,即同步操作.
#include<sys/mman.h>int msync ( void * addr, size_t len, int flags)
flags:刷新的参数设置,可以取值MS_ASYNC/ MS_SYNC/ MS_INVALIDATE
取值为MS_ASYNC(异步)时,调用会立即返回,不等到更新的完成;
取值为MS_SYNC(同步)时,调用会等到更新完成之后返回;
取MS_INVALIDATE(通知使用该共享区域的进程,数据已经改变)时,在共享内容更改之后,使得文件的其他映射失效,从而使得共享该文件的其他进程去重新获取最新值;
MS_ASYNC和MS_SYNC只能二选一
12.3 4.4BSD匿名内存映射
4.4BSD提供匿名内存映射,它彻底避免了文件的创建和打开。其办法是把mmap的flags参数指定成MAP_SHARED|MAP_ANON,把参数fd指定为-1.offset参数被忽略。这样的内存区初始化为0.
SVR4提供/dev/zero设备文件,我们在open它之后可在mmap调用中使用得到描述字。
- UNPv2第十二章:共享内存区
- UNPv2第十三章:Posix共享内存区
- UNPv2第十四章:System V共享内存区
- unpv2-共享内存
- UNPv2:进程间通信(五) System V共享内存区
- UNPv2第二章:Posix IPC
- UNPv2第八章:读写锁
- UNPv2第十章:Posix信号灯
- 第十二章 动态内存
- 第十二章 动态内存
- 第十二章内存管理
- 第十二章 动态内存
- 第十二章 内存控制块
- UNPv2第三章:System V IPC
- UNPv2第四章:管道和FIFO
- UNPv2第五章:Posix消息队列
- UNPv2第六章:System V 消息队列
- UNPv2第七章:互斥锁与条件变量
- [Python爬虫] Selenium爬取新浪微博移动端热点话题及评论 (下)
- 用三种方式序列化和反序列化用户名和密码数据
- 百度地图之语音TTS
- Oracle函数大全之日期函数
- English practice everday
- UNPv2第十二章:共享内存区
- 递归和迭代区别
- Android API之Assets下文件操作
- 转载_ 在ThoughtWorks工作12年的技术主管,所总结的12条技术人经验
- mysql 创建用户和表
- 浅谈线程
- 扫描透镜-java
- 11g等待事件之library cache: mutex X
- 重载CBCGPRibbonBar,去掉Quick Access toolbar