初心者レベルでマルチタスクはどのように実装されていますか?

マルチタスクはどのように基本レベルで実装されていますか?私の質問を明確にするために、たとえば、 main()を呼び出して、単一のコアプロセッサ上で一度に1つのタスクしか実行できないマルチタスクを実装するアプリケーションを作成するCランタイムが与えられているとします。この「mutlitasking」アプリケーションの機能。 標準のOSカーネルはこれをどのように実装していますか?これはマルチコアプロセッサでどのように変化しますか

1

2 答え

OSは割り込みタイマを設定し、プログラムを実行させます。タイマが満了すると、制御フローは、コンテキストスイッチのためにOSのコードにジャンプする。

コンテキストスイッチOSでは、現在のプロセスのレジスタおよびサポートデータを保存し、CPU内のそれをキュー内の次のプロセスのデータに置き換えます。次に、別の割り込みタイマーを設定し、割り込みが発生した場所から次のプログラムを実行させます。

また、現在のプロセスからのシステムコールは、コンテキストスイッチの時間であるかどうかを決定するためにOSに制御を与える(プロセスがIO操作を待っている)

この仕組みはプログラムにとって透過的です。

実行します。スイッチ。繰り返す。 :)

1
追加された

私はマルチコアプロセッサではあまり仕事をしていないので、質問のその部分に答えようとしていません。しかし、ユニプロセッサの場合、マルチタスキングに関しては2つの戦略が考えられます。

  1. 正しく覚えていれば、x86はハードウェアタスクの切り替えをサポートしています。 (私はこのタイプのマルチタスクの経験はほとんどありませんでした)。プロセッサがタスクスイッチの条件を検出すると、タスクの状態レジスタ(タスク状態セグメント(x86))に自動的にすべてのレジスタが保存されます。着信タスクのタスク状態セグメントからすべてのレジスタをロードする。この方法では、「ビジービット」が設定され、特別な条件下で「ビジーなタスク」にスイッチバックできるなど、さまざまな注意点と制限があります。個人的に、私はこの方法が私にとって特に有用であるとは思っていません。

  2. 私が見たより一般的な解決策は、ソフトウェアによるタスクの切り替えです。これは、協調的なタスク切り替えと先制的なタスク切り替えに分けることができます。協力的なタスク切り替え戦略をコーディングする場合、タスクスイッチは、タスクが自発的にプロセッサを放棄した場合にのみ発生します。この方法では、不揮発性レジスタを保存してロードするだけで済みます。先制戦略が選択された場合、タスクスイッチは自主的にまたは非自発的に実行できます。この場合、すべてのレジスタを保存してロードする必要があります。いずれかのシナリオをコーディングするときは、レジスタの内容が壊れないように注意してスタックを正しく設定する必要があります。タスク切り替えコードから戻ったときに、着信タスクのスタックの適切な場所にいるようにします。

お役に立てれば。

0
追加された
それは確かに役立ちます、ありがとうございますが、トピックは明らかに詳細な説明が必要です。
追加された 著者 Bleamer,