Heim > Artikel > Backend-Entwicklung > Auf Wiedersehen, Go-Interviewer: GMP-Modell, warum gibt es P?
Der heutige Protagonist ist eine Erweiterungsfrage (Frage) der Allzweck-GMP-Modellfrage im Go-Interview, nämlich „GMP-Modell, warum braucht es P?“
Weitere Einblicke in den Hintergrund Der Kern der Frage besteht in diesem Interview darin, zu fragen: „Warum können G und M im GMP-Modell nicht direkt gebunden werden? Das ist so problematisch. Warum ist es so problematisch? Welches Problem ist das?“ Versuchen Sie es zu lösen?
GM-Modellstatic void schedule(G *gp) { ... schedlock(); if(gp != nil) { ... switch(gp->status){ case Grunnable: case Gdead: // Shouldn't have been running! runtime·throw("bad gp->status in sched"); case Grunning: gp->status = Grunnable; gput(gp); break; } gp = nextgandunlock(); gp->readyonstop = 0; gp->status = Grunning; m->curg = gp; gp->m = m; ... runtime·gogo(&gp->sched, 0); }
schedlock
方法来获取全局锁。gput
方法来保存当前 Goroutine 的运行状态等信息,以便于后续的使用。nextgandunlock
方法来寻找下一个可运行 Goroutine,并且释放全局锁给其他调度使用。runtime·gogo
Durch die Analyse des Scheduler-Quellcodes von Go1.0.1 können wir einen interessanten Punkt finden. Das ist der Scheduler selbst (Schedule-Methode), der bei normalen Prozessen nicht zurückkehrt, das heißt, er beendet den Hauptprozess nicht.
🎜🎜🎜G-M-Modelldiagramm🎜🎜🎜 Nachdem GoroutineA abgeschlossen ist, beginnt es mit der Suche nach GoroutineB. Wenn B gefunden wird, wird das abgeschlossene Planungsrecht von A an B übergeben beginnt mit dem Scheduling, also dem Laufen. 🎜🎜Natürlich gibt es auch Gs, die blockiert (Blocked) sind. Angenommen, G führt einige System- oder Netzwerkaufrufe durch, die dazu führen, dass G ins Stocken gerät. Zu diesem Zeitpunkt wird M (System-Thread) wieder in die Kernel-Warteschlange gestellt und wartet auf eine neue Aktivierungsrunde. 🎜🎜🎜🎜Nachteile des GM-Modells🎜🎜🎜🎜Oberflächlich betrachtet scheint das GM-Modell unzerstörbar und makellos zu sein. Aber warum sollte man es ändern? 🎜🎜Im Jahr 2012 veröffentlichte Dmitry Vyukov den Artikel „Scalable Go Scheduler Design Doc“, der immer noch das Hauptziel wichtiger Forschungsartikel zum Go Scheduler ist. Er beschrieb die allgemeinen Gründe und Überlegungen im Artikel . 🎜Der aktuelle Goroutine-Scheduler (bezogen auf das GM-Modell von Go 1.0) schränkt die Skalierbarkeit gleichzeitiger, in Go geschriebener Programme ein, insbesondere Server mit hohem Durchsatz und parallele Rechenprogramme.
Die Implementierung weist die folgenden Probleme auf:
Um viele der oben genannten Probleme des GM-Modells zu lösen, fügte Dmitry Vyukov in Go1.1 eine neue P-Komponente (Prozessor) basierend auf dem GM-Modell hinzu. Und den Work Stealing-Algorithmus implementiert, um einige neu entstandene Probleme zu lösen.
GMP-Modell, im vorherigen Artikel „Go-Gruppe“ fragten Freunde: Wie viele Goroutinen sollten angemessen gesteuert werden? Wird sich dies auf GC und Planung auswirken? wurde in „“ erklärt.
Freunde, die es gut finden, können darauf achten, ich werde es hier nicht wiederholen.
Welche Veränderungen wird es mit sich bringen, nachdem P hinzugefügt wurde? Lassen Sie uns ausführlicher darüber sprechen.
Jedes P verfügt über eine eigene lokale Warteschlange, wodurch die direkte Abhängigkeit von der globalen Warteschlange erheblich verringert wird. Das Ergebnis ist eine Verringerung des Sperrwettbewerbs. Der Großteil des Leistungsaufwands des GM-Modells ist auf die Sperrkonkurrenz zurückzuführen.
Auf der relativen Bilanz jedes P wird der Work Stealing-Algorithmus auch im GMP-Modell implementiert. Wenn die lokale Warteschlange von P leer ist, wird das ausführbare G aus der globalen Warteschlange oder der lokalen Warteschlange von gestohlen andere P zu betreiben, was den Leerlauf reduziert und die Ressourcennutzung verbessert.
In Kombination mit der Positionierung von M (Systemgewinde) treten in diesem Fall die folgenden Probleme auf.
Im Allgemeinen ist die Anzahl von M größer als die von P. Wie in Go beträgt die maximale Anzahl von M 10.000, und die Standardanzahl von P ist die Anzahl der CPU-Kerne. Darüber hinaus steigt M aufgrund der Eigenschaften von M weiter an, wenn es einen Systemblockierungsaufruf gibt, der M blockiert und nicht ausreicht.Das obige ist der detaillierte Inhalt vonAuf Wiedersehen, Go-Interviewer: GMP-Modell, warum gibt es P?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!