9

在Linux中,當進程嘗試訪問沒有當前物理映射的頁面(缺少頁表條目)時,會生成頁面錯誤(由CPU)。這會導致Linux的頁面錯誤處理程序被調用。如果這個故障是「主要的」,這意味着Linux必須從交換設備讀取頁面,在這種情況下,處理程序必須從實際的磁盤讀取。由於從磁盤讀取是異步的(submit_bio),這是否會導致進程重新計劃? (並且在I/O完成時喚醒?)頁面錯誤是否導致錯誤進程重新計劃?

如果重新調度確實發生,調用「schedule()」的位置在哪裏?讀取mm/swap_state.c中的代碼並不能讓我知道何時(或如果)發生這種情況。

回答

7

如果頁面不在物理內存中,進程會阻塞,直到頁面被讀取,我認爲你在錯誤的地方查找時間表應該在頁面錯誤處理程序或它調用的任何函數中。還有在section 9.4. "Page Fault Exception Handler" of "Understanding the Linux Kernel" book更多信息,我引用:

handle_mm_fault()函數返回VM_FAULT_MINOR或 VM_FAULT_MAJOR如果它成功地分配了 過程中一個新的頁面幀。值VM_FAULT_MINOR表示已經處理了頁面錯誤 而沒有阻止當前進程;這種故障稱爲次要故障。 值VM_FAULT_MAJOR表示 的頁故障迫使當前進程睡眠

+0

有一個在一個do_page_fault might_sleep()調用()(毫米/ fault.c)有可能將導致過程中被「搶佔「之後 - 它提交了生物。 – dividebyzero

+1

@dividebyzero no'might_sleep()'標記可能睡眠的函數,我想你正在尋找'cond_resched()' – iabdalkader