前言
最近在一次电话面试的过程中,面试官问我相关的共享内存的知识,当时就认为是我在学习IPC进程间通信学习到的共享内存,所以就给面试官讲解了一下,然后,面试官说我是否知道在Linux下的存储映射I/O,当时我下意识的知道就是mmap函数,但是感觉自己对这两个理解还是不够深刻,所以,写一篇博客来记录一下。
首先附上我的关于共享内存的链接,关于共享内存的大致内容我这里就不多提了。
http://blog.youkuaiyun.com/qq_26768741/article/details/56014845
对于共享内存这个主题我们不用多说,我想你也可以认识到,共享内存的好处就是效率高,不需要太多次的进行数据的copy。可以直接进行读写内存。所以,相对来说,共享内存要比消息队列使用多,而信号量用来保证共享内存同步。
Linux中的两种共享内存。一种是我们的IPC通信System V版本的共享内存,另外的一种就是我们今天提到的存储映射I/O(mmap函数),当然还有一种POSIX的共享内存,它是在mmap基础之上构建的。
1.mmap
mmapI/O的描述符间接说明内存映射文件,另外,mmap另外可以在无亲缘的进程之间提供共享内存区,这样,类似的两个进程之间就是可以进行了通信。
Linux提供了内存映射函数mmap, 它把文件内容映射到一段内存上(准确说是虚拟内存上), 通过对这段内存的读取和修改, 实现对文件的读取和修改,mmap()系统调用使得进程之间可以通过映射一个普通的文件实现共享内存。普通文件