ランタイム
Go 言語のランタイム(runtime)は Go プログラム実行の核心となるインフラストラクチャで、プログラムのメモリ割り当て、ガベージコレクション、コルーチンスケジューリング、システム監視などの重要な機能を管理する責任を負います。他の言語とは異なり、Go のランタイムはユーザーコードと密接に統合されており、これにより Go は効率的な並行プログラミングと自動メモリ管理を実現できます。
核心コンポーネント
Go ランタイムは主に以下のいくつかの核心コンポーネントで構成されています。
GMP スケジューラ
GMP スケジューラは Go ランタイムで最も核心的なコンポーネントの 1 つで、大量の goroutine を限られたシステムスレッド上で合理的にスケジューリングする責任を負います。GMP はそれぞれ以下を表します。
- G (Goroutine):コルーチン、Go における軽量スレッド
- M (Machine):システムスレッド、オペレーティングシステムレベルの実行スレッド
- P (Processor):プロセッサ、Go コードの実行に必要なリソースを含みます
GMP スケジューラの設計により、Go は成千上万の並行コルーチンを効率的にサポートでき、Go 言語の高並行特性の基盤となっています。
メモリアロケータ
Go のメモリアロケータはヒープメモリの割り当てを管理する責任を負い、その設計は Google TCMalloc の影響を深く受けています。主な特徴は以下の通りです。
- マルチレベルキャッシュ設計により、ロック競合を削減します
- オブジェクトサイズに応じて異なる割り当て戦略を採用します
- オブジェクトがスタック上かヒープ上に割り当てられるかを自動的に決定します
メモリアロケータはガベージコレクターと密接に連携し、効率的なメモリ管理を共同で実現します。
ガベージコレクター
Go は並行マーク&スイープ(Concurrent Mark-Sweep)ガベージコレクションアルゴリズムを採用しており、主な特徴は以下の通りです。
- 三色マークアルゴリズム
- 書き込みバリア技術による並行回収
- 低遅延で、大部分の状況で STW 時間は 100 マイクロ秒未満です
Go のガベージコレクターは多年の最適化を経て、すでに大多数のビジネスシーンのパフォーマンスニーズを満たすことができます。
システムモニタ
システムモニタ(sysmon)は独立した監視スレッドで、以下の責任を負います。
- 長時間実行されているコルーチンをプリエンプトします
- ガベージコレクションのトリガーが必要かどうかをチェックします
- システム状態を監視し、それに応じて調整を行います
これはバックグラウンドで継続的に実行され、Go プログラムの安定した実行を保障します。
学習の提案
以下の順序でランタイムの関連知識を学習することをお勧めします。
- まず GMP スケジューラ を学習し、コルーチンのスケジューリングメカニズムを理解します
- 次に メモリアロケータ を学習し、メモリがどのように割り当てられるかを理解します
- その後 ガベージコレクター を学習し、メモリがどのように回収されるかを理解します
- 最後に システムモニタ を学習し、ランタイムのバックグラウンド監視メカニズムを理解します
