9

Wenn in Linux ein Prozess versucht, auf eine Seite zuzugreifen, die keine aktuelle physische Zuordnung aufweist (fehlender Seitentabelleneintrag), wird ein Seitenfehler (durch CPU) generiert. Dies führt dazu, dass der Seitenfehlerhandler von Linux aufgerufen wird. Wenn dieser Fehler "major" ist, dh Linux muss die Seite vom Swap-Gerät lesen, muss der Handler in diesem Fall von der tatsächlichen Festplatte lesen. Da das Lesen von einer Festplatte asynchron ist (submit_bio), verursacht dies eine Neuplanung des Prozesses? (Und wachen Sie auf, wenn I/O abgeschlossen ist?)Führt ein Seitenfehler dazu, dass der fehlerhafte Prozess neu geplant wird?

Wenn eine Neuplanung stattfindet, wo ist der Aufruf von "schedule()"? Das Lesen des Codes in mm/swap_state.c gibt mir keine Ahnung, wann (oder falls) das passiert.

Antwort

7

Wenn sich eine Seite nicht im physischen Speicher befindet, blockiert der Prozess, bis die Seite gelesen wird. Ich denke, Sie suchen an der falschen Stelle in der Seitenfehlerbehandlung oder der aufgerufenen Funktion. Es gibt weitere Informationen in section 9.4. "Page Fault Exception Handler" of "Understanding the Linux Kernel" book, ich zitiere:

Die handle_mm_fault() Funktion VM_FAULT_MINOR oder VM_FAULT_MAJOR zurückgibt, wenn es bei der Zuweisung einer neuen Seitenrahmen für den Prozess erfolgreich war. Der Wert VM_FAULT_MINOR gibt an, dass der Seitenfehler verarbeitet wurde, ohne den aktuellen Prozess zu blockieren. Diese Art von Seite Fehler wird als kleiner Fehler bezeichnet. Der Wert gibt an, dass VM_FAULT_MAJOR der Seitenfehler den aktuellen Prozess

+0

Es gibt eine might_sleep() -Aufruf in do_page_fault() (mm/fault.c) zu schlafen gezwungen Vielleicht „vorbelegt werden, dass der Prozess wird dazu führen, "später - Nachdem es die Bio eingereicht hat. – dividebyzero

+1

@dividebyzero no 'might_sleep()' markiert Funktionen, die schlafen könnten, ich denke du suchst nach 'cond_resched()' – iabdalkader

Verwandte Themen