sysmon
sysmon は一般的な関数で、直訳するとシステム監視で、注釈部分を削除すると 200 行ほどのコードです。これはプログラムガイド段階で単独のスレッドが割り当てられて起動され、その後バックグラウンドで継続的に Go プログラム実行時の状態を監視し、それに応じて対応を行います。この起動部分のコードは runtime.main 関数で確認できます。
go
func main() {
...
mp := getg().m
mainStarted = true
systemstack(func() {
newm(sysmon, nil, -1)
})
...
}システム監視自体は 1 つの for ループで、各ループの間隔時間は 20 マイクロ秒で、プログラムのアイドル指数の上昇に伴い、間隔時間は最大で 10 ミリ秒まで上昇します。各ループにおいて、主に以下のいくつかのことを行います。
- コルーチンスケジューリングを補助し、長時間実行されているコルーチンをプリエンプトします
- メモリ状況をチェックし、ガベージコレクションが必要かどうかを判断します
