sysmon
sysmon ist eine gewöhnliche Funktion, wörtlich übersetzt als Systemüberwachung. Ohne Kommentare umfasst sie nur etwa 200 Zeilen Code. Sie wird während der Boot-Phase des Programms einem separaten Thread zugewiesen und gestartet. Danach überwacht sie kontinuierlich im Hintergrund den Status der Go-Programm-Laufzeitumgebung und reagiert entsprechend. Den Code für diesen Start können Sie in der Funktion runtime.main einsehen:
go
func main() {
...
mp := getg().m
mainStarted = true
systemstack(func() {
newm(sysmon, nil, -1)
})
...
}Die Systemüberwachung selbst ist nur eine for-Schleife. Das Intervall jeder Schleifenrunde beträgt 20 Mikrosekunden. Mit steigendem Leerlaufindex des Programms kann das Intervall auf maximal 10 Millisekunden ansteigen. In jeder Schleifenrunde erledigt sie hauptsächlich folgende Aufgaben:
- Unterstützt die Goroutine-Planung und präemptiert lange laufende Goroutinen
- Überprüft die Speichersituation und entscheidet, ob eine Garbage Collection erforderlich ist
