天天看点

linux shmget mmap 性能,高性能IO 之 Linux shm和mmap的区别

linux shmget mmap 性能,高性能IO 之 Linux shm和mmap的区别

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

前言

这几天看了不少关于mmap的资料,发现在查阅的过程对mmap存在两种不同的说法。

第一种:将磁盘文件与虚拟内存进行映射,通过页表在物理内存发现缺页的情况,于是将磁盘上的文件拷贝到对应的物理内存上。这个是正确的说法。

另外一种:mmap将一段内核内存和用户内存进行映射,这样当内核把磁盘的文件拷到内核缓存的时候,就不需要再拷贝到用户内存中。应为用户内存和内核内存已经映射过了。(错误的说法)

期初看到这两种说法,让我一直很懵逼,直到今天看了一篇博客,是关于内存共享的,才知道第二种说法其实是shm的内存共享原理。

两者区别

shm原理

每个进程中的共享内存部分都映射到了同一块物理内存中。即是在物理内存中创建了一块空间,让进程一起使用。

linux shmget mmap 性能,高性能IO 之 Linux shm和mmap的区别

mmap原理

关于mmap的原理前面几篇已经有了很详细的阐述了,简单来说就是mmap是在磁盘上建立一个文件,每个进程地址空间中开辟出一块空间与这个文件进行映射。

linux shmget mmap 性能,高性能IO 之 Linux shm和mmap的区别

总结:

1.mmap有一个好处是当机器重启,因为mmap把文件保存在磁盘上,这个文件还保存了操作系统同步的映像,所以mmap不会丢失,但是shmget在内存里面就会丢失。

2.shm保存在物理内存,这样读写的速度肯定要比磁盘要快,但是存储量不是特别大。mmap将需要的数据再读入到内存中,可以处理大文件。

3.共享内存是在内存中创建空间,每个进程映射到此处。内存映射是创建一个文件,并且映射到每个进程开辟的空间中。