6
Go言語がgoroutinesをどのようにスケジューリングするかについて私は興味があります。チャネル要求とI/O中にのみ切り替わるのか、それとも周期的なコルーチンスイッチングループがあるのでしょうか?ゴルーチン間のコンテキスト切り替えをいつ実行するかを決定しますか?
Go言語がgoroutinesをどのようにスケジューリングするかについて私は興味があります。チャネル要求とI/O中にのみ切り替わるのか、それとも周期的なコルーチンスイッチングループがあるのでしょうか?ゴルーチン間のコンテキスト切り替えをいつ実行するかを決定しますか?
Goにはプリエンプティブスケジューラがまだありませんが、1つはplanned for 1.2です。そうではありませんが、GoはCPUのみの計算中にI/O(メモリからの読み込みは既にレジスタにない場合はI/Oと見なされます)の間だけコンテキストを切り替えません。 Issue 543 - preemptive schedulingで議論を読むことができます。
私が正しく理解していれば、これらのリンクに記載されているものを「プリエンプティブスケジューリング」と呼ぶのは遠すぎます。実際には先制型ではなく、プログラマーにとって目に見えないほど多くの場所に利回りが置かれているということだけです。確かに、それはプログラムをより「並行」にしますが、それでも協調的です。私は特別なVM(Erlangのような)や直接OSサポート(OSスレッド)を使わずにプリエンプティブなマルチタスキングをすることは不可能だと思います。 –
回答を更新してください。私はGoがしばらくの間関数呼び出しで先制できることを聞いたことがあるが、私は確かに分からない。 –