Detaillierte Erläuterung des Coroutine-Schedulers in der Go-Sprache
Go-Sprache verfügt über einen effizienten Coroutine-Scheduler, der problemlos gleichzeitige Aufgaben verarbeiten und leistungsstarke Programme implementieren kann. In diesem Artikel werfen wir einen detaillierten Blick auf den Coroutine-Scheduler in der Go-Sprache und untersuchen seine Implementierung, Funktionsweise und Optimierung.
Einführung in Coroutinen
Coroutinen sind Lightweight-Threads oder Benutzermodus-Threads. Es wird vom Programmierer geplant, nicht vom Betriebssystem. Das Merkmal von Coroutinen ist, dass sie nicht präventiv sind, d. h. der Kontext wird nur gewechselt, wenn die Funktion yield() explizit aufgerufen wird. Daher ist der Umschaltaufwand für Coroutinen sehr gering, sie können leicht erstellt und zerstört werden und viele Coroutinen können gleichzeitig ausgeführt werden, um eine gleichzeitige Ausführung von Programmen zu erreichen.
Go-Sprach-Coroutinenmodell
Go-Sprache verwendet das M:N-Coroutinenmodell, dh mehrere Benutzermodus-Threads M, entsprechend der Beziehung mehrerer Threads N auf Systemebene. Dieses Modell nutzt die Vorteile von Multi-Core-CPUs voll aus, reduziert gleichzeitig den Aufwand für den Kontextwechsel und verbessert die Planungsleistung.
M stellt den Betriebssystem-Thread dar, dh den physischen Thread, der die kleinste Einheit der Betriebssystemplanung darstellt. N stellt den virtuellen Thread (Goroutine) im Laufzeitsystem der Go-Sprache (Laufzeit) dar, der die kleinste Einheit zur Erzielung von Parallelität darstellt. N Goroutinen werden M Threads zugeordnet und vom Scheduler zur Laufzeit geplant.
Coroutine-Scheduler
Der Coroutine-Scheduler ist die Kernkomponente im Go-Sprachlaufzeitsystem und für die Verwaltung und Planung mehrerer Coroutinen zur Ausführung von Aufgaben verantwortlich. Es handelt sich um einen High-Level-Scheduler, der die Ausführung und den Wechsel von Coroutinen steuern und die Ebenenplanung von Coroutinen realisieren kann. In der Go-Sprache verwendet der Coroutine-Scheduler eine zusätzliche laufende Entität namens Goroutine, die Ausführungsaufgaben in der Coroutine effizienter umschalten kann.
Prinzip der Implementierung des Coroutine-Schedulers
Das Implementierungsprinzip des Coroutine-Schedulers kann in zwei Ebenen unterteilt werden: Betriebssystemebene und Go-Sprachlaufzeitsystemebene.
Betriebssystemebene
Auf der Betriebssystemebene ordnet der Coroutine-Scheduler zur Laufzeit mehrere Benutzer-Threads mehreren Betriebssystem-Threads zu und nutzt dabei die parallelen Rechenfunktionen von Multi-Core-CPUs.
Die M:N-Architektur im Coroutine-Modell der Go-Sprache, das heißt, M repräsentiert den Betriebssystem-Thread (Maschine), N repräsentiert den virtuellen Thread der Go-Sprache (N, repräsentiert Goroutine) und der Scheduler verwaltet die Planung unter Laufzeit. Die Hauptfunktion des Schedulers besteht darin, in jedem Betriebssystem-Thread eine Planungsaufgabenwarteschlange zu verwalten, die Ausführung von Aufgaben in jedem Thread entsprechend der Priorität der Aufgaben in der Aufgabenwarteschlange und dem Planungsalgorithmus dynamisch zu planen und Thread-Ressourcen zu verwalten.
Go-Sprachlaufzeitsystemebene
Auf der Go-Sprachlaufzeitsystemebene verwendet der Coroutine-Scheduler drei Mechanismen: Scheduler, Scheduler-Warteschlange und P.
Scheduler
Der Coroutine-Scheduler der Go-Sprache wird von einem globalen Scheduler gesteuert, der die Scheduler-Warteschlange, die P-Warteschlange, die Spin-Nummer, den Planungsalgorithmus usw. verwaltet. Der Scheduler verwaltet die Aufgabenausführung in jedem Thread dynamisch, um die Ausführungseffizienz der Coroutine zu optimieren.
Scheduler-Warteschlange
In der Scheduler-Warteschlange zeichnet der Scheduler alle Goroutinen auf, die auf die Planung warten. Wenn der Planer P Goroutine zuweist, sucht er zunächst nach Goroutinen, die auf die Planung in der Warteschlange warten. Wenn sie gefunden werden, werden sie sofort in die lokale Warteschlange von P gestellt. Wenn sie nicht gefunden werden, wird eine neue Goroutine erstellt und in die lokale Warteschlange von P gestellt Warteschlange. In der lokalen Warteschlange von P.
P
P ist ein Prozessor, der zum Ausführen von Goroutine verwendet wird, und die Warteschlange, die er besitzt, ist die lokale Warteschlange. Die Anzahl der P wird durch die Umgebungsvariable GOMAXPROCS gesteuert. Wenn sie nicht festgelegt ist, verwendet das Go-Programm standardmäßig die Anzahl der Kerne der Maschine.
Optimierung des Go-Schedulers
Der Go-Scheduler verfügt über viele Optimierungsstrategien, hier sind einige davon:
- Arbeitsdiebstahl
Wenn alle Goroutinen in einer bestimmten P-Warteschlange blockiert sind, sucht der Go-Scheduler nach Goroutinen in anderen P-Warteschlangen stehlen dann einige und stellen sie zur Ausführung in ihre eigenen Warteschlangen. Diese Strategie gewährleistet eine stabile Last und Lastverteilung für alle Ps.
- Preemption
Goroutine kann während der Ausführung einen Timer für sich selbst einstellen. Wenn die Zeit abgelaufen ist, rufen Sie runtime.Goexit auf, um der Laufzeit mitzuteilen, dass diese Goroutine aktiv geplant werden kann. Der Go-Scheduler verfügt auch über eine Vorkaufsrichtlinie, wenn die Goroutine Goexit nicht aktiv aufruft. Vor Go 1.13 war eine vorzeitige Befreiung nur möglich, wenn GOMAXPROCS 1 war. Es wurde jetzt aktualisiert, um mehr Situationen zu unterstützen.
- Lokale Runqueue
Um den Wettbewerb um Aufgaben zwischen verschiedenen Threads zu verringern, verfügt jeder Thread über eine eigene lokale Warteschlange. Jeder Thread übernimmt zuerst Aufgaben aus der lokalen Warteschlange und führt sie erst aus, wenn die lokale Warteschlange leer ist. Gehen Sie zur globalen Warteschlange, um die Aufgabe zu erhalten.
Zusammenfassung
Der Coroutine-Scheduler ist eine der Schlüsselkomponenten für leistungsstarke Parallelität in der Go-Sprache. Es ist für die Verwaltung und Planung mehrerer Coroutinen zur Ausführung von Aufgaben verantwortlich. Es übernimmt das M:N-Coroutinenmodell und verwendet verschiedene Mechanismen und Algorithmen auf der Ebene des Betriebssystems und des Go-Sprachlaufzeitsystems, um eine effiziente Ausführung und Planung von Coroutinen sicherzustellen. Gleichzeitig verfügt der Go-Scheduler auch über viele Optimierungsstrategien, wie z. B. Coroutine-Preemption, lokale Ausführungswarteschlangen und Task-Stealing, die dazu beitragen können, dass das Programm effizienter ausgeführt wird und die Programmleistung und der Durchsatz verbessert werden.
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Coroutine-Schedulers in der Go-Sprache. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen











Das Problem der Verwendung von RETISTREAM zur Implementierung von Nachrichtenwarteschlangen in der GO -Sprache besteht darin, die Go -Sprache und Redis zu verwenden ...

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Bei der Verwendung von Goland für GO -Sprachentwicklung begegnen viele Entwickler benutzerdefinierte Struktur -Tags ...

Der Unterschied zwischen Stringdruck in GO -Sprache: Der Unterschied in der Wirkung der Verwendung von Println und String () ist in Go ...

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Zwei Möglichkeiten, Strukturen in der GO -Sprache zu definieren: Der Unterschied zwischen VAR- und Typ -Schlüsselwörtern. Bei der Definition von Strukturen sieht die Sprache oft zwei verschiedene Schreibweisen: Erstens ...

Welche Bibliotheken in GO werden von großen Unternehmen oder bekannten Open-Source-Projekten entwickelt? Bei der Programmierung in Go begegnen Entwickler häufig auf einige häufige Bedürfnisse, ...

Warum meldet der DSN bei Verwendung von SQL.Open keinen Fehler? In Go Language, Sql.open ...
