缺页中断是什么,为什么会发生
2026/3/28大约 4 分钟约 1087 字
缺页中断是虚拟内存机制里的高频问题。它和页表、TLB、按需调页、swap 都直接相关。
一、什么是缺页中断
缺页中断指的是:
进程访问某个虚拟页时,发现这个页当前不在物理内存中,于是触发异常,由操作系统把该页调入内存后再继续执行。
所以缺页中断的本质不是“访问地址失败”,而是“访问的页此时还没有可用的物理驻留页”。
二、为什么会发生缺页中断
因为虚拟内存的一个基本思想就是:
不是所有虚拟页都要同时放在物理内存里。
这样可以提高内存利用率,只把当前常用的页放进 RAM。其他页可能:
- 还没真正分配物理页框
- 暂时不在内存中
- 已经被换出到 swap
- 来自文件,但尚未真正装入内存
当程序访问到这样的页时,就会触发缺页中断。
三、缺页中断的大致处理流程
1. CPU 产生虚拟地址
程序访问某个变量、数组或者代码地址。
2. 先查 TLB,再查页表
- TLB 命中则直接得到映射
- TLB 未命中则继续查页表
3. 页表显示该页不在内存中
这时不能继续正常访问,于是触发缺页中断,进入内核处理。
4. 操作系统接管
操作系统会进一步判断:
- 这个地址是否合法
- 这个页是匿名页、文件页,还是 swap 中的页
- 当前是否需要分配物理页框
- 当前是否需要先换出别的页
5. 调页并更新映射
如果访问合法,操作系统会:
- 必要时创建缺失的下级页表
- 分配物理页框
- 从文件或 swap 中把页装入内存,或者直接分配新页并清零
- 更新页表
- 更新或刷新 TLB
6. 重新执行原来的指令
页已经准备好后,之前访问失败的那条指令会重新执行一次,这次通常就能成功了。
四、缺页中断一定代表程序出错吗
不一定。
1. 合法缺页
如果这个地址本来就是当前进程合法的映射区域,只是对应页当前不在内存里,那么缺页中断只是按需调页的正常过程。
2. 非法访问
如果这个地址根本不属于当前进程的有效映射区域,或者访问权限不对,那么操作系统不会帮你正常调页,而是会判定为非法访问,通常导致进程异常终止。
所以要区分:
- 地址合法但页不在内存 → 正常缺页处理
- 地址本身不合法 → 非法访问
五、为什么缺页中断很昂贵
缺页中断通常比较慢,原因包括:
- 需要从用户态切换到内核态
- 需要查页表和相关状态
- 可能需要创建下级页表
- 可能需要页面置换
- 可能涉及磁盘 IO
- 最后还要更新页表和 TLB
其中真正最慢的往往是磁盘读取和换页。
六、局部性原理和缺页中断是什么关系
程序通常具有局部性:
- 时间局部性:刚访问过的内容,短时间内还可能访问
- 空间局部性:访问某个地址后,附近地址也很可能被访问
操作系统和硬件正是利用这个规律,通过页、TLB、cache、预读等机制尽量减少缺页中断。
七、总结
缺页中断是指程序访问某个虚拟页时,发现该页当前不在物理内存中,于是由操作系统接管处理,把页调入内存后再恢复执行。缺页中断本身不一定是错误,很多情况下它只是按需调页的正常过程;只有访问的地址本身非法时,才属于真正的访问错误。缺页中断之所以昂贵,是因为它通常涉及内核切换、页表更新,甚至磁盘 IO。
