摘要:
最近在使用mmap解决数据库内存占用损耗过高导致OOM的问题, 不得不说在有些场景下mmap是非常有用.
本文主要涉及一些对mmap的思考.
mmap本身的思考:
- mmap和文件系统的交互规则是什么
- mmap中给进程虚拟内存映射的文件上的部分,是什么? 为什么是页缓存? 有没有文件缓存?
- mmap在内核中处于哪一个模块? 如何与用户空间交互?
- open/write/read接口处理文件, 在内核中会发生什么, 页缓存有何变化? 文件缓存又是什么?
- 当对mmap映射后的内存进行写操作时, 数据从用户空间如何进入内核空间?
- mmap写的数据, 何时写进磁盘文件?
- mmap读数据, 除了页缓存, 是否还有其他缓存?
- 如果实现一个用户态文件系统, 如何高效的实现mmap?
- 使用mmap映射后, 当进行写操作时, 为什么要用缺页异常来进行页加载? 有没有其他策略?
- 进程使用mmap映射后, 映射的虚拟内存, 是在进程的哪个段在做管理? 和堆内存和栈内存的关系是什么?
mmap使用的思考:
- 为什么进行映射的文件必须要用lseek占位? 如果不占位, 缺页如何处理?
- 当进程异常终止后, 映射的内存空间的数据, 如何被内核处理? 页缓存是否被内核磁盘交换?
- 如果映射的内存不够用, 能否扩充内存?
mmap的场景:
- tokyo-cabinet数据库的持久化
- linux可执行文件加载动态库
参考:
https://man7.org/linux/man-pages/man2/mmap.2.html
https://zhuanlan.zhihu.com/p/143270729
https://zhuanlan.zhihu.com/p/347449137
https://cloud.tencent.com/developer/article/2144681