5

私は、sleep()、ブロッキング呼び出し、プリエンプションの概念とよく混同されます。私が理解しているように、プリエンプションは、プロセスが何をしていたかに関係なく、スケジューラによって完全に行われます。プロセスがクリティカル セクションにあるか、アトミックな命令を実行している場合を除き、スケジューラはスケジューリング アルゴリズムに基づいてプロセスを横取りし、待機中のプロセス リストに入れることができます。

一方、sleep() はスケジューラを呼び出して、指定された時間間隔でスケジューラをブロックします。sleep() に引数として渡されます。

呼び出しのブロックは、ディスクの読み取り/書き込み、別のデバイスからの信号などの I/O 操作のように、操作が完了するのを待つようなものです。

誰かがこれらの機能をより包括的な方法で説明してくれたり、確かなリソースを教えてくれたりできますか? ありがとう。

4

2 に答える 2

9

プロセスがブロッキング コールを実行すると、操作が完了するまで待機します。

あなたがこれを正しく理解しているかどうかは完全にはわかりません。たとえば、プログラムが I/O コマンドを発行するとしますread()。プロセスは操作が完了するのを待ちません。I/O 操作が完了するまでプロセッサを保持しません。がread()呼び出されると、プロセッサの制御が OS に渡され、I/O 操作が促されます。これらの操作は、CPU の速度に比べて非常に遅く、専用のハードウェアによって実行されます。つまり、CPU は、ハードウェアが (ハードウェアの割り込みによって) 完了したことを通知するまでの間、他の何かを自由に実行できます。実例)。

を実行するプログラムの観点からは、呼び出されread()たことがわかっているだけですread()。現在の命令を指すレジスタは変更されておらず、その仮想メモリは以前と同じです。プロセスは「ブロック」されています。CPU が動作していないという意味ではありません。

OS の観点からは、プログラムは、ハードウェアがそのタスクを実行したことを通知するまで待機モードになります。その間に、スケジューラは別のプロセスを起動し、そのコンテキストを復元し (つまり、CPU レジスタの値がスリープ状態になる直前の値に設定されるなど)、そのコードの実行を開始します。

ハードウェアが完了すると、割り込みが発生し、OS はプロセスを実行可能としてマークすることでそれを認識します。スケジューラ ポリシーに応じて、プロセス コンテキストを復元してすぐに実行を開始することも、現在のプロセスがタイム スライスを終了するまで待ってからコンテキストを切り替えることもできます。

Linux スケジューラの実装について詳しく読むには: Linux カーネルを理解することは非常に良い本です。

于 2012-09-21T02:24:13.530 に答える
0

あなたの見解は完全に正しいです。http://en.wikipedia.org/wiki/Preemption_(コンピューティング) (リンク)  

于 2012-09-21T01:19:10.840 に答える