マルチタスクの仕組み


15

オペレーティングシステムの内部動作についてはまったくわかりませんが、多くの関数の近似動作を多かれ少なかれ推測できます。しかし、私が理解できないことの1つは、マルチタスクです。

理論的には、オペレーティングシステムは、実行中のさまざまなプログラムに応じた短い間隔でCPUに従って時間を管理します。しかし、これが実際にどのように機能するかは明らかではありません。

オペレーティングシステムがプログラムを開始したいとします。マシンコードは、特定のアドレスからRAMのどこかにロードされます。次に、そのアドレスにジャンプを実行して、コードを実行できるようにします。しかし、この方法では、私が戻るまでOSは制御を取り戻すことができません。

基本的に、この作品を作るには2つの方法しか考えられませんが、どちらも実際に適しているとは思えません。

  • オペレーティングシステムは、直接実行する代わりに、実行するマシン命令を読み取ってエミュレートできます。私はこれがどのように機能するかわからないので、意図的にあいまいですが、プログラムがかなり遅くなるようです。

  • または、オペレーティングシステムは、システムコールを行うまで待つことができます。その瞬間に制御を取り戻し、実行されている時間を確認し、タイムシェアリングを行うことができます。これは動作する可能性がありますが、システムコールを含まない長い計算を行い、すべてをしばらくハングさせる可能性があるため、信頼性がないようです。

したがって、どちらのメカニズムもうまく機能しないようです。マルチタスクは実際にどのように実行されますか?


あなたの推測は正確ではありませんが、あなたが指摘する問題は、ええ、「システムコールを伴わず、すべてをしばらくハングさせる長い計算を行うことができます」です。
11

検索するキーワード:interrupt
SKロジック

はい、しかし誰が割り込みを開始しますか?コードが実行中の場合、OSにはINT命令を実行する方法がありません。私にはまだ謎の何かがあります
アンドレア

@Andrea、ハーウェアクロックが割り込みをトリガーしています。それと同じくらい簡単です。en.wikipedia.org/wiki/Scheduling_%28computing%29
SKロジック

はい、わかりました。したがって、私が正しく理解していれば、それはハードウェアベースの機能であり、OSに実装できるものではありません。
アンドレア

回答:


21

OSは、数マイクロ秒(またはシステム速度によってはミリ秒)ごとに作動するタイマーをプログラムします。このタイマーはハードウェア割り込みを発生させます。これにより、CPUは現在実行中の処理をすべて停止し、その内容をすべてスタックにダンプし、割り込みコントローラーが提供するアドレスで示される割り込みルーチンを処理します。このルーチンは、スタックおよびその他のさまざまな変数を検査して、次に実行する必要がある実行中のプロセスを決定できます。同じプロセスの場合、割り込みルーチンは単純に戻ります。異なる場合は、スタックの関連部分が保存され、前に中断されたプロセスの内容に置き換えられるため、割り込みルーチンが戻ると、そのプロセスが続行されます。時間が経過したという事実を除いて、

これは(現代のCPUの場合)起こることを非常に単純化したバージョンですが、原理を説明しています。これらのOS制御割り込みに加えて、通常はイベントハンドラーに接続されている個別の割り込みルーチンで処理される外部イベント(マウス、キーボード、シリアルポート、ネットワークポートなど)による割り込みもあります。

多くの場合、プロセス/タスク/コンテキストの切り替えも外部リソースの可用性に基づいています。通常、ストレージ(RAM以外)からのデータを必要とするプロセスは、要求をキューに入れ、要求が処理されたことを示すハードウェア割り込みのイベントハンドラーを設定し、タスクスケジューラに制御を放棄します(ないため)待機中のポイント)。繰り返しますが、実際に何が起こっているのかについての非常に簡略化された説明ですが、この答えの目的に役立つはずです。


5

システムによって異なります。

非プリエンプティブマルチタスクシステム(元のOberonや元のApple Macintoshなど)では、オペレーティングシステムはすべてのタスクを定期的に「ポーリング」し、仕事をする機会を与えます。これらのタスクは一緒にうまく機能することが期待されています。彼らがやるべき仕事が少しだけあれば、彼らはそれをしてOSに戻ります。1つのタスクにBIGチャンクがある場合、それを小さな断片に分割し、ポーリングされるたびに1つの小さな断片を処理することが期待されます。

ハードウェア割り込み(ディスクドライブのDMA完了、シリアルポートの割り込み、何が原因)により、割り込みルーチンが実行されます。これらの割り込みルーチンは、タスクが次に実行されるときに実行される作業をタスクに通知します。

非プリエンプティブマルチタスクシステムでは、割り込みの発生または非発生は、割り込みルーチンの終了後に実行されているタスクに影響しません。

プリエンプティブマルチタスクシステムでは、割り込みルーチンがスケジュールの変更を強制する可能性があります。従来のラウンドロビンプリエンプティブマルチタスクシステムでは、定期的なタイマー割り込みがまさにそれを行います。タイマー割り込みが起動し、タイマー割り込みルーチンが何らかのブラックマジックを実行して、割り込みからの復帰命令を実行中のタスクではなくオペレーティングシステムのプリエンプティブスケジュールに戻し、プロセッサーを現在のタスクから引き離し、(POSSIBLY )別のタスクに与える。その時点で他のタスクを実行する準備ができていない場合、現在のタスクはプロセッサを再び取得します。

プリエンプティブマルチタスクは、多くのトラブルを引き起こす可能性があります。ミューテックスやクリティカルセクション、致命的な抱擁、優先順位の逆転などの迷惑なものはすべて、プロセッサが警告なしに取り去られたときに表示されます。これらすべてを使用して、ニトログリセリンを混合している最中であることをオペレーティングシステムに伝える必要があり、プロセッサをすぐに離すと、サーバールームの床の真ん中に大きな喫煙仮想穴が生じる可能性があります。


プロセッサが警告なしにあなたから取り去られると、どんな悪いことが起こりますか?レジスタ内の同じ値を使用して、再びプロセッサを制御できると思います。それはあなたの計算を維持することとどう違うのですか?
アンドレア

@Andrea:相互排除およびクリティカルセクションは、クリティカルな瞬間にプロセッサを失うことがないということです。プロセスにロックされているものがあり、プロセッサを失うと、そのプロセッサは再びプロセッサを取得するまでロックされたままになります。これは問題を引き起こす可能性があります。
ジョンR.ストローム

@Andreaプロセッサの制御を再び取得します。他のプロセスが、使用しようとしていたメモリをいじっていた可能性があります。
user253751

4

タイマー割り込みは、コンピューターハードウェアによって生成され、CPUに割り込みます。このように、オペレーティングシステムで使用されるスケジューリングアルゴリズムに基づいて、OSは現在のプログラムの実行を継続するか、実行準備ができている別のプログラムにコンテキストを切り替えるかを決定できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.