3

2つの物理x86/amd64プロセッサ(P0 + P1)を備えたWindowsオペレーティングシステムで、それぞれ2つのスレッド(T0 + T1)を持つ2つのプロセス(A + B)を実行すると、次のことがわかります(または一般的です)。

P0:A:T0同時に実行P1:B:T0

次に、1(またはその2?)コンテキストスイッチの後

P0:B:T1同時に実行P1:A:T1

一言で言えば、マルチプロセッサマシンでは、オペレーティングシステムが、他のプロセスの他のスレッドがすでに実行されているかどうかに関係なく、いつでも任意のプロセスからのスレッドを自由にスケジュールできるかどうかを知りたいです。

編集: ばかげた例を明確にするために、プロセスAのスレッドA:T0がプロセッサP0(およびA:T1からP1)に親和性があり、プロセスBのスレッドB:T0がプロセッサP1(およびB:T1からP0)に親和性があると想像してください。 )。これらのプロセッサがコアであるかソケットであるかはおそらく問題ではありません。

プロセスコンテキストスイッチのファーストクラスの概念はありますか?Perfmonは、Threadオブジェクトの下にコンテキストスイッチを表示しますが、Processオブジェクトの下には何も表示しません。

4

2 に答える 2

6

はい、それは可能であり、それはかなり頻繁に起こります。
OS、CPU間で1つのスレッドを切り替えないようにします(スレッドの優先プロセッサの設定をより難しくするか、アフィニティを介して単一のプロセッサにロックすることもできます)。
Windowsのプロセスは、それ自体が実行ユニットではありません。この観点からすると、基本的にはスレッドのコンテキストにすぎません。

編集(さらなる説明)

「プロセスコンテキストスイッチ」のようなものはありません。基本的に、OSスケジューラは、プロセスに関係なく、「以前の」プロセッサがすぐに利用できない場合(アフィニティが許す限り)、(非常に適応性のある)ラウンドロビンアルゴリズムを介してスレッドを任意の空きプロセッサ/コアに割り当てます(つまり、マルチスレッドプロセスは、はるかに多くのCPUパワーを盗む可能性があります)。

この「ジャンプ」は、少なくともL1(場合によってはL2)キャッシュがコアごと(異なるスロット/パッケージプロセッサを除く)であることを考えると、コストがかかるように見えるかもしれませんが、「適切な」プロセッサを待機して機能しなくなることによる遅延よりも安価です。精巧な負荷分散を行うため(「ジャンプ」スキームによって可能になります)。
これはNUMAアーキテクチャには当てはまらないかもしれませんが、さらに多くの考慮事項があります(たとえば、すべてのメモリ割り当てをスレッドおよびプロセッサにバインドするように適合させ、可能な限り多くの状態/メモリ共有を回避する)。

アフィニティについて:スレッドごとまたはプロセスごとにアフィニティマスクを設定できますが(これはすべてのプロセスのスレッドの設定に優先します)、OSはスレッドごとに関連付けられた論理プロセッサを少なくとも1つ強制します(マスクがゼロになることはありません)。

プロセスのデフォルトのアフィニティマスクはその親プロセスから継承され(これにより、問題のあるレガシー実行可能ファイル用のシングルコアローダーを作成できます)、スレッドはそれらが属するプロセスからマスクを継承します。

プロセスのアフィニティー外のプロセッサーにスレッドアフィニティーを設定することはできませんが、それをさらに制限することはできます。

デフォルトでは、スレッドは使用可能な論理プロセッサ間ジャンプし(特に、生成したり、カーネルを呼び出したりする場合)、優先プロセッサが設定されている場合でもジャンプする可能性がありますが、必要な場合に限ります、アフィニティマスク外のプロセッサ(かなりの遅延が発生する可能性があります)。

スケジューラーが物理プロセッサーとハイパースレッディングプロセッサーの違いを認識しているかどうかはわかりませんが、そうでない場合でも(私が推測しているように)、結果はほとんどの場合問題になりません。つまり、大きな違いはないはずです。スレッド数がまったく同じである場合、物理プロセッサまたは論理プロセッサを共有する複数のスレッド間。とにかく、このシナリオでは、主にSQLサーバーや.NETやJava VMなどの高性能で高度にマルチスレッド化されたアプリケーションでキャッシュスラッシングが発生するという報告いくつかあります。これらのアプリケーションは、ハイパースレッディングをオフにすることでメリットが得られる場合と得られない場合があります

于 2010-06-04T11:26:58.890 に答える
2

私は一般的に前の答えに同意しますが、物事はもっと複雑です。

プロセスは実行ユニットではありませんが、同じプロセスに属するスレッドは異なる方法で処理する必要があります。これには2つの理由があります。

  1. 同じアドレス空間。手段-このようなスレッド間でコンテキストを切り替える場合、アドレス変換レジスタを設定する必要はありません。
  2. 同じプロセスのスレッドは、同じメモリにアクセスする可能性がはるかに高くなります。

(2)は、キャッシュの状態に大きな影響を与えます。スレッドが同じメモリ位置を読み取る場合、スレッドはL2キャッシュを再利用するため、全体が高速化されます。ただし、欠点もあります。スレッドがメモリの場所を変更すると、そのアドレスは両方のプロセッサのL2キャッシュとL2キャッシュの両方で無効になるため、他のプロセッサもそのキャッシュを無効にします。

したがって、同じプロセスのスレッドを同時に(異なるプロセッサで)実行することには賛否両論があります。ところで、この状況には「ギャングスケジューリング」という名前があります。

于 2010-06-04T23:34:33.703 に答える