15

Linux スケジューラーおよびその他の同様のカーネル システム コールについて一般的な質問があります。

Linuxスケジューラは「プロセス」と見なされ、スケジューラへのすべての呼び出しには、別のプロセスのようなコンテキストスイッチが必要ですか?

現在実行中のユーザー モード プロセスを中断するクロック ティックがあり、スケジューラを呼び出す必要があるとします。スケジューラ自体への呼び出しは、コンテキスト スイッチを引き起こしますか? スケジューラには、呼び出しごとに復元する必要がある独自のレジスタと U 領域のセットがありますか?

そして、上記の質問は他の多くのシステムコールにも当てはまります。カーネル プロセスは、コンテキストの切り替えに関して通常のプロセスのように動作しますか? 唯一の違いは、より多くの権限と CPU へのアクセスがあることです

これは、コンテキスト スイッチのオーバーヘッドが高いためです。また、スケジューラ自体を呼び出すと、スケジューラの状態を復元するためにコンテキスト スイッチが呼び出され、その後、スケジューラが別のプロセスを呼び出して実行し、別のコンテキスト スイッチを呼び出すというのは奇妙に思えます。

4

3 に答える 3

5

これは非常に良い質問です。ハードウェアが OS とタスク スケジューラの概念を認識しているという事実を除けば、答えは「はい」です。

ハードウェアには、「スーパーバイザー」モードに制限されているレジスタがあります。内部 CPU アーキテクチャについてあまり詳しく説明しませんが、「ユーザー モード」と「スーパーバイザー モード」用の基本的なプログラム実行レジスタのコピーがあり、後者は OS 自体からのみアクセスできます (カーネルまたはユーザーモードアプリケーションが現在実行されているかどうかを示す、カーネルが設定する制御レジスタ)。

したがって、あなたが話す「コンテキストスイッチ」は、ユーザーモードレジスタ(命令レジスタ、スタックポインタレジスタなど)などをスワップ/リセットするプロセスですが、システムレジスタは保存されているため、スワップアウトする必要はありませんユーザーのものとは別に。

たとえば、x86 のユーザー モード スタックは USP - A7 ですが、スーパーバイザー モード スタックは SSP - A7 です。そのため、カーネル自体 (タスク スケジューラを含む) は、スーパーバイザー モード スタックとその他のスーパーバイザー モード レジスタを使用して実行し、実行時にスーパーバイザー モード フラグを 1 に設定してから、ユーザー モード ハードウェアでコンテキスト スイッチを実行して、アプリとスーパーバイザー モード フラグを 0 に設定します。

しかし、OS とタスク スケジューリングのアイデアの前に、マルチタスク システムを実行したい場合は、質問で概説した基本概念を使用する必要がありました。ハードウェア割り込みを使用して、x サイクルごとにタスク スケジューラを呼び出します。次に、アプリをタスク スケジューラに交換してから、新しいアプリに交換します。しかし、ほとんどの場合、タイマー割り込みは実際のタスク スケジューラ自体であり、コンテキスト スイッチを減らして単純な割り込みハンドラー ルーチンにするために大幅に最適化されています。

于 2012-05-31T18:47:33.313 に答える
1

schedule()実際には、関数のコードを で確認できますkernel/sched.c。それは見事によく書かれており、あなたの質問のほとんどに答えるはずです.

しかし肝心なのは、Linux スケジューラは を呼び出すことによって呼び出されschedule()、その呼び出し元のコンテキストを使用してジョブを実行するということです。したがって、専用の「スケジューラ」プロセスはありません。これにより、実際には事態がより困難になります。スケジューラーがプロセスである場合、それ自体もスケジュールする必要があります。

schedule()明示的に呼び出されると、呼び出し元スレッド A のコンテキストを選択された実行可能なスレッド B のコンテキストに切り替えるだけで、B に戻ります (レジスタ値とスタック ポインターを復元することにより、の戻りアドレスschedule()は B の 1 つになります)。 Aの代わりに)。

于 2012-06-01T05:38:04.540 に答える
1

以下は、ディスパッチャーの呼び出し中に何が行われるかを簡単に説明したものです。

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

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

于 2013-07-27T19:33:56.897 に答える