Linux は 1 対 1 のスレッド モデルを使用しており、ユーザー スレッドの切り替えとカーネル スレッドの切り替えの違いは非常に小さいです。同時に、ユーザーがユーザースレッドの実行権を自発的に放棄することによって生じるオーバーヘッド(yield)を無視すると、カーネルスレッドの切り替えのオーバーヘッドのみを考慮する必要があります。 (推奨学習: linux チュートリアル )
## 注意 これは単純化を理解するためだけであることに注意してください。実際、ユーザー スレッド ライブラリはユーザー スレッドのスケジューリングと同期において多くの作業を行うため、このコストは無視できません。 たとえば、JVM は Thread#yield() について説明します。基盤となる OS が yield のセマンティクスをサポートしていない場合、JVM はタイム スライスの終わりまでユーザー スレッドをスピンさせ、スレッドは同様の効果を得るために受動的に切り替えることもできます。 #スレッド切り替えの原因#タイム スライスのローテーション#スレッド ブロック
#スレッドが積極的にタイム スライスを放棄する直接オーバーヘッド
直接オーバーヘッドはスレッドの切り替え自体によって発生しますが、これは避けられないものです。ユーザー モードとカーネル モードの切り替え
スレッドの切り替えはカーネル モードでのみ完了できます。現在のユーザーがユーザー モードの場合、必然的に競合が発生します。ユーザーモードとカーネルモードを切り替えます。 (「ユーザー モードとカーネル モードの切り替え」の具体的なコストはどれくらいですか????)コンテキスト切り替え
前述したように、スレッド(またはプロセス)の情報をtask_structで保存する必要があるため、スレッドを切り替える際には古いスレッドのtask_structをカーネルから切り出し、新しいスレッドを割り込む必要があります。コンテキストスイッチについて。また、レジスタ、プログラムカウンタ、スレッドスタック(演算スタック、データスタックを含む)などの切り替えも必要となります。スレッド スケジューリング アルゴリズム
スレッド スケジューリング アルゴリズムは、スレッドの状態や待機状況などを管理する必要があります。優先度に従ってスケジュールされている場合は、それを維持する必要もあります。優先キュー。スレッドの切り替えが頻繁に行われる場合、このコストは過小評価できません。間接オーバーヘッド
間接オーバーヘッドは直接オーバーヘッドの副作用であり、システム実装とユーザー コード実装に依存します。キャッシュが見つかりません
切り替えプロセスには新しいロジックの実行が必要です。 2 つがアクセスするアドレス空間が類似していない場合、キャッシュ ミスが発生しますが、具体的な影響はシステムの実装とユーザー コードの実装によって異なります。システムのキャッシュが大きい場合、キャッシュ ミスの影響は軽減されます。ユーザー スレッドがデータにアクセスするアドレス空間が互いに近い場合、キャッシュ ミス率自体も比較的低くなります。以上がLinux 環境では、どのような操作によってスレッド切り替えが発生する可能性がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。