2011-01-24 14 views
15

私は最近OSコースを開始しました。私の知る限り、ディスパッチャーの仕事は、現在のプロセスのコンテキストを保存し、次に実行されるプロセスのコンテキストをロードすることです。しかし、それはどのようにして行われますか?プロセスがプリエンプトされると、ディスパッチャがロードされ実行されると(プログラムでもあるため)、レジスタ内の前のプロセスのコンテキスト、PSWなどが失われます。コンテキストを保存する前に、どうやってコンテキストを保存するのですか?ディスパッチャの仕組みは?

+0

superuser.comに移動しないでください。 –

+6

djechelon:いいえ、私はそうは思わない。これは、OSスケジューラの内部動作に関するものであり、実際にはOSの使用に関するものではありません。 –

答えて

19

単純な答えは、現代のプロセッサーは、ハードウェアでスワップできる複数のレジスタバンクを提供するアーキテクチャー拡張機能を提供しているため、最大X個のタスクが完全なレジスタセットを保持できることです。

もっと複雑な答えは、割り込みによってトリガされたディスパッチャが、割り込み時に実行されていたプログラムの完全なレジスタセットを受け取ることです(プログラムカウンタは、おそらく相互に合意した「揮発性の」登録簿など)。したがって、ディスパッチャはトリガされると最初の動作としてレジスタバンクの現在の状態を格納するよう注意深く書き込まなければならない。要するに、ディスパッチャ自体は即時のコンテキストを持たないため、同じ問題が発生することはありません。

  1. 現在のプロセッサ上で実行されているコンテキストを持つプログラム:ここ

    は、ディスパッチャ呼び出し中に何が起こっの簡単な説明の試みです。レジスタ、プログラムカウンタ、フラグ、スタックベースなどはすべてこのプログラムに適しています。オペレーティングシステム固有の「予約済みレジスタ」などを除いて、ディスパッチャに関する情報はプログラムには何も分かっていません。
  2. ディスパッチャ関数のタイムド割り込みがトリガされます。この時点(バニラアーキテクチャの場合)で発生する唯一のことは、BIOS割り込みのPCアドレスが何であっても、プログラムカウンタがすぐにジャンプすることです。これは、ディスパッチャの「ディスパッチ」サブルーチンの実行を開始する。それ以外のものはそのまま残ります。そのため、ディスパッチャは以前に実行していたプログラムのレジスタ、スタックなどを確認します。
  3. ディスパッチャ(すべてのプログラムと同様)には、現在のレジスタセットで動作する一連の命令があります。これらの命令は、以前に実行していたアプリケーションがすべての状態を残していることを知るように記述されています。ディスパッチャの最初のいくつかの命令は、この状態をどこかのメモリに格納します。
  4. ディスパッチャは、CPUを持つべき次のプログラムが何であるべきかを決定し、以前に格納された状態をすべて取り込み、それにレジスタを埋めます。
  5. ディスパッチャは、CPUのフルコンテキストが確立されているタスクにリストされている適切なPCカウンタにジャンプします。
  6. (上)要約に簡略化する

。ディスパッチャはレジスタを必要とせず、現在のCPU状態を所定のメモリ位置に書き込み、所定のメモリ位置から他のプロセスのCPU状態をロードし、そのプロセスが途絶えたところにジャンプする。それはどんな明確に

していますか?

+0

"割り込みによってトリガされた場合、割り込み時に実行されていたプログラムのフルレジスタセットを受け取ります" ...この情報を送信する何らかのハードウェアサポートがあり、ディスパッチャにはコードがありませんレジスタ値を転送する(mov命令など...)? – Terminal

+0

私の答えを編集して、詳細と明快さを追加しましょう。 –

+0

確かに!それはいい説明だった。 私はまた、paxdiabloが伝えたいものを得ています。:) – Terminal

1

一般に、現在のプロセスに関する情報が失われるような方法で読み込まれることはありません。

多くの場合、現在のプロセスのコンテキストで発生する割り込みです。

したがって、ディスパッチャ(またはスケジューラ)は、次のプロセスの情報をロードする前に、ある種のタスク制御ブロックにすべての関連情報を保存できます。

これには、レジスタの内容、スタックポインタなどが含まれます。

次のプロセスのコンテキストにはディスパッチャの割り込み自体が含まれているため、割り込みから戻ったときには全く異なるプロセスになることに注意してください。

+0

「...ディスパッチャ(またはスケジューラ)は、次のプロセスのためにその情報をアップロードする前に、ある種のタスク制御ブロック内のすべての関連情報を保存することができますので、」それ、私はについて....すべての情報を保存するために疑問を持っているもの、そのPCなどの値をロードする必要があります。誰が以前の値を保管していますか? – Terminal

+0

@ Neo、Linuxを例に挙げてください。直接的または間接的に他のプロセスをフォークする少なくとも1つのプロセスが常に実行されています。 OSは起動時に設定を行い、切り替えが機能するようにします。プロセスが開始および停止されると、スケジューラが問題なく動作するように、プロセスがチェーンに追加されます。 – paxdiablo

+0

ありがとうございました。マークの説明は私にそれについての洞察を与えます。 – Terminal

0

ディスパッチャモジュールは、短期スケジューラによって選択されたプロセスにCPUの制御を与えます。これには、次 は が は、オペレーティングシステムの主要な責任は、プロセスの実行を制御しているプログラムを

0

を再起動するユーザプログラムで適切な場所にジャンプし、ユーザモードへの切り替え、コンテキストを切り替えます。これには、実行のパターンを決定し、プロセスにリソースを割り当てることが含まれます。

プロセスは、2つの状態のいずれであってもよい:

    実行
  1. または
  2. は、OSが新しいプロセスを作成すると、それはのためのプロセス制御ブロックを作成し

を実行していませんそのプロセスをシステムに非実行状態にする。存在するプロセスはOSに認識されており、実行する機会を待っています。

随時、現在実行中のプロセスが中断され、OSのディスパッチャ部分は、実行するためのいくつかの他のプロセスを選択します。プロセスが資源を欠いている実行中

は、それがブロックされます。これらのリソースが準備完了状態に入った後、実行状態に戻ります。この準備状態から実行状態への移行は、ディスパッチャによって行われる。ディスパッチャーがプロセスをディスパッチします。