マルチタスクの実現
Windows はもちろん、Linux をはじめとする UNIX 系 OS の上では、数多くのソフトウェアが同時に動作する(しているように見える)。
複数のソフトウェアを動作させられるOS の事を「マルチタスクOS」と言う。
割込みとマルチタスク
割込みとは?
CPU は、外部から複数の「割込み」を受け付ける機能を持っている。
例えば、パソコンのキーボードを押したとき、
- キーボードのコントローラーは、CPU のある割込みピンを駆動させて割込みを発生させる
- CPU は割込みを受け付け、その割込みに応じた処理プログラムが書き込まれたメモリアドレスへ一時的に実行を移す
とう動作をする。
割込みに対応するプログラムが書き込まれたメモリアドレスは「割込みベクタ」と呼ばれ、メモリ上の特定のアドレスにある「ベクタテーブル」に
アドレスが書き込まれている。
例えば、キーボードが押されて発生した割込みに対しては、キーボードから送信されたデータを読み取るプログラムが割込みベクタに登録されているわけである。
この仕組みにより、CPU が他の仕事をしている最中でも、
キーボードを押すとその押した情報をCPU は受け取ることができるようになっている。
- 割込みの動作
-
割込みが発生すると、
- その時点で実行していた命令の完了まで待つ
- 実行中のプログラムへ戻れるように戻りアドレスを確保する
- ベクタテーブルから割込みに対応するベクタアドレスを取得し、割込みプログラムを実行する
- 割込みプログラムの実行が終了すると、先に確保しておいた戻りアドレスを参照し、割込みを受け付けた元のプログラムに戻る
という流れになる。
マルチタスク実現へ
CPU の割込みとして、一定の時間(例えば1[ms])間隔で割込みを発生させる
タイマー割込みと呼ばれる割込みがある。
タイマー割込みは時間を計るなど様々な用途に利用できるが、
マルチタスク OS では、プログラムの実行にも活用している。
例えば、プログラムA とプログラムB を同時に実行する場合、
- OS はプログラムA のメモリアドレスに実行を移す
- 実行が移った後、1[ms] 後にタイマー割込みが発生
- タイマー割込み処理プログラムが実行
- プログラムA の実行途中の状態(スタックの中の値など) を一時的に保存しておく
- OS はプログラムA には復帰せずに、プログラムB に実行を移す
このようにして、プログラムA とプログラムB を1[ms] ごとに切り替えて実行していくと、人間にはプログラムA とプログラムB が
あたかも同時に実行されているように見える。
- マルチタスクの仕組み
-
実際の OS では、タイマー割込みだけを利用するわけではない。
OS 上のプログラムは、例えば、
- ディスクにアクセスするとき
- キーボードの入力を受け取るとき
など、様々な入出力をOS に頼っている。
言い換えると、ことあるごとにOS の機能を呼び出している。
このとき、OS に実行が戻るため、状況に応じて他のプログラムに実行を移すなどして、複数のプログラムの実行を実現している。
マルチタスクとスケジューリング
システム資源とタスク
システム資源とは、MPU、メモリ領域、入出力といったハードウェアと、
データやプログラムといったソフトウェアを総称したものである。
処理を行う上で必要となるシステム資源の集まりをタスクという。
スケジューリングアルゴリズム
全てのタスクについて、時間制約を満足するようにスケジューリングすることを、
リアルタイムスケジューリングという。代表的なアルゴリズムは、
- 優先度ベースFCFSスケジューリング
- 同一優先度のタスクが複数存在する場合、先に Ready 状態になったものを選択し、
時間制約に応じた優先度を与えるアルゴリズム
- 優先度ベースプリエンプティブスケジューリング
- 実行中のタスクよりも優先度の高いタスクが Ready 状態になると、
実行中のタスクを一時中断して Ready 状態に戻し、
Ready 状態となった優先度の高いタスクを Run 状態にするアルゴリズム
- ラウンドロビンスケジューリング
- タスクの実行順序を予め決めておき、順番に実行するアルゴリズム
- EDF スケジューリング
- 時間制約の厳しいタスクから順に高い優先度を割り付けるアルゴリズム