576 字
3 分钟
mmap 是什么?文件映射和匿名映射怎么理解
mmap 在调用进程的虚拟地址空间中建立映射。映射可以关联文件,也可以是匿名映射;访问地址时才可能按需建立物理页,因此 mmap 成功不意味着整个文件已读进 RAM。内核可通过页缓存管理文件映射,多个进程映射同一文件时也可能共享缓存中的物理页。
文件映射常见两种语义:共享映射允许映射区域的修改与其他映射者共享,写入是否及何时写回文件还受同步、文件系统和接口语义影响;私有映射采用写时复制语义,写入通常形成进程私有副本,不把修改作为共享文件更新。匿名映射没有普通文件内容作为后备,常用于分配进程内存或共享匿名区域。
mmap 可用于文件随机访问、进程间共享区域和大型数据映射,但不保证一定比 read/write 快。映射需要页表、缺页处理和同步成本;顺序读文件可能使用缓冲 I/O 更合适。映射区域使用时必须处理文件截断、访问越界、映射权限和并发修改;访问超出文件当前长度的区域可能产生异常,不能只依赖“映射成功”。
映射文件更改是否立即落盘与 msync、文件系统和关闭流程有关,写入共享映射也不等同于数据库事务或持久化屏障。应用若需要崩溃一致性,还需设计写入顺序、同步和恢复协议。
常见追问
Q:mmap 调用完成后文件内容都在内存了吗?
A:没有。它建立虚拟映射,页面通常按需调入;实际驻留量由访问和内存回收决定。
Q:MAP_PRIVATE 修改会写回原文件吗?
A:其语义是私有写时复制,修改对其他映射者不可见,也不作为对原文件的共享更新。
Q:MAP_SHARED 写入后一定立刻持久化吗?
A:不一定。共享可见性与持久化不是一回事;需要按接口语义同步映射和文件,并考虑文件系统及崩溃一致性。
mmap 是什么?文件映射和匿名映射怎么理解
https://blog.xqcherry.top/posts/interview/operating-system/mmap-memory-mapping/ 目录