web-dev-qa-db-ja.com

スレッドコンテキストスイッチ対。プロセスコンテキストスイッチ

両方の状況で何が正確に行われているのか教えてもらえますか?それぞれの主な費用はいくらですか?

103
Leon

スレッドの切り替えとプロセスの切り替えの主な違いは、スレッドの切り替え中は、プロセスの切り替え中とは異なり、仮想メモリ空​​間は同じままであるということです。どちらのタイプも、コンテキスト切り替えを実行するために、オペレーティングシステムカーネルに制御を引き渡す必要があります。 OSカーネルの切り替えプロセスとレジスタの切り替えコストは、コンテキスト切り替えを実行する最大の固定コストです。

よりファジーなコストは、コンテキストスイッチがプロセッサのキャッシュメカニズムを台無しにすることです。基本的に、コンテキストを切り替えると、プロセッサがキャッシュに「記憶」しているすべてのメモリアドレスが事実上使用できなくなります。ここでの大きな違いの1つは、仮想メモリ空​​間を変更すると、プロセッサのTranslation Lookaside Buffer(TLB)または同等のものがフラッシュされ、メモリアクセスがしばらくの間より高価になることです。これはスレッドの切り替え中には発生しません。

180
Abhay Buch

プロセスコンテキストの切り替えには、メモリアドレス空間の切り替えが含まれます。これには、メモリアドレス、マッピング、ページテーブル、およびカーネルリソースが含まれます。これは比較的高価な操作です。一部のアーキテクチャでは、アドレススペース間で共有できないさまざまなプロセッサキャッシュをフラッシュすることさえ意味します。たとえば、x86はTLBをフラッシュする必要があり、一部のARMプロセッサーはL1キャッシュ全体をフラッシュする必要があります!

スレッドの切り替えとは、同じプロセス内のあるスレッドから別のスレッドへのコンテキスト切り替えです(プロセス間でのスレッドからスレッドへの切り替えは、単にプロセスの切り替えです)。

14
aditya dogra

まず、オペレーティングシステムは発信モードのスレッドをカーネルモードで起動します。これは、まだスレッドモードが実行されていないスレッド間でのみスレッド切り替えを実行できるためです。次に、スケジューラーが呼び出され、切り替え先のスレッドに関する決定が行われます。決定が行われた後、カーネルはCPU(CPUレジスタ)にあるスレッドコンテキストの一部をメモリ内の専用の場所(多くの場合、発信スレッドのカーネルスタックの最上部)に保存します。次に、カーネルは、発信スレッドのカーネルスタックから着信スレッドのカーネルスタックへの切り替えを実行します。その後、カーネルは以前に保存された着信スレッドのコンテキストをメモリからCPUレジスタにロードします。そして最後に、制御をユーザーモードに戻しますが、新しいスレッドのユーザーモードです。着信スレッドがanotherプロセスで実行されるとOSが判断した場合、カーネルは1つの追加ステップを実行します。新しいアクティブな仮想アドレススペースを設定します。

両方のシナリオの主なコストは、キャッシュ汚染に関連しています。ほとんどの場合、発信スレッドで使用されるワーキングセットは、着信スレッドで使用されるワーキングセットとは大きく異なります。その結果、着信スレッドはキャッシュミスの雪崩で寿命を開始し、キャッシュから古い不要なデータをフラッシュし、メモリから新しいデータをロードします。 TLB(CPUにある変換ルックアサイドバッファ)についても同様です。仮想アドレス空間のリセット(スレッドが異なるプロセスで実行される)の場合、仮想アドレス空間のリセットはTLB全体のフラッシュにつながるため、ペナルティはさらに悪化しますeven新しいスレッドが実際に少数の新しいエントリのみをロードする必要がある場合。その結果、新しいスレッドは多くのTLBミスと頻繁なページウォーキングでタイムクォンタムを開始します。スレッドスイッチの直接コストも無視できません(最大250サイクルから最大1500〜2000サイクル)。CPUの複雑さ、スレッドの状態、および実際に使用するレジスタセットに依存します。

追伸:コンテキストスイッチのオーバーヘッドに関する良い投稿: http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html

9
ZarathustrA
  • プロセス切り替え:これは、マルチプログラミング環境のプロセスに常駐する2つのメモリ間の移行です。
  • コンテキスト切り替え:これは、実行中のプログラムから割り込みサービスルーチン(ISR)へのコンテキストの変更です。
3
john

スレッドコンテキストスイッチングでは、プロセスコンテキストスイッチの場合とは異なり、仮想メモリ空​​間は同じままです。また、プロセスコンテキストスイッチは、スレッドコンテキストスイッチよりもコストがかかります。

2
Palak Jain

スレッドコンテキストの切り替えは実行コンテキスト(レジスタ、スタックポインター、プログラムカウンター)を変更する必要がありますが、プロセスコンテキストの切り替えのようにアドレス空間を変更する必要はありません。アドレス空間を切り替えると追加のメモリアクセス(ページング、セグメンテーションなど)が発生し、新しいプロセスを開始または終了するときにTLBをフラッシュする必要があります...

0
Herr Günther

主な違いは、古いタスクと新しいタスクのメモリ記述子を処理するswitch_mm()を呼び出すときだと思います。スレッドの場合、仮想メモリのアドレス空間は変更されないため(スレッドは仮想メモリを共有します)、実行する必要はほとんどないため、コストは低くなります。

0
Dražen G.