页缺失(英语:Page fault,又名硬错误、硬中断、分页错误、寻页缺失、缺页中断、页故障等)指的是当软件试图访问已映射在
虚拟地址空间中,但是并未被加载在
物理内存中的一个
分页时,由
中央处理器的
内存管理单元所发出的
中断。
通常情况下,用于处理此中断的程序是
操作系统的一部分。如果操作系统判断此次访问是有效的,那么操作系统会尝试将相关的分页从硬盘上的
虚拟内存文件中调入内存。而如果访问是不被允许的,那么操作系统通常会结束相关的
进程。
虽然其名为“页缺失”错误,但实际上这并不一定是一种错误。而且这一机制对于利用
虚拟内存来增加程序可用内存空间的操作系统(比如
Microsoft Windows和各种
类Unix系统)中都是常见且有必要的。
微软在较新版Windows的
资源监视器中使用“硬错误”(Windows Vista及以上)、“硬中断”(
Windows 8及以上)这一术语来指代“页缺失”。
发生这种情况的可能性之一,是一块物理内存被两个或多个程序
共享,操作系统已经为其中的一个装载并注册了相应的页,但是没有为另一个程序注册。
可能性之二,是该页已被从CPU的
工作集中移除,但是尚未被交换到
磁盘上。比如
OpenVMS这样的使用次级页缓存的系统,就有可能会在工作集过大的情况下,将某页从工作集中去除,但是不写入硬盘也不擦除(比如说这一页被读出硬盘后没被修改过),只是放入空闲页表。除非有其他程序需要,导致这一页被分配出去了,不然这一页的内容不会被修改。当原程序再次需要该页内的数据时,如果这一页确实没有被分配出去,那么系统只需要重新为该页在MMU内注册映射即可。
硬性页缺失导致的性能损失是很大的。以一块7200
rpm的主流
机械硬盘为例,其平均寻道时间为8.5毫秒,读入内存需要0.05毫秒。相对的,
DDR3内存的访问延迟通常在数十到100纳秒之间,性能差距可能会达到8万到22万倍。
当程序访问的虚拟地址是不存在于虚拟地址空间内的时候,则发生无效页缺失。一般来说这是个软件问题,但是也不排除硬件可能,比如因为内存故障而损坏了一个正确的
指针。
具体动作与所使用的操作系统有关,比如Windows会使用
异常机制向程序报告,而
类Unix系统则会使用
信号机制。如果程序未处理相关问题,那么操作系统会执行默认处理方式,通常是转储内存、终止相关的程序,然后向用户报告。