【系统编程】IPC底层实现合集

共享内存

1、shm和mmap的区别

mmap是建立虚拟内存空间与磁盘文件的映射,这种映射分为普通映射匿名映射

对于父子进程,采用匿名映射,匿名映射即建立虚拟内存空间与匿名页的映射,如果找到了这个匿名页,那么建立映射;如果没有,那么check这个匿名页是否在swap分区中,在的话就把匿名页读取到内存中来;如果不在swap分区,那么就会分配一个新的页面

对于其他进程(非亲属关系进程),想要访问共享空间,这块共享空间就需要映射到实际的文件上去,相当于是和磁盘的某个文件产生映射

进程调用mmap()时,只是在进程空间内新增了一块相应大小的缓冲区,并设置了相应的访问标识,但并没有建立进程空间到物理页面的映射。因此上述建立映射的过程发生在第一次访问这块缓冲区从而产生缺页中断的时候

(关于内存页面以及文件的相关内容详见笔者对于Linux内存管理子系统以及文件系统分析的wiki)

shm(sharedmemory)则是建立多个进程虚拟内存空间同一段物理内存的映射

从上述对比分析可以看出,shm是多个进程同时访问物理内存,而mmap的普通映射,则是多个进程同时访问磁盘,所以它们二者的区别在于:

mmap与普通文件产生映射的过程中,是需要把文件加载到内存中的,这个过程涉及IO操作,有性能上的损耗,但是磁盘很大,所以文件也可以容纳更多的内容(实际上,就算文件或者磁盘空间再大,加载到内存后也会受到内存大小的限制,但是由于页面置换的存在,可以使得不需要整个文件出现在内存)

而shm只与物理内存产生映射,只要物理内存还够用,自然不会产生IO操作,所以性能上是要比mmap要强的,缺点在于共享内存的数据是掉电不能保存的,而且受到物理内存大小的影响,shm的空间也受限

共享内存在地址空间中的位置:映射区(详见【kernel】内存模型

 

管道

posted on 2022-10-11 16:08  甲鱼写代码  阅读(55)  评论(0编辑  收藏  举报

导航