为什么分享
MMap,我对这个概念其实是不熟悉的,昨天看一篇文章的时候,读到这个名词,所以就专门搜索了一下,这篇文章写得比较全面,所以进行了分享。了解这个概念,有助于提高对操作系统底层的认识。
概述
对于mmap,您是否能从原理上解析以下三个问题:
- mmap比物理内存+swap空间大情况下,是否有问题?
- MAP_SHARED,MAP_PRIVATE,MAP_ANONYMOUS,MAP_NORESERVE到底有什么区别?
- 常听说mmap的读写比传统的系统调用(read, write)快,但真的是这样子吗?原因是什么?
要解决这些疑问,可能还需要在操作系统层面多了解。本文将尝试通过这些问题深入剖析,希望通过这篇文章,能使大家对mmap有较深入的认识,也能在存储引擎的设计中,有所参考。
背景
最近在研发分布式日志存储系统,这是一个基于Raft协议的自研分布式日志存储系统,Logstore则是底层存储引擎。
Logstore中,使用mmap对数据文件进行读写。Logstore的存储结构简化如下图:
![f3a94b61565e7a4931c64fe0cc6769f1.png](https://img-blog.csdnimg.cn/img_convert/f3a94b61565e7a4931c64fe0cc6769f1.png)
logstore mmap.png
Logstore使用了Segments Files + Index Files的方式存储Log,Segment File是存储主体,用于存储Log数据,使用定长的方式,默认每个512M,Index File主要用于Segment File的内容检索。
Logstore使用mmap的方式读写Segment File,Segments Files的个数,主要取决于磁盘空间或者业务需求,一般情况下,Logstore会存储1T~5T的数据。
什么是mmap
我们先看看什么是mmap。
在<>这本书中,mmap定义为:Linux通过将一个虚拟内存区域与一个磁盘上的对象(object)关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射(memory mapping)。
在Logstore中,mapping的对象是普通文件(Segment File)。
mmap的原理
mmap在进程虚拟内存做了什么
我们先来简单看一下mapping一个文件,mmap做了什么事情。如下图所示:
![03447a32a083c1be919860e44170e4ae.png](https://img-blog.csdnimg.cn/img_convert/03447a32a083c1be919860e44170e4ae.png)
map file.png
假设我们mmap的文件是FileA,在调用mmap之后,会在进