步骤 5 / 6
缺页的其他用途:写时复制和文件映射
缺页不只用来按需分配,内核还靠它实现写时复制和按需读文件。
fork 之后父子共享只读页,子进程一写就触发缺页,内核复制出一份私有页,再让它重做写入。 mmap 映射一个文件,也不是立刻读进来,而是访问到哪一页才从磁盘读哪一页;程序本身的代码也是这样按需加载的。 所以“缺页”是内核偷懒和省内存的通用开关,不是错误。
操作系统
Linux 不会提前把内存给足,等程序真正用到时再补上,内存紧张时还可能“超卖”。
以程序 malloc 一大块内存、之后第一次写入为例。
步骤 5 / 6
缺页不只用来按需分配,内核还靠它实现写时复制和按需读文件。
fork 之后父子共享只读页,子进程一写就触发缺页,内核复制出一份私有页,再让它重做写入。 mmap 映射一个文件,也不是立刻读进来,而是访问到哪一页才从磁盘读哪一页;程序本身的代码也是这样按需加载的。 所以“缺页”是内核偷懒和省内存的通用开关,不是错误。
| 当前状态 | 发生了什么 |
|---|---|
| 用户态 | 内核只记账,不分配真实内存 |
| 进入内核态 | 访问未映射的页,陷入内核 |
| 内核态 | 确认地址合法,只是尚未分配 |
| 内核态 → 用户态 | 新页映射进页表,重试成功 |
| 缺页 | 写时复制或文件页读入 |