スレッドコンテキストスイッチとの比較。プロセスコンテキストスイッチ


回答:


204

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

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


8
これはすべて、TLBとキャッシュが各エントリのpidを格納しないことを前提としています。
dramzy 2016年

2
:IMHOの@dramzyは右、OSはすぐにここで言及された迅速なコンテキストの切り替えサポートすることが可能であるyoutu.be/3akTtCu_F_k?t=46m8s(仮想メモリ、ページテーブルとTLBについてもっと知るために最初から時計を)。
piotrwest

@piotrwestメインストリームOSのいずれかが高速コンテキスト切り替えをサポートしていますか?
最大

2
@dramzy OSまたはハードウェアがpidを格納できるということですか?で、これは関連しますか?
最大

Linuxにはスレッドスイッチしかありません(確かではありません)。そのため、Linux OSは、実行される次のスレッドに、スケジュールされている実行中のスレッドの保存pidがあるかどうかをチェックしますか?
roachsinai

16

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

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


13

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

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

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


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

2

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


0

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


0

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


-1

つまり、スレッドコンテキストスイッチは、まったく新しいメモリとpidのセットを割り当てず、同じプロセス内で実行されているため、親と同じものを使用します。プロセスが新しいプロセスを生成し、新しいmemとpidを割り当てます。

もっとすごいです。彼らはそれに本を書きました。

コストについては、すべてのスタックカウンターなどをリセットする必要があるため、プロセスコンテキストスイッチ>>>>スレッド。


-1

OSが実行するCPUにいくつかの高遅延デバイスが接続されていると仮定すると、

プロセスのアドレススペースの別のスレッドを実行することは理にかなっていますが、待ち時間の長いデバイスは応答します。

しかし、高レイテンシデバイスがテーブルのセットアップ+新しいプロセスのための仮想メモリから物理メモリへの変換を行うのに必要な時間よりも速く応答している場合、スイッチがまったく必要かどうかは疑問です。

また、HOTキャッシュ(プロセス/スレッドの実行に必要なデータに短時間で到達できる)の方が適しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.