web-dev-qa-db-ja.com

コーディネーターはどのように機能しますか?

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

17
Terminal

簡単な答えは、最新のプロセッサは、ハードウェアで交換できるレジスタのいくつかのバンクを提供するアーキテクチャ拡張を提供するため、最大X個のタスクがレジスタの完全なセットを保持できるということです。

より複雑な答えは、ディスパッチャが割り込みによってトリガーされると、割り込み時に実行されていたプログラムの完全なレジスタセットを受信することです(プログラムカウンタは例外で、おそらく相互に合意したものを介して伝播されます。 'volatile'レジスタなど)。したがって、ディスパッチャは、トリガーされたときの最初の操作としてレジスタバンクの現在の状態を格納するように注意深く作成する必要があります。つまり、ディスパッチャ自体には直接のコンテキストがないため、同じ問題が発生することはありません。

これは、ディスパッチャの呼び出し中に何が起こっているかを簡単に説明する試みです。

  1. 現在コンテキストを持っているプログラムがプロセッサ上で実行されています。レジスタ、プログラムカウンタ、フラグ、スタックベースなどはすべてこのプログラムに適しています。オペレーティングシステムネイティブの「予約済みレジスタ」などを除いて、プログラムについてはディスパッチャについて何も知りません。
  2. ディスパッチャ機能の時限割り込みがトリガーされます。この時点で(Vanillaアーキテクチャの場合)発生する唯一のことは、プログラムカウンタがBIOS割り込みのPCアドレスがリストされているものにすぐにジャンプすることです。これにより、ディスパッチャの「ディスパッチ」サブルーチンの実行が開始されます。他のすべては変更されないままなので、ディスパッチャは以前に実行されていたプログラムのレジスタ、スタックなどを確認できます。
  3. ディスパッチャ(すべてのプログラムと同様)には、現在のレジスタセットを操作する一連の命令があります。これらの命令は、以前に実行されていたアプリケーションがすべての状態を残していることを認識できるように記述されています。ディスパッチャの最初のいくつかの命令は、この状態をメモリのどこかに保存します。
  4. ディスパッチャは、CPUを搭載する次のプログラムを決定し、以前に保存されたすべての状態を取得して、レジスタにそれを入力します。
  5. ディスパッチャは、CPUで完全なコンテキストが確立されたタスクにリストされている適切なPCカウンタにジャンプします。

要約すると(過度に)単純化する。ディスパッチャはレジスタを必要としません。現在のCPU状態を所定のメモリ位置に書き込み、別のプロセスのCPU状態を所定のメモリ位置からロードし、そのプロセスが中断した場所にジャンプするだけです。

それはそれをより明確にしますか?

20
Mark McKenna

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

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

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

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

次のプロセスのコンテキストには、ディスパッチャ割り込み自体にある状態が含まれているため、割り込みから戻ったときに、まったく別のプロセスになります。

1
paxdiablo

ディスパッチャモジュールは、短期スケジューラによって選択されたプロセスにCPUの制御を提供します。これには、コンテキストの切り替え、ユーザーモードへの切り替え、ユーザープログラム内の適切な場所へのジャンプ、そのプログラムの再起動が含まれます。

オペレーティングシステムの主な責任は、プロセスの実行を制御することです。これには、実行パターンの決定とプロセスへのリソースの割り当てが含まれます。

プロセスは、次の2つの状態のいずれかになります。

  1. 実行中または
  2. 走っていない

OSが新しいプロセスを作成すると、そのプロセスのプロセス制御ブロックが作成され、そのプロセスがシステムの非実行状態になります。存在するプロセスはOSに認識されており、実行の機会を待っています。

時々、現在実行中のプロセスが中断され、OSのディスパッチャ部分が実行する他のプロセスを選択します。

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

0
Pankti