あるプロセスから別のプロセスに切り替える方法:コンテキストスイッチのすべて

最終更新: 27·デ·フリオ·デ·2023
コンテキストの変化、プロセス

すでに説明したように、 スレッドの変更に関する記事、この話題に戻ることも重要です 文脈の変化 しかし今回はプロセスに適用します。これにより、マルチタスクソフトウェアを実行しているときにCPUとオペレーティングシステムがどのように連携して動作するかを理解するための、不足している情報が得られます。

プロセスとは何ですか?

タスクマネージャー

コンピューティングでは、 プロセス プロセスとは、プログラムまたはソフトウェアの実行中のインスタンスです。一連の命令を順次実行し、システムリソースにアクセスし、他のプロセスと通信するアクティブなエンティティと考えることができます。プロセスには、プログラムコード、データ、実行スタック、変数などを含む、独自のメモリ空間が割り当てられています。

各プロセス オペレーティングシステムによって作成および管理されますは、メモリ、CPU時間、開いているファイル、入出力デバイスなどのリソースを割り当てます。また、オペレーティングシステムは、プロセスの実行スケジュールと調整も担当し、利用可能なリソースを効率的に利用できるようにします。

各プロセスは独自の状態を持ち、アクティブ(実行中)、待機(イベントによってブロックされている)、サスペンド(一時停止中)、終了(終了)のいずれかになります。プロセスは、プロセス間通信(IPC)などのメカニズムを通じて相互に通信することができ、プロセス間のデータ交換と同期が可能になります。

CPIとは何ですか?

IPC (プロセス間通信) IPCは、オペレーティングシステム内のプロセスが相互に通信し、情報を共有するために使用する一連のメカニズムと技術です。IPCにより、同一コンピュータ上であっても、ネットワークで接続された異なるコンピュータ間でも、プロセス間の通信と連携が可能になります。

CPIは、 並行プログラミング 複数のプロセス間の相互作用と同期を必要とするアプリケーションの作成。プロセス間のデータ交換、アクティビティの同期、タスク調整のための手段を提供します。

利用可能な CPI メカニズムには次のようなものがあります。

  • メッセージキュー: 共有キューを使用してプロセス間でメッセージの送受信を可能にします。
  • 共有メモリ: 複数のプロセスが共通のメモリ領域にアクセスできるようにし、データを迅速かつ効率的に交換できるようにします。
  • ソケット: これらは、TCP/IP またはその他のネットワーク プロトコルを介して異なるマシン上のプロセス間の通信用のネットワーク インターフェイスを提供します。
  • パイプ: プロセス間の一方向通信を可能にし、1 つのプロセスの出力が他のプロセスへの入力としてリダイレクトされます。
  • 同期: セマフォ、ミューテックス、条件変数などの同期メカニズムは、共有リソースへのアクセスを調整し、プロセス間の競合状態を回避するために使用されます。

IPCメカニズムの選択は、アプリケーションの具体的な要件とプロセスが実行される環境によって異なります。各メカニズムには、パフォーマンス、複雑さ、セキュリティの観点から、それぞれ独自の利点と制限があります。

IPC は、プロセス間の通信とコラボレーションを可能にし、複雑なアプリケーションの開発とシステム リソースの効率的な使用を促進するため、並行プログラミングと分散システムの構築において基本的な役割を果たします。

PCB とは何ですか?

プロセスの文脈では、 PCB(プロセス制御ブロック) 実行中のプロセスに関する重要な情報を維持するためにオペレーティングシステムが使用するデータ構造を指します。プロセス制御ブロックとも呼ばれます。

PCBは、 OSの 新しいプロセスが作成され、メインメモリに保存されるときに使用されます。プロセスの状態と管理に関する重要な情報が含まれており、オペレーティングシステムがプロセスの実行を適切に制御および管理できるようにします。

PCB に保存されるデータには次のようなものがあります。

  • プロセス識別: プロセス番号や名前など、プロセスの一意の識別子。
  • プロセスのステータス: プロセスが実行中、待機中、実行準備完了、中断、または終了しているかどうかを示します。
  • メモリ管理情報: プロセスに割り当てられたメモリのサイズ、ベース アドレス、メモリ制限、ページ テーブルなど。
  • リソース管理情報: プロセスによって開かれたファイル、アクセス権限、ファイル記述子などのリスト。
  • プランナー情報: プロセスの優先度、CPU 使用時間、スケジュール、リソース割り当てなど。
  • 制御情報: CPU レジスタ、スタック ポインタ、プログラム カウンタ、ステータス レジスタなどのプロセス コンテキスト データ。
  コマンドを使用して Windows リモート デスクトップを有効にする方法

PCBは、プロセスの状態が変化したり、コンテキストスイッチが発生したりすると、オペレーティングシステムによって継続的に更新されます。プロセスが中断されたり、別のプロセスに切り替えられたりすると、オペレーティングシステムはプロセスの現在の状態をPCBに保存し、次に実行するプロセスの状態を読み込みます。

PCBは、オペレーティングシステムによるプロセスの効率的な管理に不可欠であり、CPUリソースとスケジューリングの適切な制御と調整を可能にします。コンテキストスイッチ操作が行われるたびに、オペレーティングシステムは対応するPCBを参照し、実行中のプロセスに関する必要な情報を取得します。

プロセスとスレッドの違い

たくさん スレッドとプロセス スレッドは、プログラミングとオペレーティングシステムにおけるプログラム実行の分野において重要な概念です。以下に、スレッドとプロセスの主な違いをいくつか示します。

  • 実行コンテキストプロセスは独自の実行コンテキストを持ち、これには独自のメモリ空間、CPUレジスタ、プロセスID、開いているファイル、その他のリソースが含まれます。一方、スレッドはプロセス内で同じ実行コンテキストを共有します。親プロセスと同じメモリ空間、開いているファイル、その他のリソースを共有します。
  • 創造と破壊プロセスはオペレーティングシステムのコールによって生成され、独自のライフサイクルを持ちます。プロセスは独立して生成および破棄できるため、あるプロセスを終了しても他の実行中のプロセスには影響しません。一方、スレッドは既存のプロセス内で生成されます。プロセスは複数のスレッドを持つことができ、スレッドの生成と破棄は親プロセスのコンテキスト内で行われます。
  • 通信と同期プロセスは通常、パイプ、メッセージキュー、共有メモリなどのプロセス間通信(IPC)メカニズムを使用して通信および同期を行います。同じメモリ空間を共有するスレッドは、共有変数または相互排他ロックを使用して直接通信および同期を行うことができます。
  • パフォーマンスと効率: スレッドはリソースを共有し、プロセスよりも作成と破棄のコストが低いため、プロセス内のスレッド間の切り替えは、一般的にプロセス間の切り替えよりも高速で効率的です。そのため、スレッドは同時処理とリソース共有のメリットを享受できる同時実行タスクや並列タスクに適しています。
  • リソース保護スレッドはプロセス内で同じメモリ空間とリソースを共有するため、同じ共有リソースへのアクセスや変更には注意が必要です。競合状態を回避し、共有データの一貫性を確保するには、適切な同期が必要です。一方、プロセスは独自のメモリ空間とリソースを持つため、独立性が高く、リソースの競合が発生しにくくなります。

プロセスコンテキストスイッチとスレッドコンテキストスイッチの違い

スレッドコンテキストスイッチプロセスコンテキストの変更
TCS は、CPU がスレッドの現在の状態を保存し、同じプロセス内の別のスレッドに切り替えるときに発生します。PCS は、オペレーティング システム スケジューラが実行中のプログラムの現在の状態 (PCB 状態を含む) を保存し、別のプログラムに切り替えるときに発生します。
TCS は、CPU が複数のスレッドを同時に処理するのに役立ちます。PCS では、実行のために新しいプログラム状態をロードします。
TCSはメモリアドレス空間の変更を伴いません。プロセッサがアドレス指定するすべてのメモリアドレスは保存されたままです。PCSはメモリアドレス空間のスワップを伴います。プロセッサによってカウントされるすべてのメモリアドレスが空になります。
プロセッサ キャッシュと変換ルックアップ バッファは状態を保持します。プロセッサ キャッシュと TLB がフラッシュされます。
TCSではレジスタとスタックポインタの変更が必要になりますが、アドレス空間の変更コストは発生しません。そのため、より効率的です。PCSはアドレス空間の変更に高いコストがかかるため、効率性が低くなります。
TCS は少し速くて安価です。PCS は比較的遅く、高価です。

シングルスレッドプロセスでは、スレッド自体がプロセス全体を表します。しかし、マルチスレッドプロセスでは、プログラムの実行には異なるスレッド間の切り替えが必要になります。

  • スレッドの変更スレッドスイッチングとは、同一プロセス内のあるスレッドから別のスレッドへ切り替えることです。このタイプのコンテキストスイッチングは、プログラムカウンタ、レジスタ、スタックポインタといった特定のIDとリソースの変更のみを必要とするため、非常に効率的かつ経済的です。あるスレッドから別のスレッドへ切り替えるコストは、カーネルへの出入りにかかるコストとほぼ同等です。
  • プロセスの変更プロセススイッチングとは、あるプロセスから別のプロセスへの切り替えを指します。この場合、現在のプロセスに関連付けられているすべてのリソースを、新しいプロセスに必要なリソースと交換する必要があります。これには、メモリアドレス、ページテーブル、カーネルリソース、プロセッサキャッシュなどのメモリアドレス空間の変更が含まれます。
  電子機器のはんだ付け用スズ合金:種類とそれぞれのケースでどれを使用するか

コンテキストスイッチを実行する方法

見てみましょう 文脈を変える方法 コンピュータシステムでは、まずいくつかの概念を理解する必要があります。

古いプロセッサではコンテキストスイッチに数百ナノ秒かかっていましたが、新しいプロセッサでは数ナノ秒しかかかりません。コンテキストスイッチの影響はプロセッサによって異なり、クロックサイクル単位で測定できます。場合によっては数百、場合によっては千を超えることもあります。コンテキストスイッチには、TLB(Translation Lookaside Buffer)のフラッシュ、複数タスク間のキャッシュ共有、タスクスケジューラの実行など、追加のコストがかかることに留意してください。同一プロセス内の2つのスレッド間のコンテキストスイッチは、異なる2つのプロセス間のコンテキストスイッチよりも高速です。これは、スレッドが同じ仮想メモリマップを共有するためです。そのため、TLBフラッシュは必要ありません。

コンテキストスイッチングとは何ですか?

El コンテキストスイッチコンテキスト スイッチングとは、プロセスの状態を後で復元して再開できるように保存し、以前に保存した別の状態を読み込むプロセスです。これにより、複数のプロセスで 1 つの中央処理装置 (CPU) を共有することができ、マルチプログラミングまたはマルチタスク オペレーティング システムの基本機能です。従来の CPU システムでは、実行中の各プロセスは CPU レジスタを使用してデータを保存し、現在の状態を維持します。ただし、マルチタスク システムでは、オペレーティング システムがプロセスまたはスレッドを切り替えて、複数のプロセスが同時に実行できるようにします。切り替えごとに、オペレーティング システムは現在実行中のプロセスの状態を保存し、次に CPU で実行する次のプロセスの状態を読み込む必要があります。プロセス状態の保存と読み込みを含むこの一連の操作は、コンテキスト スイッチングと呼ばれます。

  WindowsとMacでUSBを暗号化する方法

コンテキスト切り替えコスト:パフォーマンスへの影響

コンテキストスイッチが頻繁に かなりの量のリソースを必要とする ハードウェアはハードウェアであり、オペレーティングシステムの設計の多くは、それらの使用を最適化することに重点を置いています。あるプロセスから別のプロセスへの切り替えには、レジスタやメモリマップの保存と読み込み、テーブルやリストの更新など、さまざまな管理タスクの実行が伴います。コンテキストスイッチの具体的な性質は、システムアーキテクチャ、オペレーティングシステム、そして共有リソースの量によって異なります。同じプロセスに属するスレッドは、互いに連携しない無関係なプロセスとは異なり、多くのリソースを共有します。

たとえば、 Linuxカーネルコンテキストスイッチでは、PCBテーブルに格納されている対応するプロセス制御ブロック(PCB)をカーネルスタックにロードし、新しいプロセスの状態に関する情報を取得します。レジスタ、スタックポインタ、プログラムカウンタなどのCPU状態データに加え、セグメンテーションテーブルやページテーブルなどのメモリ管理情報もロードされます(古いプロセスが新しいプロセスとメモリを共有している場合を除く)。古いプロセスと現在のプロセスが異なるメモリ空間を使用している場合にアドレス変換エラーを防ぐため、トランスレーションルックアサイドバッファ(TLB)をフラッシュする必要があります。これはパフォーマンスに悪影響を及ぼします。ほとんどのコンテキストスイッチ後、TLBが空になり、TLB内のすべてのメモリ参照が失われるためです。

さらに、同様のコンテキストスイッチは、 ユーザースレッド特にグリーンスレッドでは、コンテキストスイッチは一般的に非常に軽量で、最小限のコンテキストのみを保存・復元します。Goにおけるコルーチン間の切り替えのような極端なケースでは、コンテキストスイッチはコルーチンのパフォーマンスと同等であり、サブルーチン呼び出しよりもわずかにコストがかかる程度です。

プロセスの概要

たくさん 必要な手順 コンテキストの変化は次のとおりです。

  1. CPU上で現在実行中のプロセスのコンテキストを保存します。プロセス制御ブロックやその他の重要なフィールドを更新します。
  2. 前のプロセスの制御ブロックを、準備キュー、I/O キューなどの対応するキューに移動します。
  3. 実行する新しいプロセスを選択します。
  4. 選択したプロセスの制御ブロックを更新します。これには、プロセスステータスを「実行中」に更新することも含まれます。
  5. 必要に応じてメモリ管理データ構造を更新します。
  6. 以前実行されていたプロセスがプロセッサにロードされた際に、そのコンテキストを復元します。これは、プロセス制御ブロックとレジスタから以前の値をロードすることで行われます。

例えば Linuxの場合 特に、私が最もよく知っているシステムは次のとおりです。

  1. CPU 上で実行中の現在のプロセスが、中断する必要があるポイントに到達するか、システム コールやハードウェア割り込みなどのコンテキスト スイッチを必要とするイベントが発生します。
  2. オペレーティングシステムカーネルは、CPUレジスタ、スタックポインタ、プログラムカウンタを含む現在のプロセス状態をプロセス制御ブロック(PCB)に保存します。これは、プロセスの状態を保存し、後で再開できるようにするためです。
  3. カーネルは、レディキューから、またはスケジューリングアルゴリズムに従って、次に実行するプロセスを選択します。新しく選択されたプロセスのPCBが更新され、そのステータスが実行中になります。
  4. CPU レジスタとスタック ポインタに PCB に格納されている値をロードするなど、新しいプロセスの環境を設定するために必要なタスクが実行されます。
  5. カーネルは、新しいプロセスのために、セグメンテーション テーブルやページ テーブルなどのメモリ構造を更新します。
  6. 最後に、新しいプロセスのコンテキストが復元され、実行用のCPUが割り当てられます。プロセスは、以前に中断した場所から実行を再開します。

この例は、Linuxのコンテキストスイッチで実際に発生するプロセスを簡略化したものであることに注意してください。実際には、I/Oデバイスやその他のシステムリソースの管理など、より多くのタスクと考慮事項が関係します。さらに、Linuxカーネルは、実行対象のプロセスの選択方法とプロセス間のCPU時間の配分方法を決定する様々なスケジューリングポリシーを実装しています。

スレッド変更の記事と合わせて、これがお役に立てば幸いです。これらのチュートリアルにご興味がありましたら、 詳細はこちら.