マルチコア プロセッサでは、特定のアプリケーションをシングル コア、2 コア、または 3 コアのいずれかで実行するように指示する方法があります。アプリケーション (多くのスレッドを持つ) が複数のコアで実行されているシナリオを考えると、スケジューラはマルチコア プロセッサの特定のコアの負荷 (スレッド数) をどのように判断し、それに応じて分散 (バランス) できるでしょうか。さまざまなコア間でロード (スレッドの割り当て) ?
2 に答える
ほとんどのスケジューラでは、すべてのCPUは独立したエンティティであり、システムの現在の状態を調べて、実行するのに役立つ何かを見つけようとします。CPUを働き者として想像してください。CPUは常にできることは何でもしようとします。スケジューラーは、CPUに次に何をすべきかを指示する「ボス」ではなく、全員が公平に共有するようにします。むしろ、各CPUは、システムの状態を調べて、可能な限り多くの作業を行う方法を見つけようとするスケジューリングアルゴリズムに従います。
スケジューリングアルゴリズムには「スレッドアフィニティ」のプロビジョニングが含まれている場合があります。これは、CPUが以前にスケジュールされたスレッドを実行することを優先することを意味します。これは、そのスレッドがキャッシュ内にある可能性が高いためです。ただし、ネットワークの負荷分散とはまったく異なり、スケジューリングアルゴリズムは通常(常にではありませんが)、ワークロードが不公平になった場合でも、すべてのCPUを可能な限りビジー状態に保つことに関係しています。
なんで?ワークロードがCPUを集中的に使用する場合、すべてのCPUはほぼ100%で実行でき、ワークロードは公平になります。ワークロードがI/Oに集中し、CPUが共有リソースが利用可能になるのを待つことにほとんどの時間を費やす場合(これは実際のシステムの通常のケースです)、負荷分散戦略は、共有リソースを解放するために単に作業することと対立する可能性があります。できるだけ早く。
単純なマルチCPUスケジューラには、実行可能なスレッドのキューとブロックされたスレッドのリストが含まれます。このキューとリストは、すべてのCPUで共有されるデータ構造であり、アクセスはロックによって保護されます。CPUがスケジューラーに入ると、最も優先度の高い実行可能スレッドを選択し、ブロックまたは割り当てられたタイムスライスが期限切れになるまでそのスレッドを実行します。スレッドがブロックされた場合、再び実行可能になるまで、ブロックされたスレッドのリストに配置されます。タイムスライスの有効期限が切れると、スレッドは実行可能なスレッドキューの遅延位置に配置され、別のスレッドが選択されます。
taskset -c ### ./executable
Linuxでは、####がCPUリストである場所を使用できます