ホームページ >バックエンド開発 >Golang >Go ルーチンがブロック操作を実行するときに、Go スケジューラはどのようにして新しい M と P を作成しますか?

Go ルーチンがブロック操作を実行するときに、Go スケジューラはどのようにして新しい M と P を作成しますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-30 02:18:28500ブラウズ

How Does the Go Scheduler Create New M and P When Goroutines Perform Blocking Operations?

Go スケジューラが GMP モデルに新しい M と P を作成するとき

Go の GMP (Goroutine、Machine、Processor) モデルでは、スケジューラ特定の条件に基づいて M (マシン) と P (プロセッサ) の作成を管理します。

M 作成

M は、次のような特定のイベントに応答して作成されます。

  • ブロック操作: ゴルーチンがブロック操作 (I/O、syscall など) を実行すると、そのゴルーチンに関連付けられた M がブロックされます。ゴルーチンの実行を続けるために、スケジューラは新しい M を作成します。
  • パイプラインのスケジュール: 実行を待機しているゴルーチンを格納するグローバル G キューに、使用可能な M の数より多くのゴ​​ルーチンがある場合

P Creation

P は、GOMAXPROCS 環境変数に基づいてプログラムの起動時に作成されます。使用可能な P の最大数。デフォルト値は、システム上の論理 CPU の数です。

分析例

サンプル コードには、ゴルーチンの 2 つのバッチがあります。データベース操作を実行しています。各ゴルーチンはブロッキング I/O 操作を実行します。

  • 最初のバッチ: スケジューラは、最初のバッチを実行するために 8 M (仮想コアが 8 つあるため) と 1 P を作成します。ゴルーチンの。各 M は P のローカル キューからゴルーチンを実行します。
  • 第 2 バッチ: ブロック操作により最初の M がブロックされるため、スケジューラーは残りのゴルーチンに対して新しい M を作成します。 2番目のバッチで。 P の数が 1 のままであっても、M は新しい P に関連付けられます。

したがって、あなたの場合、スケジューラはゴルーチンの 2 番目のバッチに 8 M を超える M を作成します。操作がブロックされています。 P は GOMAXPROCS 値に基づいて 1 に制限されますが、M は必要に応じて動的に作成されます。

追加リソース

さらに理解するには、次を参照してください。リソース:

  • https://www.programmersought.com/article/795578​​85527/
  • https://blog.golang.org/go-goroutine-os-thread-and -cpu-management

以上がGo ルーチンがブロック操作を実行するときに、Go スケジューラはどのようにして新しい M と P を作成しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。