Memory management 页面错误是否会导致出错进程重新调度?

Memory management 页面错误是否会导致出错进程重新调度?,memory-management,linux-kernel,operating-system,segmentation-fault,swap,Memory Management,Linux Kernel,Operating System,Segmentation Fault,Swap,在Linux中,当进程尝试访问没有当前物理映射(缺少页表条目)的页时,会(由CPU)生成页错误。这会导致调用Linux的页面错误处理程序。如果此故障为“重大”,意味着Linux必须从交换设备读取页面,那么在这种情况下,处理程序必须从实际磁盘读取。由于从磁盘读取是异步的(submit_bio),这是否会导致进程重新调度?(并在I/O完成时唤醒?) 如果确实发生了重新调度,那么对“schedule()”的调用在哪里?读取mm/swap_state.c中的代码并不能告诉我何时(或是否)发生这种情况。如

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


如果确实发生了重新调度,那么对“schedule()”的调用在哪里?读取mm/swap_state.c中的代码并不能告诉我何时(或是否)发生这种情况。

如果一个页面不在物理内存中,进程会一直阻塞,直到该页面被读取,我认为您查找的位置不正确。计划应该在页面错误处理程序中或它调用的任何函数中。我引述以下资料:

handle\u mm\u fault()函数返回VM\u fault\u MINOR或 VM_FAULT_MAJOR,如果它成功地为 过程值VM_FAULT_MINOR表示页面错误已发生 在不阻塞当前流程的情况下进行处理;这种页面 故障称为小故障值VM\u FAULT\u MAJOR表示 页面错误迫使当前进程休眠


do_page_fault()(mm/fault.c)中有一个may_sleep()调用,可能会导致进程在提交bio后被“抢占”。@dividebyzero no
may_sleep()
标记可能睡眠的函数,我想您正在寻找
cond_resched()