golang GMP モデルを学習したところ、ゴルーチン、オペレーティング システムのスレッド、golang コンテキスト/プロセッサがどのように連携するのか理解できました。しかし、MとPがいつ生成されるのかはまだわかりません。
たとえば、データベース上でいくつかの操作を実行するテスト コードがあり、2 つのテスト ケース (ゴルーチンの 2 つのバッチ) があります。
リーリー私の理解では、M は必要なときに作成されます。ゴルーチンの最初のバッチでは、8 (マシン上の仮想コアの数) のオペレーティング システム スレッドが作成されます。2 番目のバッチでは、新しいスレッドを作成せずに、これらの 8 つのオペレーティング システム スレッドのみが再利用されます。これは正しいです?
このトピックに関するその他の資料やブログを提供していただければ幸いです。
M は、プロセスがブロックされていない場合、またはシステム コールを行わない場合にのみ再利用できます。あなたの場合、go func()
にブロックタスクがあります。したがって、M の数は 8 (私のマシン上の仮想コアの数) に制限されません。最初のバッチはブロックして P から削除し、P に関連付けられた新しい M が作成される間、ブロック プロセスが完了するのを待ちます。
詳細については以下を参照してください。
以上がGo スケジューラはいつ新しい M と P を作成しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。