Linux では、コンテキストは CPU コンテキストとも呼ばれます。これは、CPU レジスタやプログラム カウンターなどのタスクを実行する前に CPU が依存する必要がある環境です。コンテキストの切り替えは、最初に以前の CPU コンテキストを変更することです。タスク (つまり、CPU レジスタとプログラム カウンタ) が保存され、新しいタスクのコンテキストがこれらのレジスタとプログラム カウンタにロードされ、最後にプログラム カウンタが指す新しい場所にジャンプして新しいタスクを実行します。
#このチュートリアルの動作環境: linux7.3 システム、Dell G3 コンピューター。
Linux は、同時に実行する CPU の数をはるかに上回るタスクをサポートするマルチタスク オペレーティング システムです。もちろん、これらのタスクは実際に実行されているわけではありません。システムは短時間で順番に CPU を割り当てるため、ユーザーは多数のタスクが同時に実行されているように錯覚します。
各タスクを実行する前に、CPU はタスクがどこにロードされ、どこで実行が開始されるかを認識する必要があります。つまり、システムは事前に CPU レジスタとプログラム カウンタ (プログラム カウンタ、PC) を設定する必要がありますが、非常に高速なメモリ
プログラム カウンタ: CPU によって実行されている命令の位置、または次に実行される命令の位置を保存するために使用されます
要約すると、答えは見つかりました。
私たちが通常話しているコンテキストは、CPU コンテキストとも呼ばれ、CPU が依存する必要がある環境です。 CPU レジスタやプログラム カウンタなどのタスクを実行する前にオンにします。
これは、最初に CPU コンテキスト (つまり、CPU レジスタとプログラム カウンタ) を保存することです。 ) )、新しいタスクのコンテキストをこれらのレジスタとプログラム カウンタにロードし、最後にプログラム カウンタが指す新しい位置にジャンプして新しいタスクを実行します。
2. コンテキスト スイッチングの詳細な紹介
割り込みコンテキストスイッチング #最初に、次の 2 つのコンテキスト スイッチに関連する知識ポイントを理解しましょう
システム コール、プロセス実行状態プロセスの実行状態:
Linux は、プロセスの実行空間を特権レベルに応じて カーネル空間 # と
ユーザー空間# に分割します。これら 2 つの空間で実行されるプロセス状態は、それぞれ カーネル状態
および ユーザー状態 と呼ばれます。
カーネル スペース (リング 0): 最高の権限があり、すべてのリソース (ファイルの読み取り) に直接アクセスできます。 ,)
によって占有されるCPUリソースは上記の通りです。Webサービスは
ユーザー モードからカーネル モードへの移行は、システム コールを通じて完了する必要があります。たとえば、ファイルを表示する場合、開く、読み取り、書き込み、閉じるなどの複数のシステム コールを実行する必要があります。システム コールのプロセスは次のとおりです: # 元のユーザー モード命令の場所を CPU レジスタに保存します; カーネル コードを実行するには、CPU レジスタをカーネル モード命令の新しい位置に更新する必要があり、最後にカーネル タスクを実行するためにカーネル モードにジャンプします。
コンテキストの切り替えを処理しますか? ##現在のプロセスにスリープ関数がある場合、それも一時停止されます; #プロセスにスレッドが 1 つしかない場合、プロセスは次のように考えることができます。スレッドに等しい。 #プロセスに複数のスレッドがある場合、これらのスレッドは親プロセスのリソースを共有します (つまり、仮想メモリやグローバルなどの同じリソースを共有します)変数)。これらのリソースは、コンテキストの切り替え中に変更する必要はありません。 #さらに、スレッドにはスタックやレジスタなどの独自のプライベート データもあり、コンテキストの切り替え中にこれらも保存する必要があります。 要約すると、スレッド コンテキストの切り替えには 2 つの状況があります。リソースが共有されていないため、前後のスレッドは異なるプロセスに属しており、切り替えプロセスはプロセス コンテキストの切り替えと同じです; 前後の 2 つのスレッド仮想メモリは共有されているため、切り替え後は同じプロセスに属しており、切り替え時に仮想メモリなどのリソースは変更されず、スレッドのプライベート データ、レジスタ、およびその他の非共有データのみを切り替える必要があります。 #コンテキスト切り替えを中断しますか? #割り込み処理は、通常のスケジューリングとプロセスの実行を中断します。他のプロセスを中断するときは、プロセスの現在の状態を保存する必要があります。中断が終了した後も、プロセスは元の状態から実行を再開できます。 概要 Tsuna のテスト レポートによると、各コンテキストの切り替えには数十ナノ秒から数マイクロ秒の CPU 時間が必要です。 。 どのシナリオでコンテキスト スイッチングが発生するかに関係なく、次のことを知っておく必要があります。 CPU コンテキスト スイッチングは、次の 1 つです。 Linux システムの正常な動作を保証するコア機能であり、通常の状況では特別な注意を払う必要はありません。 #ただし、過度のコンテキストスイッチングは、レジスタ、カーネルスタック、仮想メモリなどのデータの保存と復元に CPU 時間を消費するため、実際のプロセスが短縮されます。実行時間により、システム全体のパフォーマンスが大幅に低下します。 関連する推奨事項: 「Linux ビデオ チュートリアル 」# #システムコール:
#プロセスの実行が終了し、以前に使用していた CPU が解放され、次の待機タイム スライスがプロセスから取り出されます。準備完了キュー。プロセス;
オペレーティング システムにとって、スレッドは最小の実行単位であり、プロセスは最小のリソース管理単位です。率直に言うと、カーネル内のいわゆるタスク呼び出しは実際にはスレッドによってスケジュールされ、プロセスは仮想メモリやグローバル変数などのリソースをスレッドに提供するだけです。したがって、シーンとプロセスについては、次のように理解できます。
以上がLinuxのコンテキストとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。