前倾提要
:文章内容来自进程间通信
1.posix共享内存和System V共享内存的区别
区别
:
posix共享内存区对象的大小可在任何时间通过调用ftruncate修改,而System V共享内存对象的大小是在调用shmget时固定下来的,静态的
2.共享内存区
1)mmap\munmap和msync函数
mmap函数
- 作用:
人话:把一个文件或一个Posix共享内存区对象映射到调用进程的地址空间
非人话:
①使用普通文件以提供内存映射I/O
②使用特殊文件以提供匿名内存映射
③使用shm_open以提供无亲缘关系进程间的Posix共享内存区
这些非人话,我没看过前面的进程间通信章节,所以我不懂
2)在内存映射文件中给计数器持续加1(通过创建文件,这种原始方法让父子进程共享计数器)
3)4.4BSD提供匿名内存映射(彻底避免了文件的创建和打开)
4)SVR4 /dev/zero内存映射(SVR4提供/dev/zero设备文件,我们open它之后可在mmap调用中使用得到文件描述符)
5)访问内存映射的对象
6)小结
①mmap是有
亲缘关系的进程间共享内存
的一种方法,一旦内存映射了一个文件,就不能再使用read、write和lseek来访问该文件,而只是存储已由mmap映射到该文件的内存位置
②如果设置共享内存区的目的是为了让父子进程间共享,那么通过匿名内存映射
可简化其步骤,这样就不需要创建一个待映射的普通文件
③这里讨论mmap的理由:
-1)文件的内存映射是一种很有用的技巧
-2)还因为Posix共享内存区也使用mmap
④补充:posix还定义了处理内存管理的4个额外函数
mlockall会调用进程的整个内存空间常驻内存
munlockall则撤销这种锁定
mlock函数会调用进程地址空间的某个指定范围常驻内存,该函数的参数指定了这个范围的起始地址以及从该地址算起的字节数
munlock则撤销某个指定内存区的锁定