英文全称
- mmap:memory mapping ,内存映射(磁盘文件映射)。
- shm:shared memory ,共享内存。
mmap
1、实现原理
建立虚拟空间一段区域和磁盘上的文件的映射。
当访问虚拟空间中该区域时,通过 MMU,得到该区域对应的物理地址,OS 发现该区域没有数据,故产生缺页中断。OS 从磁盘中读取相应页的数据直接 copy 到物理内存中。
对于传统的 read 系统调用来说,他们需要将磁盘中的文件先 copy 到内核缓冲区中,再将该数据 copy 到用户缓冲区中。相较于 mmap ,后者节省了一次 copy ,这也就解释了为什么 mmap 相较于 read 和 write 系统调用性能较高的原因了。
2、普通映射和匿名映射
mmap 不仅可以映射到磁盘上的普通文件,还可以映射到匿名文件。实现方式是形参中的 fd = -1,flag = MAP_SHARED | MAP_ANON 。
对于匿名映射来说,其目的是保证该共享内存映射区只能父子进程使用,其他进程无法访问。如果需要与其他进程访问的话,需要映射到磁盘上的实际文件中。
shm 实现原理
通过相同的 key,实现了不同的进程的各自一段虚拟地址空间同时映射到某一段物理内存中的功能。
二者区别
mmap 保存到实际硬盘,实际存储并没有反映到主存上。优点:储存量可以很大(多于主存)缺点:进程间读取和写入速度要比主存的要慢。
shm 保存到物理存储器(主存),实际的储存量直接反映到主存上。优点,进程间访问速度(读写)比磁盘要快;缺点,储存量不能非常大(多于主存)。
使用上看:如果分配的存储量不大,那么使用 shm;如果存储量大,那么使用 mmap。
(SAW:Game Over!)