步骤 9 / 9
内存不够时:换出到磁盘
物理内存不够时,内核可以把不常用的页写到磁盘,腾出空间。
虚拟内存让“程序以为有的内存”可以大于物理内存。 内核挑最近不常用的页写到交换区(swap)或丢掉可重新读取的文件页,并在页表里标记“不在内存”;再访问时触发缺页,再读回来。 读磁盘比读内存慢成千上万倍,所以频繁换进换出(抖动)时整台机器会变得非常卡。
操作系统
每个程序都以为自己独占一大片内存,其实背后有一层翻译。
以 Linux 上一个程序读取自己内存中的一个变量为例,只讲概念。
步骤 9 / 9
物理内存不够时,内核可以把不常用的页写到磁盘,腾出空间。
虚拟内存让“程序以为有的内存”可以大于物理内存。 内核挑最近不常用的页写到交换区(swap)或丢掉可重新读取的文件页,并在页表里标记“不在内存”;再访问时触发缺页,再读回来。 读磁盘比读内存慢成千上万倍,所以频繁换进换出(抖动)时整台机器会变得非常卡。
| 当前状态 | 发生了什么 |
|---|---|
| 用户态 | 程序想读取一个变量 |
| 用户态 | 地址落在“堆”区域 |
| 用户态 | 查页表,得到物理地址 |
| 翻译中 | 逐级查找页表 |
| 动手实验 | 地址被拆成 4 个 9 位下标和 12 位偏移 |
| 用户态 | TLB 命中,翻译几乎零开销 |
| 共享 | 多个页表指向同一页 |
| 用户态 | 程序读到了变量的值 |
| 换出 | 腾出物理页 |