步骤 7 / 9
共享与写时复制
同一块物理内存可以映射给多个进程,省内存,也让 fork 变快。
每个进程都用 libc,但内存里只需要一份它的代码,各进程的页表都指向同一组物理页。 fork 时父子进程先共享所有页,并都标成只读;谁先写,就触发异常,内核这时才复制那一页,这叫写时复制(COW)。 进程间共享内存(mmap 共享映射)也是同一个机制:两个页表指向同一组物理页。
操作系统
每个程序都以为自己独占一大片内存,其实背后有一层翻译。
以 Linux 上一个程序读取自己内存中的一个变量为例,只讲概念。
步骤 7 / 9
同一块物理内存可以映射给多个进程,省内存,也让 fork 变快。
每个进程都用 libc,但内存里只需要一份它的代码,各进程的页表都指向同一组物理页。 fork 时父子进程先共享所有页,并都标成只读;谁先写,就触发异常,内核这时才复制那一页,这叫写时复制(COW)。 进程间共享内存(mmap 共享映射)也是同一个机制:两个页表指向同一组物理页。
| 当前状态 | 发生了什么 |
|---|---|
| 用户态 | 程序想读取一个变量 |
| 用户态 | 地址落在“堆”区域 |
| 用户态 | 查页表,得到物理地址 |
| 翻译中 | 逐级查找页表 |
| 动手实验 | 地址被拆成 4 个 9 位下标和 12 位偏移 |
| 用户态 | TLB 命中,翻译几乎零开销 |
| 共享 | 多个页表指向同一页 |