2016-09-25 5 views
6

この質問があまりにも愚かな場合は謝罪してください。私はゴルーチンの詳細を読んでいたHere。そのページによると、Goroutines are multiplexed onto a small number of OS threads, rather than a 1:1 mappingと言っていましたが、限られた知識しか持たないと思っていましたが、そこにはOSスレッドが限られていて、その中にはユーザスペーススレッドやコルーチンが使われています。これは正しいです?もしそうなら、私が例を挙げると、プログラム内に複数のユーザー空間スレッドが存在する4つのOSスレッドをクローン化し、これらの4つのスレッドの中にブロッキング操作を伴わずに1つのブロッキング操作が発生すると、OSスケジューラは、ユーザスレッドがOSスレッドに対して透過的でないため、これらすべてのスレッドをコンテキスト切り替えしますか?goroutinesにユーザー空間スレッドが含まれている場合、ブロッキング操作でスレッド全体のコンテキスト切り替えが行われる可能性がありますか?

好奇心ではありますが、内部実装を理解するのに役立つ可能性のあるゴルーチンのC実装がありますか?以下は

+3

スレッドの数に制限はありません。関連する質問を参照してください。[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

+1

ブロック操作はほとんどのプログラムではまれであることに注意してください。ファイルIOは最も一般的ですが、次にcgoが次に呼びますが、これは非常にまれです。 – JimB

答えて

2

は、私が「論理プロセッサ」(NOT物理プロセッサ)と呼ばれるものの中で実行Go in Action

ゴルーチンを読んだ後に理解するものです。これらの論理プロセッサはそれぞれ、単一のOSスレッドにバインドされています。

Go 1.5以降、論理プロセッサーの数は使用可能な物理プロセッサーの数と等しくなります。

ゴー・スケジューラーがインテリジェントにスケジュールこれらの論理プロセッサのそれぞれに複数のゴルーチンの実行

原油図は、次のとおりです。 -

OSのスレッド------論理プロセッサ------ゴルーチン1、Goroutine 2 ..... Goroutine n

ここで、Goroutinesの1人がブロッキングシステムコールを行う可能性が非常に高いです。これが起こるとき、

  1. は、ブロッキング呼び出しを行ったOSのスレッドとゴルーチンはこの論理プロセッサは、今はOSのスレッドを持っていない論理プロセッサから切り離さ

    です。

  2. Goスケジューラは、新しいOSスレッドを作成し、それを論理プロセッサに接続します。論理プロセッサに接続された残りのゴルーチンは、引き続き実行されます。

  3. 分離されたゴルーチンとそれに関連付けられているOSスレッドがブロックし続け、システムコールが戻るのを待ちます。

  4. システムコールが返ってくると、goroutineは論理プロセッサの1つに再接続され、実行キューに置かれます。

  5. OSスレッドは、「将来使用するために脇に置いてください」です。私はそれが何らかの種類のスレッドプールに追加されていると推測しています。

goroutineがネットワークI/Oコールを行う場合は、わずかに異なる方法で処理されます。

ゴルーチンは、論理プロセッサから切り離され、統合ネットワークポーラーに移動されます。ポーラーがI/O操作の準備ができたら、ゴルーチンは論理プロセッサに再接続されて処理されます。

- 今 、

:-)あなたの質問に答えるために、私は専門家ではないんだけど、これは私が上記されたものに基づいて、どうなると思うものです。

4つのOSスレッドのそれぞれに1つのゴルーチンがブロッキングシステムを作成しているため、4つのスレッドはすべて論理プロセッサから切り離され、システムコールが戻るまでブロックされ続けます。 4つのOSスレッドは、ブロッキングシステムコールを作成したそれぞれのゴルーチンに関連付けられます。

これで、OSスレッドなしで4つの論理プロセッサ(および非ブロッキングのゴルーチンが接続されています)が発生しました。

したがって、GOスケジューラは4つの新しいOSスレッドを作成し、これらのスレッドに論理プロセッサを割り当てます。

-

ビューのOSの観点から、彼らが何をやっていないので、明らかに通話を遮断作っ4つのOSのスレッドは、CPU時間を取ることが許されません。

したがって、選択した他のノンブロッキングスレッドとコンテキストを切り替えます。

+0

ありがとう@kkaosninja。だから、この論理プロセッサはOSスレッドとどう違うのでしょうか?基礎となるシステムがOSスレッドマッピングのユーザー空間スレッドである場合、なぜ論理プロセッサの概念はまったく必要ですか?プログラムがこの論理プロセッサーの概念をユーザー空間から作成しなければならない場合、どのようにしてそれが行われますか?理解のために使用できるC実装がありますか? – nohup

+1

ここでの最良の答えは、論理プロセッサが非常にうまく=> http://www.tomshardware.com/answers/id-1850932/difference-physical-core-logical-core.htmlを説明しています。また、Go 1.5から、コンパイラとランタイムは完全にGoに書かれました。したがって、Cソースコードが必要な場合は、Go 1.4以降のソースを参照する必要があります。 – kkaosninja

関連する問題