在 Linux 中,当进程尝试访问没有当前物理映射的页面(缺少页表条目)时,会生成页面错误(由 CPU 生成)。这会导致调用 Linux 的页面错误处理程序。如果此故障是"主要"的,这意味着 Linux 必须从交换设备读取页面,在这种情况下,处理程序必须从实际磁盘读取。由于从磁盘读取是异步的 (submit_bio),这是否会导致进程重新计划?(并在 I/O 完成时唤醒?
如果确实发生了重新调度,对"schedule()"的调用在哪里?阅读 mm/swap_state.c 中的代码并不能告诉我何时(或是否)发生这种情况。
如果页面不在物理内存中,则进程在读取页面之前会阻塞,我认为您正在寻找错误的位置,时间表应该在页面错误处理程序或它调用的任何函数中。第 9.4 节中提供了更多信息。《了解Linux内核》一书的"页面错误异常处理程序",我引用:
handle_mm_fault( ) 函数返回VM_FAULT_MINOR或 VM_FAULT_MAJOR它是否成功地为 过程。值 VM_FAULT_MINOR 指示页面错误具有 在不阻塞当前进程的情况下进行处理;这种页面 故障称为次要故障。VM_FAULT_MAJOR值指示 页面错误强制当前进程休眠