进程通信——共享内存

共享内存

共享内存是指通过将不同进程或同一进程的不同虚拟地址映射到相同的物理地址,从而实现对不同虚拟内存的操作可以作用到同一段物理内存,从而实现通过内存通信。

mmap

mmap的存在并不是为了实现共享内存,但mmap的确可以实现共享内存,也是最常用的共享内存方式。mmap是将硬盘的文件和进程的虚拟内存建议一个映射关系,使得进程可以直接对虚拟内存操作实现对文件操作,屏蔽了中间过程的系统调用。mmap通过将文件和多个不同进程的虚拟内存建立映射关系,使得多个进程可以通过操作各自的虚拟内存实现通信。

作用

原先进程要对一个文件进行操作,有以下步骤:
(1) 从用户态进入内核态
(2) 从内核态执行系统调用,将文件内容从硬盘拷贝至内核空间
(3) 将文件内容从内核空间拷贝至用户空间
(4) 从内核态返回到用户态
(5) 在用户态对文件内容进行操作
(6) 从用户态进入内核态
(7) 将文件内容从用户空间拷贝至内核空间
(8) 将文件内容从内核空间拷贝至硬盘
从上面的步骤可以发现,对文件进行操作需要四次数据拷贝,其中有两次拷贝操作发生在进程的虚拟空间内部。共享内存既可以是不同进程之间的内存共享,也可以是进程内部的内存共享,比如我们可以将内核空间和用户空间的虚拟内存映射到同一段物理内存,这样就可以省去两次的拷贝,从而提升效率。