lol投注app 一文读懂内存映射与 mmap 机制
发布日期:2026-02-17 11:23 点击次数:84
—— 从“一个系统调用”到 Linux 编造内存的灵魂
若是你委果瓦解了 mmap,你就瓦解了 Linux 编造内存的一半。
在 Linux 宇宙里,有一个系统调用,看似庸碌,却连续了 文献 IO、编造内存、进度阻塞、分享内存、零拷贝、性能优化等险些所有中枢主题。
它等于:mmap。
好多东说念主用过 mmap,但少许有东说念主委果“瓦解” mmap:
为什么 mmap 比 read/write 快?
mmap 和 page cache 是什么联系?
mmap 后到底有莫得坐窝分派内存?
文献映射、匿名映射、分享映射践诺区别是什么?
mmap 如何参与 fork、COW、零拷贝?
为什么 mmap 用不好会径直把系统拖死?
这篇著作,咱们不讲 API 用法初学,而是从操作系统内核视角,透彻拆解 mmap 的责任机制。
一、从一个“反直观问题”提及
问题:mmap 一个 10GB 的文献,会不会坐窝占用 10GB 内存?
谜底是:
不会。
不仅不会,况兼你甚而不错在一台只消 2GB 内存的机器上 mmap 一个 100GB 的文献。
为什么?
{jz:field.toptypename/}这恰是 mmap 机制最中枢的野心念念想:
地址空间 ≠ 物理内存
技艺路 mmap,lol投注app你必须先瓦解 Linux 的编造内存模子。
二、编造内存与地址空间:mmap 的舞台
2.1 进度看到的“假宇宙”
每个 Linux 进度王人活命在一个十足零丁的编造地址空间中。
典型的 64 位进度地址空间泄漏:
高地址┌──────────────────────┐│ 内核空间 │├──────────────────────┤│ mmap 映射区 │ ← 文献映射 / 匿名映射├──────────────────────┤│ 堆 │├──────────────────────┤│ 数据段 │├──────────────────────┤│ 代码段 │└──────────────────────┘低地址
这里有一个独特进攻的区域:mmap 映射区。
三、什么是 mmap:一句话界说
mmap 的践诺:在进度编造地址空间中,建立一段“地址区间”到“后端对象”的映射联系。
这个“后端对象”不错是:
庸碌文献
开荒文献
匿名内存(诀别应任何文献)
分享内存对象
关节点:建立的是“映射联系”,而不是数据拷贝。
四、mmap vs read/write:根柢各异在何处?
4.1 read/write 的传统 IO 旅途
磁盘 ↓Page Cache ↓内核缓冲区 ↓用户缓冲区
至少一次 内核态 → 用户态拷贝
无数 CPU 参与内存复制
4.2 mmap 的 IO 旅途
磁盘 ↓Page Cache ↑用户编造地址空间
莫得额外的数据拷贝
用户态径直“看到” page cache
这亦然 mmap 能成为 零拷贝技巧基础的原因之一。
五、mmap 系统调用干了什么?
5.1 用户态接口
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
5.2 内核作念了什么(中枢进程)
sys_mmap └─ do_mmap ├─ 查找可用编造地址区间 ├─ 创建 vm_area_struct ├─ 挂入 mm_struct->mmap 链表 ├─ 建立 VMA 与文献 / 匿名对象的有关 └─ 复返编造地址
属目:此时莫得分派任何物理页!
六、VMA:mmap 的灵魂数据结构
6.1 vm_area_struct 是什么?
每一个 mmap 映射,内核王人会创建一个 VMA(编造内存区域):
struct vm_area_struct { unsigned long vm_start; unsigned long vm_end; struct file *vm_file; unsigned long vm_flags; const struct vm_operations_struct *vm_ops;};
一个进度 = 多个 VMA 拼接而成。
七、委果的魔法:缺页颠倒(Page Fault)
7.1 mmap 不分派内存,那什么期间分派?
看望时。
char c = *((char *)addr); // 第一次看望
CPU 发现该编造页:
页表中无有用映射
触发 Page Fault
7.2 缺页颠倒解决进程(中枢)


CPU ↓Page Fault ↓do_page_fault ↓handle_mm_fault ↓vma->vm_ops->fault ↓从文献读取 / 分派匿名页 ↓建立页表映射
这一步,才是委果的数据加载。
八、文献映射 mmap:页缓存的另一种翻开风光
8.1 文献映射的践诺
文献内容 → Page Cache
Page Cache → 映射进进度地址空间
多个进度 mmap 并吞个文献:
分享 Page Cache
分享物理页
8.2 分享映射 vs 专有映射
类型
flag
行径
分享
MAP_SHARED
修改会回写文献
专有
MAP_PRIVATE
COW,不影响文献
九、Copy-On-Write:mmap 与 fork 的齐全合营
9.1 fork 后的 mmap
父子进度分享 VMA
页表指向并吞物理页
记号为 只读
9.2 写时复制发生时
写操作 ↓触发保护颠倒 ↓复制物理页 ↓建立专有映射这等于 COW
十、匿名 mmap:malloc 的另一条路
10.1 malloc 底层用无须 mmap?
谜底:用。
小对象:brk
大对象:mmap
glibc 计谋:
>128KB → mmap
十一、mmap 与分享内存
11.1 POSIX SHM
shm_openftruncatemmap
11.2 践诺
分享内存 = 多个进度 mmap 并吞个内查对象
十二、mmap 在高性能系统中的诈欺
12.1 零拷贝
sendfile
mmap + write
DMA + page cache
12.2 数据库
RocksDB
LMDB
Redis(AOF 重写)
12.3 高速日记系统
mmap 日记文献
规矩写,幸免 syscall
十三、mmap 的坑,比你遐想得多
13.1 SIGBUS:工程师恶梦
触发条目:
mmap 文献
文献被 truncate
看望越界页
服从:
Bus error (core dumped)
13.2 内存暴露的另一种面貌
健忘 munmap
VMA 数目爆炸
进度编造内存碎屑化
十四、如何正确使用 mmap(工程漠视)
只 mmap 必要区域
幸免时常小 mmap
对只读文献优先 mmap
不要 mmap 不踏实文献
怜惜 VMA 数目
十五、回想:为什么 mmap 是 Linux 的灵魂野心
它颐养了 文献 IO 与内存
它让 编造内存委果“编造”
它复旧了 COW / fork / 分享内存
它是 零拷贝与高性能 IO 的基础
瓦解 mmap,你就站在了 Linux 内核野心的中枢位置。
read/write 是“拷贝数据”,mmap 是“映射宇宙”。

备案号: