9

在 Linux 中,当一个进程试图访问一个没有当前物理映射的页面(缺少页表条目)时,会产生一个页面错误(由 CPU)。这会导致调用 Linux 的页面错误处理程序。如果这个故障是“严重的”,意味着 Linux 必须从交换设备读取页面,在这种情况下,处理程序必须从实际磁盘读取。由于从磁盘读取是异步的(submit_bio),这是否会导致进程重新调度?(并在 I/O 完成时唤醒?)

如果确实发生了重新安排,“schedule()”的调用在哪里?阅读 mm/swap_state.c 中的代码并不能让我知道何时(或是否)会发生这种情况。

4

1 回答 1

7

如果页面不在物理内存中,进程会阻塞,直到页面被读取,我认为你在错误的地方寻找调度应该在页面错误处理程序或它调用的任何函数中。在第 9.4 节中有更多信息。“理解 Linux 内核”一书中的“Page Fault Exception Handler”,我引用:

如果handle_mm_fault( )函数成功地为进程分配了一个新的页框,则返回VM_FAULT_MINOR 或VM_FAULT_MAJOR。VM_FAULT_MINOR 值表示 Page Fault 已经被处理,没有阻塞当前进程;这种页面错误称为次要错误。VM_FAULT_MAJOR 值表示 Page Fault 强制当前进程休眠

于 2012-11-18T16:02:42.570 回答