9

In Linux, quando un processo tenta di accedere a una pagina che non ha un mapping fisico corrente (manca la voce della tabella di pagina), viene generato un errore di pagina (dalla CPU). Questo fa sì che venga richiamato il gestore degli errori di pagina di Linux. Se questo errore è "maggiore", il che significa che Linux deve leggere la pagina dal dispositivo di swap, il gestore deve leggere dal disco reale in questo caso. Poiché la lettura da un disco è asincrona (submit_bio), questo fa sì che il processo riprogramma? (E al risveglio quando l'I/O è completo?)Un errore di pagina provoca la riprogrammazione del processo di errore?

Se si ripianifica, dove è la chiamata a "schedule()"? Leggere il codice in mm/swap_state.c non mi dà la minima idea di quando (o se) questo accade.

risposta

7

Se una pagina non è nella memoria fisica il processo blocca fino a quando la pagina non viene letta, penso che stai cercando nel posto sbagliato la pianificazione dovrebbe essere nel gestore degli errori di pagina o in qualsiasi funzione che chiama. Ci sono più informazioni in section 9.4. "Page Fault Exception Handler" of "Understanding the Linux Kernel" book, cito:

La funzione handle_mm_fault() ritorna VM_FAULT_MINOR o VM_FAULT_MAJOR se è riuscita a assegnazione di una nuova cornice di pagina per il processo . Il valore VM_FAULT_MINOR indica che l'errore di pagina è stato gestito senza bloccare il processo corrente; questo tipo di errore Page è chiamato errore minore. Il valore VM_FAULT_MAJOR indica che l'errore di pagina ha costretto l'attuale processo di dormire

+0

C'è un might_sleep() chiamata a do_page_fault() (mm/fault.c) Forse che farà sì che il processo da "preempted "Più tardi - Dopo che ha presentato la biografia. – dividebyzero

+1

@dividebyzero no 'might_sleep()' contrassegna le funzioni che potrebbero dormire, penso che tu stia cercando 'cond_resched()' – iabdalkader