/ / Wenn eine Goroutine die E / A blockiert, wie erkennt der Scheduler, dass die Blockierung gestoppt wurde? - Multithreading, Go, Nebenläufigkeit

Wenn eine Goroutine E / A blockiert, wie erkennt der Scheduler, dass er nicht mehr blockiert? - Multithreading, Go, Parallelität

Von dem, was ich gelesen habe HierDer Golang-Scheduler ermittelt automatisch, ob eine Goroutine die E / A blockiert, und wechselt automatisch zur Verarbeitung anderer Goroutinen in einem Thread, der nicht blockiert ist.

Ich frage mich, wie der Scheduler dann herausfindet, dass diese Goroutine aufgehört hat, E / A zu blockieren.

Führt es nur von Zeit zu Zeit eine Art Abfrage durch, um zu überprüfen, ob es noch blockiert? Wird ein Hintergrund-Thread ausgeführt, der den Status aller Goroutinen überprüft?


Zum Beispiel, wenn Sie ein HTTP-GET durchführenDie Anforderung in einer Goroutine, die 5 Sekunden brauchte, um eine Antwort zu erhalten, wurde blockiert, während auf die Antwort gewartet wurde, und der Scheduler wechselte zur Verarbeitung einer anderen Goroutine. Nun, wenn der Server eine Antwort zurückgibt, wie kann der Scheduler dann verstehen, dass die Antwort eingetroffen ist und es Zeit ist, zu der Goroutine zurückzukehren, die den GET erstellt hat, damit er das Ergebnis des GET verarbeiten kann?

Antworten:

8 für die Antwort № 1

Alle I / O-Vorgänge müssen über Syscalls ausgeführt werdenWenn Syscalls in Go implementiert sind, 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 beispielsweise ein nicht blockierender Systemaufruf anstelle eines blockierenden Systemaufrufs durchgeführt werden (im Wesentlichen dem Kernel mitteilend: "Bitte tun Sie dies, aber anstatt zu blockieren, bis dies erledigt ist, kehren Sie sofort zurück und lassen Sie es mich später wissen sobald das Ergebnis fertig ist "). Dadurch kann es in der Zwischenzeit weitere Arbeiten ausführen.