Laufzeitumgebung
Die Laufzeitumgebung (Runtime) der Sprache Go ist die Kerninfrastruktur für die Ausführung von Go-Programmen. Sie ist für die Verwaltung kritischer Funktionen wie Speicherzuweisung, Garbage Collection, Goroutine-Scheduling und Systemüberwachung verantwortlich. Im Gegensatz zu anderen Sprachen ist Go's Runtime eng mit dem Benutzercode integriert, was Go eine effiziente nebenläufige Programmierung und automatische Speicherverwaltung ermöglicht.
Kernkomponenten
Die Go-Runtime besteht hauptsächlich aus folgenden Kernkomponenten:
GMP-Scheduler
Der GMP-Scheduler ist eine der wichtigsten Komponenten der Go-Runtime. Er ist dafür verantwortlich, eine große Anzahl von Goroutinen effizient auf eine begrenzte Anzahl von System-Threads zu verteilen. GMP steht für:
- G (Goroutine): Goroutine, leichtgewichtige Threads in Go
- M (Machine): System-Thread, Ausführungsthread auf Betriebssystemebene
- P (Processor): Prozessor, enthält die für die Ausführung von Go-Code benötigten Ressourcen
Das Design des GMP-Schedulers ermöglicht es Go, Tausende von nebenläufigen Goroutinen effizient zu unterstützen und bildet die Grundlage für die Hochleistungs-Nebenläufigkeit von Go.
Speicherverwaltung
Die Speicherverwaltung von Go ist für die Verwaltung der Heap-Speicherzuweisung zuständig. Das Design ist stark von Google's TCMalloc beeinflusst. Hauptmerkmale sind:
- Mehrstufiges Cache-Design zur Reduzierung von Sperrkonflikten
- Unterschiedliche Zuweisungsstrategien je nach Objektgröße
- Automatische Entscheidung, ob Objekte auf dem Stack oder Heap zugewiesen werden
Die Speicherverwaltung arbeitet eng mit dem Garbage Collector zusammen und realisiert gemeinsam eine effiziente Speicherverwaltung.
Garbage Collector
Go verwendet einen nebenläufigen Mark-and-Sweep-Garbage-Collection-Algorithmus (Concurrent Mark-Sweep). Hauptmerkmale:
- Dreifarbiger Markierungsalgorithmus
- Write-Barrier-Technik für nebenläufige Speicherfreigabe
- Geringe Latenz, STW-Zeit liegt in den meisten Fällen unter 100 Mikrosekunden
Der Garbage Collector von Go wurde über Jahre optimiert und erfüllt nun die Leistungsanforderungen der meisten Anwendungsszenarien.
System-Monitor
Der System-Monitor (sysmon) ist ein unabhängiger Überwachungsthread, der für folgende Aufgaben zuständig ist:
- Präemption von lange laufenden Goroutinen
- Prüfung, ob Garbage Collection ausgelöst werden muss
- Überwachung des Systemstatus und entsprechende Anpassungen
Er läuft kontinuierlich im Hintergrund und gewährleistet den stabilen Betrieb von Go-Programmen.
Lernempfehlungen
Es wird empfohlen, das Wissen über die Laufzeitumgebung in folgender Reihenfolge zu lernen:
- Zuerst den GMP-Scheduler lernen, um den Scheduling-Mechanismus von Goroutinen zu verstehen
- Dann die Speicherverwaltung lernen, um zu verstehen, wie Speicher zugewiesen wird
- Anschließend den Garbage Collector lernen, um zu verstehen, wie Speicher freigegeben wird
- Schließlich den System-Monitor lernen, um die Hintergrundüberwachungsmechanismen der Runtime zu verstehen
