普通文件读写过程
读文件:会先把文件数据拷贝到内核空间中的页缓存中,然后再把页缓存的数据拷贝到用户空间中,这里需要两次数据拷贝。
写文件:先把用户空间的数据拷贝到内核空间,内核空间再写回磁盘,也是两次数据拷贝。
mmap实现过程
在当前进程的虚拟地址空间中寻找一段满足要求的虚拟地址,然后创建vm_area_struct结构,对其进行初始化,最后将其插入到进程的虚拟地址区域链表(或者树)中。
内核根据fd找到文件磁盘物理地址,建立页表实现文件地址和虚拟地址区域的一一对应。
进程对映射的虚拟地址空间发起访问,引发缺页中断,系统会把所缺的页装入主存中。
mmap回写磁盘时机
内存不足
进程退出
调用msync和munmap
一定延迟时间后
mmap应用
微信日志模块xlog
解决频繁GC,跨平台:采用C++实现
解决丢日志,写入速度快:mmap内存映射
非集中式压缩:在写入mmap前进行压缩,采用分单元压缩,某条日志损坏只会导致所在的单元无法解压,不影响其它单元,官方说的压缩率为83.7%
加密:压缩才加密,能提高效率
整个流程为:采集 –> 压缩 –> 加密 –> 写入mmap –> 操作系统自动回写到日志文件中
美团日志模块Logan
其实跟微信的xlog类似,采用C++,mmap,压缩这些技术实现。