は、私が「論理プロセッサ」(NOT物理プロセッサ)と呼ばれるものの中で実行Go in Action
ゴルーチンを読んだ後に理解するものです。これらの論理プロセッサはそれぞれ、単一のOSスレッドにバインドされています。
Go 1.5以降、論理プロセッサーの数は使用可能な物理プロセッサーの数と等しくなります。
ゴー・スケジューラーがインテリジェントにスケジュールこれらの論理プロセッサのそれぞれに複数のゴルーチンの実行
原油図は、次のとおりです。 -
OSのスレッド------論理プロセッサ------ゴルーチン1、Goroutine 2 ..... Goroutine n
ここで、Goroutinesの1人がブロッキングシステムコールを行う可能性が非常に高いです。これが起こるとき、
は、ブロッキング呼び出しを行ったOSのスレッドとゴルーチンはこの論理プロセッサは、今はOSのスレッドを持っていない論理プロセッサから切り離さ
です。
Goスケジューラは、新しいOSスレッドを作成し、それを論理プロセッサに接続します。論理プロセッサに接続された残りのゴルーチンは、引き続き実行されます。
分離されたゴルーチンとそれに関連付けられているOSスレッドがブロックし続け、システムコールが戻るのを待ちます。
システムコールが返ってくると、goroutineは論理プロセッサの1つに再接続され、実行キューに置かれます。
OSスレッドは、「将来使用するために脇に置いてください」です。私はそれが何らかの種類のスレッドプールに追加されていると推測しています。
goroutineがネットワークI/Oコールを行う場合は、わずかに異なる方法で処理されます。
ゴルーチンは、論理プロセッサから切り離され、統合ネットワークポーラーに移動されます。ポーラーがI/O操作の準備ができたら、ゴルーチンは論理プロセッサに再接続されて処理されます。
- 今 、
:-)あなたの質問に答えるために、私は専門家ではないんだけど、これは私が上記されたものに基づいて、どうなると思うものです。
4つのOSスレッドのそれぞれに1つのゴルーチンがブロッキングシステムを作成しているため、4つのスレッドはすべて論理プロセッサから切り離され、システムコールが戻るまでブロックされ続けます。 4つのOSスレッドは、ブロッキングシステムコールを作成したそれぞれのゴルーチンに関連付けられます。
これで、OSスレッドなしで4つの論理プロセッサ(および非ブロッキングのゴルーチンが接続されています)が発生しました。
したがって、GOスケジューラは4つの新しいOSスレッドを作成し、これらのスレッドに論理プロセッサを割り当てます。
-
ビューのOSの観点から、彼らが何をやっていないので、明らかに通話を遮断作っ4つのOSのスレッドは、CPU時間を取ることが許されません。
したがって、選択した他のノンブロッキングスレッドとコンテキストを切り替えます。
スレッドの数に制限はありません。関連する質問を参照してください。[Go実行時に使用されるスレッドの数](http://stackoverflow.com/questions/39245660/number-of-threads-used-by-go-runtime)なぜ、多くのgoroutinesがgolangでファイルを書き込むことでブロックされているのですか?(http://stackoverflow.com/questions/28186361/why-does-it-not-create-many-threads-when-多くのゴルーチンは書き込み中ブロックされています) – icza
ブロック操作はほとんどのプログラムではまれであることに注意してください。ファイルIOは最も一般的ですが、次にcgoが次に呼びますが、これは非常にまれです。 – JimB