Linuxはマルチタスクオペレーティングシステムである、それは同時に実行するCPUタスクの数よりもはるかに大きくサポートし、当然のことながら、これらのタスクが実行中で、実際にはありませんが、非常に短い期間でのシステム、彼らはCPUを割り当てるためにターンを取ります、ユーザーに同時に実行されている多くのタスクの錯覚を引き起こしました。
各タスクが実行される前に、CPUはどこタスクをロードするために知っておく必要があり、実行を開始する場所から。言い換えれば、我々は彼にCPUのレジスタとプログラムカウンタを与えるために、事前にシステムを設定する必要があります(プログラムカウンタ、PC)
-
CPUレジスタ:CPU内蔵の容量は小さいですが、高速メモリ
-
プログラムカウンタは:位置指令が実行されたCPUを保存するために使用される、または次の命令は、位置を実行します
要約すると、我々は答えを持っています
コンテキストとは何か:
私たちは、通常、CPUのレジスタとプログラム・カウンタを含め、私たちは環境に依存しなければならない、文脈もCPUが任意のタスクの前に実行されているCPUコンテキストと呼ばれていると言います
コンテキストの切り替え:、最初に一緒に(すなわち、CPUのレジスタとプログラム・カウンタ)タスクの前にCPUのコンテキストを保存し、これらのレジスタとプログラムカウンタに新しいタスクコンテキストをロードし、そして最後にプログラムカウンタの意味の範囲内の新しい位置にジャンプしています新しいタスクを実行します。
コンテキストスイッチの2.詳細
タスクのCPUを実行するために、スイッチによっては、に分けることができ进程上下文切换
、线程上下文切换
、中断上下文切换
2つのコンテキストに関連するスイッチの下方には、まず知識点を理解するシステムコール状態を実行中のプロセス、
状態を実行するプロセス:
特権レベル、空間に実行するプロセスで、Linuxの合わせ内核空间
と用户空间
。両空間で実行されている状態のプロセスが呼ばれ内核态
と用户态
。
-
カーネル空間(リング0):(、ファイルの読み込み)、すべてのリソースに直接アクセスすることができ、最高の権威を持っています
-
......すべてのカーネル処理を、メモリ、IO操作を割り当て、子プロセスを作成します。また、これは頻繁にIO操作は、システムパラメータがハイになるとき、ということを示しています。
-
-
ユーザ空間(リング3):限られたリソースにアクセスすることができ、直接メモリおよび他のハードウェアデバイスにアクセスすることはできません、あなたはシステムコールを通じてカーネルを入力しなければなりません、あなたはこれらの特権のリソースを訪問することができます
-
典型的なユーザ・モード・スペース・プログラムがあります:シェル、データベース、Webサーバ、PHPプログラム、Javaプログラムを......
-
LinuxシステムのCPU topコマンドを表示し、ユーザーが見ることができる場合には2つのシステムに対応するCPUは、ユーザーモードとカーネルモードのリソース占有されています
上記のように、弊社のWebサービスが実行されている用户态
ファイルを読むために必要がある場合、それは関係、IOファイルへの無権利の下でシステムコールを
システムコール:
ユーザーモードからカーネルモードへの移行、それはシステムコールによって行われる必要があります。オープン、読み取り、書き込み、これに近いと:ファイルを表示する場合たとえば、あなたが複数のシステムコールを実行する必要があります。次のようにプロセスのシステムコールは、次のとおりです。
-
CPUに保存された元の命令の位置は、ユーザの状態を登録します。
-
カーネルコードを実行するには、CPUのレジスタは、カーネルモード指示、カーネル状態動作カーネルタスクへの最後のホップの新しい位置に更新する必要があります。
-
システムコールの後、CPUレジスタは、以前に保存したユーザーモードを復元した後、ユーザ空間に切り替え、プロセスの実行を継続する必要があります。
そのため、システムコールのプロセスと、実際には、それは二回CPUのコンテキストスイッチが発生しています。
プロセスのコンテキストスイッチ?
-
プロセスの実行は、それユアーズCPUがリリースされる前に、そのスライスはレディキューから削除された処理時間を待って終了します。
-
プロセスのタイムスライスが消耗している場合、実行するCPUを待っている他のプロセスに切り替えるには、システムを停止します。
-
必要(例えば、メモリ不足など)は、比較的大規模なシステムリソース、プロセスが中断され、この時間は、他のプロセスをスケジューリングするシステムを実行するためのプロセス。
-
より高い優先度のプロセス(システム動作の過程)はタイムスライスが取るされている場合、優先度の高い処理を実行することができることを確認するために、現在のプロセスが中断されます。
-
現在のプロセスがスリープ機能を持っている場合は、彼が中断されます。
スレッドのコンテキストスイッチ?
オペレーティング・システム上で、スレッドは実行の最小単位であり、プロセスは、リソース管理の最小単位です。端的に言えば、いわゆるコアタスクの呼び出しは、実際には、スケジューリングの目的は、糸であり、唯一のスレッドにプロセスはそれほど上の仮想メモリリソース、グローバル変数、およびを提供します。だから、サイトおよびプロセスのために、私たちは理解することができます:
-
プロセスは一つだけのスレッドがある場合、プロセスは、スレッドと同等とみなすことができます。
-
プロセスは、親プロセスのリソースを共有する複数のスレッドがある場合(つまり、同じ仮想メモリリソースおよびグローバル変数などを共有します)。コンテキストスイッチは変更する必要はありませんこれらのリソース。
-
さらに、スレッドがなどのスタックやレジスタなどの独自のプライベートデータを、持っている、これらのコンテキストも保存する必要が切り替わります。
要約、スレッドコンテキストスイッチでは、2つのケースがあります。
-
前とリソースが共有されていないため、2つのスレッドは、異なるプロセスに属し、これだけの切り替えプロセススイッチング同じプロセスのコンテキストで後。
-
前と仮想メモリが共有されているため、2つのスレッドが、同じプロセスにその切り替え、仮想メモリを所属した後、これらのリソースはそのまま残り、データのみを共有していないなど、スレッドプライベートデータ、レジスタを、切り替える必要があります。
割り込みコンテキストの切り替え?
通常のスケジューリングと実行プロセスを中断すると、プロセスを中断します。他のプロセスによって中断された場合、プロセスの現在の状態を保存する必要性は、中断した後、プロセスはまだ元の実行状態から回復することができます。
割り込みコンテキストスイッチングプロセスは、ユーザーモードを必要としません。だから、でも、ユーザによって中断プロセスを中断することは、プロセスの状態にあるように保存と復元ユーザーモード仮想メモリリソースのプロセスを、グローバル変数、およびする必要はありません。割り込みコンテキストは、実際には、唯一のカーネル・モードは、CPUレジスタ、カーネルスタック、ハードウェア割り込みパラメータを含む割り込みサービスルーチンを実行するために必要な状態を含みます。
概要
テストレポートツナによると、各コンテキストスイッチはCPU時間のマイクロ秒に数十ナノ秒を必要とし、この時はまだかなりあります。
どんなにシーンを引き起こしたコンテキストスイッチの種類、あなたが知っている必要があります。
-
CPUコンテキストの切り替え、通常の作業を確実にするために、Linuxシステムのコア機能の一つであり、我々は通常の状況下では、特別な注意を払う必要はありません。
-
しかし、過度のコンテキストスイッチは、実際にシステムの全体的なパフォーマンスの大幅な減少につながる、走るので、時間経過を短縮し、省エネやレジスタ、カーネルスタックおよび仮想メモリやその他のデータを復元する上でCPU時間を消費します。