9

プリエンプションについて1つのことを理解するのに苦労しています。ウィキペディアの引用:

コンピューティングにおいて、プリエンプション(より正確にはプリエンプション)とは、コンピュータシステムによって実行されているタスクを、その協力を必要とせずに、後でタスクを再開することを目的として一時的に中断する行為です。このような変更は、コンテキストスイッチと呼ばれます。これは通常、特権タスクまたはプリエンプティブスケジューラと呼ばれるシステムの一部によって実行されます。プリエンプティブスケジューラは、システム内の他のタスクをプリエンプションまたは中断し、後で再開する機能を備えています。

したがって、基本的に、スケジューラーは現在実行中のタスクを中断できると彼らは言います。どうしてそれも可能ですか?CPUは現在、スケジューラのコードではなく、このタスクのコードを実行しています。では、スケジューラーはどのように何かを行うことができますか?

私の推測では、一定の時間が経過した後にCPUを物理的に中断し、スケジューラーに制御を戻す、ある種のハードウェアタイマーが必要です。これは正しいです?それについてもっと詳しく読むことができるドキュメントはありますか?

どんな答えでも大歓迎です。

4

2 に答える 2

5

それはそう。x86 アーキテクチャには、interrupts. 一部の割り込みはハードウェアによってトリガーされます (その他の割り込みはソフトウェアからトリガーできます)。

カーネルは、これを処理する「ハンドラ」を登録します。カーネル設計に興味がある場合は、次のチュートリアルが役立ちます: http://www.osdever.net/bkerndev/Docs/gettingstarted.htm厳密にはあなたの質問の一部です)

割り込みがトリガーされると、現在実行中のコードが停止します。CPU は代わりにハンドラーを実行し、ハンドラーが完了すると、割り込みがトリガーされる前に実行されていたコードに戻ります。アプリケーションにとっては、割り込みがまったく発生しなかったかのようです。

割り込み処理をハードウェア クロック (PIT チップなど) と組み合わせて、必要な結果を得ることができます。

http://wiki.osdev.org/PITを確認することもできます(繰り返しますが、トピックを始めたばかりの場合、この内容の一部が複雑になる可能性があることに注意してください)。

IRQ をプリエンプティブ マルチタスクに使用する

タイマー IRQ を使用して、プリエンプティブ マルチタスクを実行することもできます。現在実行中のタスクに実行時間を与えるには、しきい値を設定します (たとえば、3 ティック)。前のようなグローバル変数を使用しますが、0 から増加し、その変数が 3 に達したときにタスクを切り替えます。その方法はあなた次第です。

そう:

  1. カーネルは、適切な割り込みハンドラーを登録することで、「時間切れになったら、このコードを実行したい」と言います。
  2. タイマーが切れると、割り込みがトリガーされます。その後、カーネルが登録したコードが実行されます。
  3. カーネルが引き継ぎ、停止したプロセスからすべての必要なデータ (レジスターの状態や実行されていたコードのアドレスなど) を保存し、別のプロセスに制御を渡します。
  4. その後、カーネルが最初のプロセスを続行する場合、保存されたすべてのデータを使用して、プロセスを以前の状態に復元します。次に、停止した場所からコードを実行し続けるように CPU に指示します。
于 2012-08-15T21:35:51.603 に答える
3

あなたの推測は正しいです。ほとんどのオペレーティング システムには、一定の頻度でカーネル内の特権コードを実行するタイマー割り込みがあります。この特権コードは、(a) 元の実行中のコードに戻るか、(b) コンテキストを保存して他のコードの実行を開始するかを決定できます。

プロセスが I/O の準備が整うのを待たなければならない I/O からの読み取り要求など、コンテキストの切り替えを引き起こす可能性のある条件は他にもあります。最初のタスクが待機している間に、カーネルはおそらく他のタスクに切り替えます。

いわゆるtickless カーネルについて読むことにも興味があるかもしれません。

于 2012-08-15T21:33:07.820 に答える