每个页面错误中是否都有磁盘访问?

Is there a disk access in every page fault?

我的问题是(如上所述)是否每次出现页面错误时都可以访问 disk/virtual 内存?

如果不是,什么情况下没有磁盘访问?

(这是关于分页的一般性问题,与实现无关)

谢谢

在某些情况下页面错误不会触发磁盘访问。

页面错误是当进程请求未由 MMU(memory-management 单元)映射到物理页面的虚拟地址时触发的异常。如果页面不在物理内存 (RAM) 中的任何位置,虚拟地址有效,并且需要后备存储(即磁盘)中存在的页面数据,页面错误处理程序将触发对磁盘的访问。这种情况通常被归类为硬页面错误主要页面错误

次页面错误软页面错误期间,请求的物理页面未映射到虚拟地址space 由 MMU 处理,但不需要磁盘访问,可能有以下几个原因:

  • 页面可能驻留在物理内存中,即使它没有被进程映射。该页面可能是共享内存的一部分并被另一个进程映射,或者该页面当前无法被任何进程映射,但在物理内存中且尚未写入磁盘或擦除。

    一些操作系统有一个 “working set” 页面的概念,在给定时间为进程映射,并将对可以成为工作集一部分的页面数量设置上限.当确定进程的工作集变得太大时,页面可能会从进程的工作集中删除,但在空闲页面列表中保持未修改的时间足以再次请求和映射。

  • 页面错误也可能是 demand-zero 错误demand-zero fault 可以通过在物理中分配空闲页面来满足内存并将其内容设置为全 0,因此不需要磁盘访问。

请求不属于虚拟地址space的地址的情况也会触发页面错误,通常称为无效页面错误。例如,如果进程试图引用 NULL 指针,页面错误处理程序通常会触发分段错误。 (无效页面错误不一定总是由于页面保护违规而发生 - 这只是一种情况的任何示例)。

(我引用了 the Wikipedia page for Page fault 并且肯定会推荐它作为页面错误的简明介绍!)