都24年了,还有人不懂mmap内存映射详解?收藏保留
内容提要
mmap是一种内存映射的方法,可以将文件或其他对象映射到进程的地址空间中,实现文件磁盘地址和进程虚拟地址空间的映射关系。mmap操作具有高效性和进程间通信的优点。
延伸解读
mmap 高效背后的机制
文章指出 mmap 通过减少数据拷贝次数提升效率:常规文件操作需从磁盘到页缓存再到用户空间两次拷贝,而 mmap 只需一次。这是因为 mmap 在虚拟内存层面建立文件磁盘地址与进程虚拟地址的映射,访问时通过缺页异常将数据直接装入用户空间。这种机制特别适合大文件处理,但需注意映射区域大小必须是物理页大小的整倍数。
进程间共享内存的实现方式
多个进程映射同一文件即可实现共享内存。文章解释,当进程 A 修改映射区域后,修改会自动反映在进程 B 的虚拟地址空间中;且进程 B 读取相同页面时,可直接使用内存中已缓存的数据,无需再次从磁盘复制。这种共享不仅限于父子进程,无亲缘关系的进程也可通过映射同一文件或匿名映射同一区域进行通信。
使用 mmap 的注意事项
文章提醒几个关键细节:映射区域大小必须是物理页大小的整倍数;映射建立后,即使文件关闭,映射依然存在,因为映射的是磁盘地址而非文件句柄;对映射区域的修改不会立即回写磁盘,有延迟,可调用 msync() 强制同步。此外,映射时若 addr 参数非零可能降低可移植性,推荐设为 0 由系统自动分配地址。
Q&A
mmap是什么?它有什么作用?
mmap是一种内存映射方法,它将文件或其他对象映射到进程的虚拟地址空间中,建立文件磁盘地址与进程虚拟地址空间的映射关系。这样进程可以通过指针直接读写映射的内存,系统会自动回写修改到文件,无需调用read/write等系统调用。
mmap内存映射的实现过程分为哪几个阶段?
mmap内存映射的实现过程分为三个阶段:1) 启动映射过程,在虚拟地址空间中为映射创建虚拟映射区域(分配vm_area_struct结构并插入链表);2) 调用内核空间的系统调用函数mmap,实现文件物理地址和进程虚拟地址的一一映射关系(建立页表);3) 进程访问映射空间时引发缺页异常,实现文件内容到物理内存的拷贝。
mmap和常规文件操作(read/write)在数据拷贝上有什么区别?
常规文件操作需要两次数据拷贝:从磁盘到页缓存,再从页缓存到用户空间。而mmap操作只需要一次数据拷贝:从磁盘直接到用户主存,省去了页缓存到用户空间的拷贝,因此效率更高。
使用mmap有哪些优点?
mmap的优点包括:1) 减少数据拷贝次数,提高文件读取效率;2) 实现用户空间和内核空间的高效交互,修改可直接反映;3) 提供进程间共享内存及通信方式;4) 可用于高效的大规模数据传输,用磁盘空间弥补内存不足。
使用mmap时需要注意哪些细节?
使用mmap需要注意:1) 映射区域大小必须是物理页大小的整倍数(通常4KB);2) 内核跟踪被映射文件的大小,进程可合法访问文件大小以内且在映射区内的字节;3) 映射建立后,即使文件关闭,映射依然存在,因为映射的是磁盘地址而非文件句柄,且可用于进程间通信。
mmap如何实现进程间通信?
多个进程可以将同一个文件映射到各自的虚拟地址空间,从而共享内存。当一个进程修改映射区域的内容时,修改会自动反映到其他进程的虚拟地址空间中(对于共享映射),从而实现进程间通信和数据共享。