Wenn asynchrone E / A ausgeführt werden, wie ermittelt der Kernel, ob eine E / A-Operation abgeschlossen ist?

Einige Hintergründe, warum ich das frage. Ich habe diese Frage vor ein paar Stunden gestellt

Wie erkennt der Scheduler, wenn eine Goroutine die E / A blockiert, dass die Blockierung gestoppt wurde?

was hatte die Antwort

Alle E / A-Vorgänge müssen über Syscalls ausgeführt werden. Bei der Implementierung von Syscalls in Go werden sie immer über Code aufgerufen, der von der Laufzeit gesteuert wird. Dies bedeutet, dass wenn Sie einen Syscall aufrufen, anstatt ihn direkt aufzurufen (wodurch die Kontrolle über den Thread an den Kernel übergeben wird), die Laufzeit über den Syscall informiert wird, den Sie ausführen möchten, und dies im Auftrag der Goroutine. Auf diese Weise kann es beispielsweise einen nicht blockierenden Systemaufruf ausführen, anstatt einen blockierenden (im Wesentlichen dem Kernel mitteilend). Bitte tun Sie dies, aber anstatt zu blockieren, bis es erledigt ist, kehren Sie sofort zurück und teilen Sie mir das Ergebnis später mit ist bereit"). Dadurch kann es in der Zwischenzeit andere Arbeiten ausführen.

So nach meinem Verständnis ist das, was der Golang-Scheduler tut, dass er sicherstellt, dass er nicht aufhängt, wenn er Zeit mit Threads verbringt, die auf I / O-Operationen warten. Stattdessen wird diese Verantwortung irgendwie auf den Kernel übertragen.

Ich möchte jedoch ein tieferes Verständnis des Prozesses erlangen, da viele Dinge für mich unklar sind.

Right jetzt ist dies mein Verständnis, das möglicherweise völlig falsch ist.

E / A-Anforderung erstellen, z. B. eine GET-Anforderung an einen Remote-Server in goroutineGolang führt einen Syscall durch, um einen TCP-Stream zu lesen. Dies ist eine blockierende Operation. Statt zu warten, wird der Kernel aufgefordert, benachrichtigt zu werden, wenn er die Informationen erhalten hat. Der Scheduler entfernt diese blockierende Goroutine aus seiner WarteschlangeWenn der Kernel alle Informationen erhält, die er an den Go-Prozess weiterleitet, teilt er dem Scheduler mit, dass er die Goroutine wieder in seine Warteschlange aufnehmen kann.

Was ich nicht verstehen kann, ist, wie die E / A-Operation ausgeführt wird, ohne einen weiteren Thread zu erstellen, und wie der Kernel die E / A-Operation tatsächlich "kennt". Ist es durch Abfrage oder gibt es eine Art Interrupt-System?

Ich hoffe, das ergibt einen gewissen Sinn. Ich bin sehr neu in Konzepten, die dieses niedrige Niveau sind.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage