66

私は最近、CPU とオペレーティング システムがどのように機能するかを学び始めましたが、マルチタスクを提供するオペレーティング システムを搭載したシングル CPU マシンの操作について少し混乱しています。

私のマシンに単一の CPU があると仮定すると、これは、常に 1 つのプロセスしか実行できないことを意味します。

ここで、オペレーティング システムが貴重な CPU 時間へのアクセスを制御するために使用するスケジューラもプロセスであるとしか考えられません。

したがって、このマシンでは、任意の時点でユーザー プロセスまたはスケジューリング システム プロセスのいずれかが実行されていますが、両方は実行されていません。

だからここに質問があります:

スケジューラーが CPU の制御を別のプロセスに譲った後、スケジューリング作業を行うために再び CPU 時間を再実行するにはどうすればよいでしょうか? つまり、現在実行中の特定のプロセスが CPU を解放しない場合、スケジューラ自体を再び実行して、適切なマルチタスクを保証するにはどうすればよいでしょうか?

これまでのところ、ユーザー プロセスがシステム コールを介して I/O 操作を要求した場合、システム コールでスケジューラに CPU 時間を再度割り当てることができると考えていました。しかし、これがこのように機能するかどうかさえわかりません。

一方、問題のユーザー プロセスが本質的に CPU バウンドである場合、この観点からすると、そのユーザー プロセスは永久に実行され、他のプロセスやスケジューラーの再実行さえ許可されません。

タイム スライス スケジューリングを想定すると、別のプロセスが実行されていないときに、スケジューラが別のプロセスの実行時間をスライスする方法がわかりません。

この点に関して、あなたが提供できる洞察や参考文献を本当に感謝しています。

4

3 に答える 3

53

OS は、N ミリ秒ごとに割り込みを生成するハードウェア タイマー (プログラマブル インターバル タイマーまたは PIT) をセットアップします。その割り込みはカーネルに配信され、ユーザー コードが中断されます。

他のハードウェア割り込みと同様に機能します。たとえば、ディスクが IO を完了すると、カーネルへの切り替えが強制されます。

于 2012-07-13T15:42:45.593 に答える
12

Google が「中断」します。割り込みは、Linux/Windows のようなマルチスレッドのプリエンプティブ カーネルの中心にあります。割り込みがなければ、OS は何もしません。

調査/学習中は、最初の段落で「タイマー割り込み」、「ラウンドロビン」、「タイムスライス」、または「量子」に言及している説明を無視するようにしてください。

OS の用語では、割り込みには次の 2 つの種類があります。

  • ハードウェア割り込み – 周辺機器からの実際のハードウェア信号によって開始される割り込み。これらは (ほぼ) いつでも発生する可能性があり、実行中のスレッドからドライバー内のコードに切り替えます。

  • ソフトウェア割り込み – 現在実行中のスレッドからの OS 呼び出しによって開始される割り込み。

どちらの割り込みも、待機中または実行中のスレッドを作成するようスケジューラに要求するか、待機中または実行中のスレッドをプリエンプトするように要求する可能性があります。

最も重要な割り込みは、周辺機器ドライバーからのハードウェア割り込みです。これは、ディスク、NIC カード、マウス、キーボード、USB などからの IO で待機していたスレッドの準備を整えるものです。プリエンプティブ カーネルを使用する最も重要な理由と、ロックのすべての問題同期、シグナリングなどは、ハードウェア周辺機器がそのハードウェアからのデータを待っていたスレッドを迅速に準備/実行できるため、そのようなシステムは非常優れた IO パフォーマンスを持っているということです。タイマーの再スケジュール。

定期的なスケジューリングの実行を引き起こすハードウェア タイマー割り込みは重要です。なぜなら、多くのシステム コールには、周辺機器からの応答に必要以上に時間がかかる場合に備えてタイムアウトがあるためです。

マルチコア システムでは、OS に他のコアでハードウェア割り込みを発生させることができるインタープロセッサ ドライバーがあり、OS が複数のコアにスレッドを割り込み/スケジュール/ディスパッチできるようにします。

深刻な過負荷のボックス、または CPU を集中的に使用するアプリ (ごく少数) を実行しているボックスでは、OS は定期的なタイマー割り込みとその結果のスケジューリングを使用して、利用可能なコアの数よりも大きい一連の準備ができているスレッドを循環させることができます。利用可能な CPU リソースをそれぞれが共有できるようにします。ほとんどのシステムでは、これはめったに発生せず、ほとんど重要ではありません。

「量子」、「タイムスライスの残りをあきらめる」、「ラウンドロビン」などを見るたびに、私はただうんざりします...

于 2012-07-14T09:56:20.917 に答える
4

@usr の回答を補完するために、Understanding the Linux Kernelから引用します。

schedule( ) 関数

schedule( ) はスケジューラを実装します。その目的は、ランキュー リストでプロセスを見つけて、それに CPU を割り当てることです。これは、いくつかのカーネル ルーチンによって、直接または怠惰な方法で呼び出されます。[...]

遅延呼び出し

スケジューラーは、現在の [プロセス] の need_resched フィールドを 1 に設定することにより、怠惰な方法で呼び出すこともできます。このフィールドの値のチェックは、ユーザー モード プロセスの実行を再開する前に常に行われるため (セクション「戻る」を参照)。第 4 章の「割り込みと例外」から)、schedule( ) は近い将来必ず呼び出されます。

于 2012-07-13T15:47:59.327 に答える