皆さんこんにちは、私の名前はムーチュアンです
1. スレッドモデルとは何ですか?
スレッドの作成、管理、スケジューリングなどに使用される手法をスレッドモデルといいますが、スレッドモデルは一般に内核级线程模型
、、 の 3 種類に分類され、その違いはユーザースレッドとカーネルスレッドの対応関係にあります。レベルのスレッドはアプリケーションによって管理され、カーネルレベルのスレッドはオペレーティング システムによって管理されます。用户级线程模型
两级线程模型
ユーザー スレッドは、CPU によってスケジュールおよび実行される前に、指定されたカーネル スレッドにのみマップされます。以下で紹介する 3 つのスレッド モデルは、ユーザー スレッドをカーネル スレッドにマップする 3 つの方法を指します。
2. 3 スレッドモデル
カーネルレベルのスレッドモデル (1:1)
1 つのユーザー スレッドが 1 つのカーネル スレッドに対応します。これが最も簡単に実装できます。コルーチンのスケジューリングは CPU によって完了します。
アドバンテージ:
実装が最も簡単
複数のコアを利用する機能
プロセス内の 1 つのスレッドがブロックされても、他のスレッドはブロックされず、同じプロセス内の他のスレッドに切り替えて実行を継続できます。
欠点:
コンテキスト切り替えのコストは高く、作成、削除、切り替えはすべて CPU によって完了します (ユーザー スレッドを作成するには、カーネル スレッドを作成してシステム コールを行う必要があります)
ユーザーレベルのスレッドモデル (N: 1)
1 つのプロセス内のすべてのスレッドが 1 つのカーネル スレッドに対応します。
コンテキスト切り替えのコストは低く、コルーチン切り替えはユーザー モードで完了できます。
欠点:
マルチコアを活用できない
コルーチンがブロックされてスレッドがブロックされると、このスレッドの他のコルーチンは実行できなくなります。
2段ネジモデル(M:N)
M 個のスレッドは N 個のカーネル スレッドに対応します
アドバンテージ:
複数のコアを利用する機能
コンテキストスイッチングは安価です
プロセス内の 1 つのスレッドがブロックされた場合、他のスレッドはブロックされず、同じプロセス内の他のスレッドが切り替えられて実行を継続します。
欠点:
実装が最も複雑
3. まとめ
Go が実装しているのは 2 レベル スレッド モデル (M:N)、正確には GMP モデルです。これは 2 レベル スレッド モデルを改良した実装であり、スレッド間のスケジュールをより柔軟に設定できるようになります。
最後に、私のオリジナルの Go インタビュー小冊子の宣伝をさせてください。Go 関連の開発に従事している場合は、コードをスキャンして購入することを歓迎します。現在の購入額は 10 元です。追加のコピーを送信するには、以下の WeChat 支払いのスクリーンショットを追加してください自分が録画した Go インタビューの質問説明ビデオ。
お役に立てましたら、クリックして視聴または転送にご協力ください。公式アカウントのフォローを歓迎します