最近、OSコースを開始しました。私の知る限り、ディスパッチャの作業は、現在のプロセスのコンテキストを保存し、次に実行するプロセスのコンテキストをロードすることです。しかし、それはどのようにそれを行うのでしょうか?プロセスがプリエンプションされると、ディスパッチャがロードされて実行されるとすぐに(プログラムでもあるため)、レジスタ、PSWなどの前のプロセスのコンテキストが失われます。自分自身をロードする前に、どのようにコンテキストを保存しますか?
簡単な答えは、最新のプロセッサは、ハードウェアで交換できるレジスタのいくつかのバンクを提供するアーキテクチャ拡張を提供するため、最大X個のタスクがレジスタの完全なセットを保持できるということです。
より複雑な答えは、ディスパッチャが割り込みによってトリガーされると、割り込み時に実行されていたプログラムの完全なレジスタセットを受信することです(プログラムカウンタは例外で、おそらく相互に合意したものを介して伝播されます。 'volatile'レジスタなど)。したがって、ディスパッチャは、トリガーされたときの最初の操作としてレジスタバンクの現在の状態を格納するように注意深く作成する必要があります。つまり、ディスパッチャ自体には直接のコンテキストがないため、同じ問題が発生することはありません。
これは、ディスパッチャの呼び出し中に何が起こっているかを簡単に説明する試みです。
要約すると(過度に)単純化する。ディスパッチャはレジスタを必要としません。現在のCPU状態を所定のメモリ位置に書き込み、別のプロセスのCPU状態を所定のメモリ位置からロードし、そのプロセスが中断した場所にジャンプするだけです。
それはそれをより明確にしますか?
通常、現在のプロセスに関する情報が失われるような方法で読み込まれることはありません。
多くの場合、これは現在のプロセスのコンテキストで発生する割り込みです。
したがって、ディスパッチャ(またはスケジューラ)は、次のプロセスのためにその情報をロードする前に、ある種のタスク制御ブロックにすべての関連情報を保存できます。
これには、レジスタの内容、スタックポインタなどが含まれます。
次のプロセスのコンテキストには、ディスパッチャ割り込み自体にある状態が含まれているため、割り込みから戻ったときに、まったく別のプロセスになります。
ディスパッチャモジュールは、短期スケジューラによって選択されたプロセスにCPUの制御を提供します。これには、コンテキストの切り替え、ユーザーモードへの切り替え、ユーザープログラム内の適切な場所へのジャンプ、そのプログラムの再起動が含まれます。
オペレーティングシステムの主な責任は、プロセスの実行を制御することです。これには、実行パターンの決定とプロセスへのリソースの割り当てが含まれます。
プロセスは、次の2つの状態のいずれかになります。
OSが新しいプロセスを作成すると、そのプロセスのプロセス制御ブロックが作成され、そのプロセスがシステムの非実行状態になります。存在するプロセスはOSに認識されており、実行の機会を待っています。
時々、現在実行中のプロセスが中断され、OSのディスパッチャ部分が実行する他のプロセスを選択します。
プロセスにリソースがない実行中に、プロセスはブロックされます。それらのリソースが提供されると、準備完了状態に戻り、次に実行状態になります。準備完了状態から実行状態へのこの移行は、ディスパッチャによって実行されます。ディスパッチャはプロセスをディスパッチします。