Goroutine-Ertragspunkte über Systemaufrufe hinaus
In Go-Programmen sind Goroutinen der primäre Mechanismus für Parallelität. Während Systemaufrufe, die eine Goroutine blockieren würden, bekannte Yield-Punkte sind, ist das Verständnis der Goroutine-Planung nicht vollständig, ohne andere mögliche Yield-Punkte zu berücksichtigen.
Ein vermuteter Yield-Punkt sind Funktionsaufrufe, da sie eine Überprüfung des Stacks durch den Scheduler erfordern Wachstum. Es wurde jedoch festgestellt, dass „eine Goroutine den Thread sperrt, bis er beendet wird oder auf etwas trifft, das die Ausführung für andere ermöglichen könnte“, wenn sie nur mathematische Operationen ausführt.
Um dies zu testen, wurde ein Programm erstellt, das ausgeführt wird drei Schleifen (eine in der Hauptfunktion und zwei in separaten Goroutinen) ohne Funktionsaufrufe. Das Programm setzt GOMAXPROCS auf 1 und begrenzt so die Anzahl der Betriebssystem-Threads, die Go-Code gleichzeitig ausführen können. Die Ausgabe zeigt jedoch immer noch verschachtelte Nachrichten von der Hauptfunktion und den Goroutinen, was darauf hindeutet, dass Goroutinen auch ohne Funktionsaufrufe die Kontrolle übernehmen.
Die Antwort auf diese offensichtliche Diskrepanz liegt in der in Go 1.14 eingeführten asynchronen Vorbelegung, die zusätzliches Potenzial bietet Fast überall gibt es Präemptionspunkte. Daher können Goroutinen an verschiedenen Stellen außer dem Blockieren von Systemaufrufen die Kontrolle übernehmen.
Während sich die genaue Implementierung von Preemption-Punkten zwischen Go-Releases ändern kann, stellt die asynchrone Preemption sicher, dass Schleifen ohne Funktionsaufrufe den Scheduler nicht mehr blockieren oder Müll erheblich verzögern Sammlung. Dennoch ist es wichtig zu beachten, dass unsynchronisierte Array-Schreibvorgänge und nicht-atomare Indexaktualisierungen kooperative Planungspunkte einführen können, die sich auf das Programmverhalten auswirken können.
Das obige ist der detaillierte Inhalt vonBieten Goroutinen Kontrolle über Systemaufrufe und Funktionsaufrufe hinaus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!