萌えハッカーニュースリーダー

2025/05/18 17:03 Understanding the Go Scheduler

出典: https://nghiant3223.github.io/2025/04/15/go-scheduler.html
hakase
博士

やあ、ロボ子。今日のITニュースはGo Schedulerについてじゃ。

roboko
ロボ子

Go Schedulerですか、博士。最近Go言語の人気が高まっていますし、興味深いですね。

hakase
博士

そうじゃろう?Goは並行アプリケーションを作るのに適しておるからの。Goの並行モデルは、goroutineという軽量なユーザースレッドを中心に構築されておる。

roboko
ロボ子

記事によると、Goスケジューラを理解することは、効率的な並行プログラムを作成するために重要だそうですね。

hakase
博士

その通り!初期のGoでは、グローバル実行キューがボトルネックになっておったらしいのじゃ。ロック競合が発生して、パフォーマンスが低下しておったとか。

roboko
ロボ子

各スレッドにローカル実行キューを導入することで、グローバル実行キューのボトルネックを解消したと。

hakase
博士

そうじゃ。さらに、論理プロセッサ(P)の概念を導入して、メモリ消費量を削減し、スチールメカニズムを効率化したのじゃ。

roboko
ロボ子

GMPモデルですね。Goroutine (G)、Thread (M)、Processor (P) の3種類のエンティティがある。

hakase
博士

その通り!`go`キーワードは、`runtime.newproc`関数の糖衣構文で、新しいgoroutineをスケジュールする役割を担っておる。

roboko
ロボ子

`newproc`関数は、goroutineを初期化し、プロセッサの実行キューに入れるんですね。

hakase
博士

そうじゃ。そして、Goランタイムの`schedule`関数は、実行可能なgoroutineを見つけて実行するのじゃ。

roboko
ロボ子

プリエンプションについても書かれていますね。非協調的プリエンプションと協調的プリエンプションの2種類がある。

hakase
博士

ふむ。システムコールが行われる前に、goroutineは実行状態からシステムコール状態に移行し、スレッドとプロセッサの関連付けが一時的に解除されるのじゃ。

roboko
ロボ子

ネットワークI/OとファイルI/Oを効率的に処理するために、ノンブロッキングI/OとI/O多重化を組み合わせているんですね。

hakase
博士

Goは、`select`や`poll`のパフォーマンス制限を回避するために、`epoll`(Linux)、`kqueue`(Darwin)、`IOCP`(Windows)を使用しておる。

roboko
ロボ子

ガベージコレクション(GC)についても触れられていますね。GoのGCは、三色マーキングアルゴリズムを使用し、並行性をサポートすると。

hakase
博士

そうじゃ。Goのガベージコレクションサイクルは、最初のSTW、マーキングフェーズ、2番目のSTW、スイーピングフェーズの4つの段階に分けられるのじゃ。

roboko
ロボ子

`GOMAXPROCS`というAPIも紹介されていますね。Goランタイムのプロセッサ数を設定し、Goプログラムの並列処理のレベルを制御する。

hakase
博士

ふむ。Goスケジューラは、goroutineを通じて軽量な並行処理を可能にする強力で効率的なシステムじゃ。

roboko
ロボ子

Goスケジューラの進化、主要コンポーネント、およびランタイムAPIを理解することで、より効率的で信頼性の高いGoプログラムを作成できる。

hakase
博士

ところでロボ子、Goのプログラムが速すぎて、ロボ子の処理速度が追いつかないときはどうすれば良いかの?

roboko
ロボ子

博士、それは困りますね。もしかして、私のプロセッサ数を`GOMAXROBOKOPROCS`で調整する必要があるかもしれません!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search