回答:
スレッドの切り替えとプロセスの切り替えの主な違いは、スレッドの切り替え中は仮想メモリ空間は同じままですが、プロセスの切り替え中は変わりません。どちらのタイプも、コンテキスト切り替えを実行するために、オペレーティングシステムカーネルに制御を渡す必要があります。OSカーネルの切り替えのプロセスと、レジスタの切り替えのコストは、コンテキスト切り替えを実行する最大の固定コストです。
さらにあいまいなコストは、コンテキストの切り替えがプロセッサのキャッシュメカニズムを混乱させることです。基本的に、コンテキストスイッチを行うと、プロセッサがキャッシュに「記憶」しているすべてのメモリアドレスが事実上役に立たなくなります。ここでの大きな違いの1つは、仮想メモリ空間を変更すると、プロセッサのトランスレーションルックアサイドバッファ(TLB)または同等のものがフラッシュされ、メモリアクセスがしばらくの間はるかに高価になることです。これは、スレッドの切り替え中には発生しません。
プロセスコンテキストの切り替えには、メモリアドレス空間の切り替えが含まれます。これには、メモリアドレス、マッピング、ページテーブル、カーネルリソースなど、比較的コストのかかる操作が含まれます。一部のアーキテクチャでは、アドレス空間間で共有できないさまざまなプロセッサキャッシュをフラッシュすることさえ意味します。たとえば、x86はTLBをフラッシュする必要があり、一部のARMプロセッサはL1キャッシュ全体をフラッシュする必要があります!
スレッドの切り替えは、同じプロセス内のあるスレッドから別のスレッドへのコンテキスト切り替えです(プロセス間でのスレッドからスレッドへの切り替えは、単なるプロセスの切り替えです)。
まず、オペレーティングシステムは、カーネルモードで実行されているスレッド間でのみスレッド切り替えを実行できるため、発信スレッドがカーネルモードにない場合は、それをカーネルモードにします。次に、スケジューラーが呼び出され、切り替え先のスレッドに関する決定が行われます。決定後、カーネルは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