ホームページ > バックエンド開発 > Golang > Go スケジューラはいつ新しい M と P を作成しますか?

Go スケジューラはいつ新しい M と P を作成しますか?

Mary-Kate Olsen
リリース: 2024-10-29 18:39:43
オリジナル
352 人が閲覧しました

When Does the Go Scheduler Create New M and P?

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

Go ランタイム、ゴルーチン、オペレーティング システム スレッド (OS スレッド)、およびコンテキスト/プロセッサ (M と P) が連携して同時実行性を管理します。新しい M および P エンティティがいつ作成されるかを理解することは、効率的なパフォーマンスを実現するために非常に重要です。

M および P の作成

  • M (マシン): M は OS スレッドを表し、ゴルーチンの実行がスケジュールされたときに作成されます。 M の数は、最初に runtime.GOMAXPROCS 環境変数によって設定されます。
  • P (プロセッサ): P はゴルーチンを実行するプロセッサです。各 P は M に関連付けられます。M がブロックされると、その P でゴルーチンを実行するために新しい M が作成されることがあります。

シナリオ分析

Inコード例では、ブロック操作を実行する複数のゴルーチンを作成します。このシナリオでは:

  1. ゴルーチンの最初のバッチは既存の P インスタンスでスケジュールされます。
  2. すべての P のローカル キューがいっぱいの場合、オーバーフローを処理するために新しい M が作成されます。 goroutines.
  3. ただし、ゴルーチンは go func() 内でブロック操作を実行するため、ブロックされたゴルーチンに関連付けられた M は P から削除され、アイドル スレッド プールに置かれます。
  4. New M は、ブロックされた M を置き換えるために作成され、その P でゴルーチンの実行を続行します。

結論

要約すると、Go スケジューラは次の場合に新しい M を作成します。 goroutine が実行されるようにスケジュールされていますが、空き OS スレッドが利用できません。既存の P のローカル キューがいっぱいになると、新しい P が作成されます。ただし、ゴルーチンをブロックする場合、ブロック操作ごとに個別の M が必要となるため、作成される M の数が仮想コアの数を超える可能性があります。

追加リソース

  • [Go ブログの GOMAXPROCS](https://blog.golang.org/GOMAXPROCS)
  • [Go Goroutine、OS スレッド、CPU 管理](https://godoc.org/ runtime/debug#SetMaxThreads)
  • [GMP の基本](https://www.programmersought.com/article/795578​​85527/)

以上がGo スケジューラはいつ新しい M と P を作成しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート