Ich habe das Buch Linux Kernel Development on Chapter Process Scheduling gelesen . Auf Seite 61, Abschnitt Aufwachen , lautet der erste Absatz:
Das Aufwecken erfolgt über wake_up (), wodurch alle in der angegebenen Warteschlange wartenden Aufgaben aktiviert werden . Es ( Q1 : worauf bezieht
it
sich das ?) Ruft try_to_wake_up () auf, wodurch der Status der Aufgabe ( Q2 : welche Aufgabe? Alle aufgeweckten Aufgaben? ) Auf TASK_RUNNING gesetzt wird, und ruft enqueue_task () auf, um die Aufgabe dem rot-schwarzen Baum hinzuzufügen. und setzt need_resched, wenn die Priorität der aufgeweckten Aufgabe höher ist als die Priorität der aktuellen Aufgabe. Der Code, der das Auftreten des Ereignisses verursacht, ruft normalerweise wake_up () selbst auf. Wenn beispielsweise Daten von der Festplatte eingehen, ruft das VFS wake_up () in der Warteschlange auf, in der sich die auf die Daten wartenden Prozesse befinden.
Ich bin ziemlich verwirrt über das Obige. Lassen Sie mich nur das Beispiel im obigen Absatz verwenden, dh die Festplatte wurde nach dem Lesen der Daten unterbrochen, aber mit einem vollständigeren Bild. Bitte korrigieren Sie mich, wenn eine der folgenden Angaben falsch oder unvollständig ist:
Einige Benutzerprozesse haben eine blockierende Leseoperation ausgegeben, die einen Systemaufruf auslöst, und der Prozess befindet sich im Bereich des Kernels.
Der Kernel richtet den Festplattencontroller ein, der die erforderlichen Daten anfordert, und versetzt diesen Prozess in den Ruhezustand (dieser Prozess wird in eine Warteschlange gestellt). Der Kernel plant die Ausführung eines anderen Prozesses.
Festplatteninterrupt tritt auf. Die CPU unterbricht den aktuell ausgeführten Prozess und springt zur Behandlung von Festplatteninterrupts.
Der Festplattencontroller wird irgendwann während der Interrupt-Behandlung aktiviert, um die von der Festplatte gelesenen Daten in den Hauptspeicher zu übertragen (entweder unter der Leitung der CPU oder per DMA).
(Nicht sicher, bitte korrigieren) Wie im Absatz angegeben, ruft VFS wake_up () in der Warteschlange auf, in der die Prozesse auf die Daten warten.
Meine spezifischen Fragen sind folgende:
Q1 (siehe zitierten Absatz): Ich gehe davon aus, dass sich das It im zweiten Satz auf die Funktion bezieht wake_up()
. Warum wake_up
weckt die Funktion alle Aufgaben, anstatt nur die, die auf diese Datenträgerdaten wartet?
F2 (siehe zitierten Absatz): Kennt try_to_wake_up()
irgendwie die spezifische Aufgabe, deren Status auf TASK_RUNNING gesetzt werden muss? Oder try_to_wake_up()
setzt der Status aller aufgeweckten Aufgaben auf TASK_RUNNING?
F3 : Wie viele Warteschlangen muss der Kernel verwalten? Wenn es mehr als zwei solcher Warteschlangen gibt, woher weiß der Kernel, welche Warteschlange er auswählen soll, sodass sich der Prozess, der auf die Datenträgerdaten wartet, in dieser Warteschlange befindet?
F4 : Angenommen, wir kennen die Warteschlange, in der der Wartevorgang läuft. Woher weiß der Kernel, welcher Prozess auf die Daten von der Festplatte wartet? Ich kann mir nur vorstellen, dass einige Informationen, die für den Prozess spezifisch sind, der die Datenträgerdaten anfordert, an den Datenträgercontroller übergeben werden, z. B. die PID, die Speicheradresse des Prozesses oder etwas anderes. Nach Abschluss der Interrupt-Behandlung verwendet der Festplattencontroller (oder Kernel?) Diese Informationen, um den Prozess in der Warteschlange zu lokalisieren.
Bitte helfen Sie mir, dieses Bild des Prozesses wake_up zu vervollständigen! Vielen Dank!