0%

mmap原理

普通文件读写过程

读文件:会先把文件数据拷贝到内核空间中的页缓存中,然后再把页缓存的数据拷贝到用户空间中,这里需要两次数据拷贝。

写文件:先把用户空间的数据拷贝到内核空间,内核空间再写回磁盘,也是两次数据拷贝。

mmap实现过程

  1. 在当前进程的虚拟地址空间中寻找一段满足要求的虚拟地址,然后创建vm_area_struct结构,对其进行初始化,最后将其插入到进程的虚拟地址区域链表(或者树)中。

  2. 内核根据fd找到文件磁盘物理地址,建立页表实现文件地址和虚拟地址区域的一一对应。

  3. 进程对映射的虚拟地址空间发起访问,引发缺页中断,系统会把所缺的页装入主存中。

mmap回写磁盘时机

  • 内存不足

  • 进程退出

  • 调用msync和munmap

  • 一定延迟时间后

mmap应用

微信日志模块xlog

  • 解决频繁GC,跨平台:采用C++实现

  • 解决丢日志,写入速度快:mmap内存映射

  • 非集中式压缩:在写入mmap前进行压缩,采用分单元压缩,某条日志损坏只会导致所在的单元无法解压,不影响其它单元,官方说的压缩率为83.7%

  • 加密:压缩才加密,能提高效率

整个流程为:采集 –> 压缩 –> 加密 –> 写入mmap –> 操作系统自动回写到日志文件中

美团日志模块Logan

其实跟微信的xlog类似,采用C++,mmap,压缩这些技术实现。