OS は、スケジューラと呼ばれるメカニズムを使用して、管理しているすべてのスレッドまたはプロセスを一緒に適切に動作させます。
1 秒間に数回、コンピューターのハードウェア クロックが CPU に割り込み、OS のスケジューラーがアクティブになります。スケジューラは、実行しようとしているすべてのプロセスを調べて、次のタイム スライスで実行するプロセスを決定します。
決定に使用するさまざまなことは、各プロセスの状態と、それまでの経過時間によって異なります。そのため、現在のプロセスが CPU を大量に使用しており、他のプロセスの進行を妨げている場合、現在のプロセスを待機させ、別のプロセスでスワップして、何らかの作業を実行できるようにします。
ただし、多くの場合、ほとんどのプロセスは待機状態になります。たとえば、プロセスがコンソールからの入力を待機している場合、OS はプロセス情報を見て、待機している io ポートを確認できます。これらのポートをチェックして、プロセスが処理するデータがあるかどうかを確認できます。その場合、プロセスを再開できますが、データがない場合、そのプロセスは現在のタイムスライスでスキップされます。
に関してはsleep()
、任意のプロセスが OS にしばらく待機することを通知できます。その後、スケジューラはハードウェア割り込みの前でもアクティブになり (これは、プロセスが読み取り可能なデータを持たないストリームからブロッキング読み取りを実行しようとしたときにも発生します)、OS はプロセスが何であるかを記録します。待っています。スリープの場合、プロセスはアラームが鳴るのを待っています。または、タイマーが切れるまでプロセスが再起動されるたびに、プロセスが中断することがあります。
OS は、何かによって実行中のプロセスがプリエンプトされた後にのみプロセスを再開するため、前述のプロセスの生成やハードウェア タイマーの割り込みなど、sleep()
あまり正確ではありません。正確さの程度は OS またはハードウェアによって異なりますが、通常は次のようになります。 1 ミリ秒以上。
より高い精度が必要な場合、または非常に短い待ち時間が必要な場合、唯一のオプションは、言及したビジー ループ コンストラクトを使用することです。