操作系统

缺页异常:用到时才分配

Linux 不会提前把内存给足,等程序真正用到时再补上,内存紧张时还可能“超卖”。

概况

以程序 malloc 一大块内存、之后第一次写入为例。

一句话总结
访问还没准备好的页 → 陷入内核 → 内核补上 → 重新执行那条指令
核心思想
按需分配:不用就不花
超额承诺
Linux 默认允许申请超过实际可用的内存
OOM killer
内存真的不够时,内核挑一个进程杀掉
类比
前端的图片懒加载、路由按需加载代码
三种结果
次要缺页(补一页)、主要缺页(读磁盘)、非法访问(段错误)
其他用途
写时复制、文件映射 mmap、换出页读回

步骤 6 / 6

超卖的代价:OOM killer

因为是按需分配,Linux 敢“超卖”内存;真不够时只能杀进程。

既然大部分申请的内存用不到,Linux 默认允许大家申请的总量超过实际内存,这叫超额承诺(overcommit)。 万一大家真的都来用,缺页时找不到空闲内存,内核就启动 OOM killer,挑一个占用大的进程杀掉。 所以服务“莫名其妙被杀”,常常要去 dmesg 里找 OOM 记录。

程序
内核
物理内存
程序
内核
物理内存
内存不够:结束一个进程
事件日志(6)
当前状态发生了什么
用户态内核只记账,不分配真实内存
进入内核态访问未映射的页,陷入内核
内核态确认地址合法,只是尚未分配
内核态 → 用户态新页映射进页表,重试成功
缺页写时复制或文件页读入
内核态OOM killer 选中并终止进程