協調スケジューリングは、I/O操作を実行するときにプロセスを一時停止しますか?

cs.stackexchange https://cs.stackexchange.com/questions/5

質問

多くのオペレーティングシステムの参照によると、協同組合(先制とは対照的に)マルチタスクでは、プロセスがCPUが自発的にそれ自体を一時停止するまでCPUを維持します。実行中のプロセスがすぐに満たさないI/O要求を実行した場合(たとえば、まだ利用できないキーストロークを要求します)、スケジューラはそれを一時停止しますか、それともリクエストを修正できるまでCPUを実際に保持しますか?

「I/Oのブロック」を「すぐに満たすことができないI/Oリクエストを実行する」と交換するために編集されました。]]

役に立ちましたか?

解決

真に「協力的な」設定では、ハードウェア保護がなければ、I/Oが確実にブロックされ、I/Oが完了するまでコントロールを放棄することはできません(またはまったく制御を放棄することはありません)。たとえば、Windows 3.1はこのようにしていました。単一のユーザープロセスがコンピューター全体を引き継ぎ、他のものが実行されないようにしたい場合、可能です。

しかし、マルチタスクを備えたシステムでは、システムが呼び出されたときにプロセッサの制御を放棄するシステムAPI I/Oコマンドが期待されます。したがって、プロセスが通常のシステムAPIを使用すると仮定すると、実行プロセスがI/Oでブロックされると、I/Oが完了するまで他のプロセスが実行され、最終的にI/Oが完了すると元のプロセスが再開されます。 。言い換えれば、ブロッキングI/O関数を呼び出すことは、協同システムのプロセスが自発的にそれ自体を一時停止できる1つの方法です。

他のヒント

実行プロセスがI/Oでブロックされている場合

IOのブロックは、プロセスを停止することとほぼ同等です。 Linuxカーネルのコンテキストでは、次のようなIOシステムコールを実行します read() aを引き起こします sysenter または、そのIOの世話をするためにトリガーするハンドラーを割り込み、呼び出します do_sys_read() 最終的に。ここで、現在の要求がすぐに満たされない場合、関数は呼び出します sched() その後、別のプロセスを実行する場合があります。

協同組合システムのコンテキストでは、IOの理由でシステムを呼び出すと、リクエストが満たされない場合、カーネルは別のタスクを選択して実行することを期待します。 このドキュメント ある程度の背景を提供します - 基本的に、IOで待っていれば、そのIOを待っていることができます。あなたが頻繁に電話するという協同組合のスケジューリングのアイデア sched() または、CPU集約型のタスクを実行する場合、等しいCPUメソッドを等しく放棄します。

カーネルモードの考慮事項はより興味深いものになります。などのアーキテクチャについて 特定の組み込みプラットフォーム, 、割り込みハンドラーは、ハードウェアまたはソフトウェアの割り込みに応じて引き続き呼び出されます。通常、実装では可能です 無効にします 割り込み処理, 、しかし、それにも欠点があります。

協同組合のスケジューリング(できれば cooperative multitasking)モデル、オペレーティングシステムがプロセスの実行期間を制御しないという意味で、スケジューラの概念はありません。

正しくプログラムされたアプリケーションは、I/OでCPUを自発的に放棄します。しかし、ひどく書かれたアプリケーションは、I/Oを待ち続けるだけで、他のプロセスをブロックする可能性があります。

PS:このアプローチは、その後、OSのほとんどが先制スケジューリング(外部スケジューラを搭載した)を支持してあきらめられ、さまざまなOSで使用されるさまざまなスケジューリングアルゴリズムがあります。

編集: 私の答えは、元の形式(数年前:p)で説明されているように、スケジューリングに基づいていました。 Gillesがコメントしたように、一部のシステムはまだ協同組合のスケジューリングを使用しています。スケジューラがあります。これらのシステムが純粋でオリジナルのフォームでCOSを使用しているかどうかはわかりません。

協同組合のマルチタスクは、実行するコンテキストがスケジューラへの制御を明示的に放棄する必要があることを意味し、希望する場合、コンテキストスイッチが発生するのを防ぐことができます。

ほとんどの実装は、プロセッサの割り当ての公平性を高めるために、迅速に、そして多くの場合、そうであっても多くの場合でも返されないシステムコールのコンテキストスイッチを明示的に実行します。

通常、失敗したプロセス(またはシステムの残りの部分へのサービスを意図的に拒否する)が頻繁にタスクスイッチングを防ぐことができることのみが可能です。

ジルが説明したように、先制は、アクティブなタスクのタイミングの中断と強制コンテキストスイッチを防ぐシステムのアーキテクチャの制限です。

ライセンス: CC-BY-SA帰属
所属していません cs.stackexchange
scroll top