LOL投注app官网下载

lol投注app 一文读懂内存映射与 mmap 机制

发布日期:2026-02-17 11:23    点击次数:84

lol投注app 一文读懂内存映射与 mmap 机制

—— 从“一个系统调用”到 Linux 编造内存的灵魂

若是你委果瓦解了 mmap,你就瓦解了 Linux 编造内存的一半。

在 Linux 宇宙里,有一个系统调用,看似庸碌,却连续了 文献 IO、编造内存、进度阻塞、分享内存、零拷贝、性能优化等险些所有中枢主题。

它等于:mmap。

好多东说念主用过 mmap,但少许有东说念主委果“瓦解” mmap:

为什么 mmap 比 read/write 快?

mmap 和 page cache 是什么联系?

mmap 后到底有莫得坐窝分派内存?

文献映射、匿名映射、分享映射践诺区别是什么?

mmap 如何参与 fork、COW、零拷贝?

为什么 mmap 用不好会径直把系统拖死?

这篇著作,咱们不讲 API 用法初学,而是从操作系统内核视角,透彻拆解 mmap 的责任机制。

一、从一个“反直观问题”提及

{jz:field.toptypename/}

问题: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 是“映射宇宙”。






Copyright © 1998-2026 LOL投注app官网下载™版权所有

epingren.com 备案号 备案号: 粤ICP备16065124号-1

技术支持:®lol投注  RSS地图 HTML地图