kubo39's blog

ただの雑記です。

Goのランタイムのはなし

goroutineがシステムコール呼び出しで切り替わってもスレッドがカーネル空間でブロックしてたら意味がないのではという疑問、あるいはGOMAXPROCSがネイティブスレッドの数を制限するという誤解について。

Goランタイムはネイティブスレッドとは別にコンテキストとよばれるコードの実行主体を持っていて、こいつがスケジューリングを担っている。

こいつがあることでgouroutineがシステムコール呼び出しする前にネイティブスレッドを生成し、ローカルでもってるqueueにたまったgoroutineを生成したネイティブスレッド側で実行することで別スレッドでシステムコール呼び出しを待っている状態でコードを実行している状態を実現している。(つまりGoは勝手にネイティブスレッドを作ってる)

runtime.GOMAXPROCSはこのコンテキストの数を指定するものなので、実際に走ってるネイティブスレッドの数 >= GOMAXPROCSとなる。