タスク管理、実行状態、待機状態、実行可能状態、ディスパッチャ、ラウンドロビン方式、割込み、内部割込み、スーパーバイザコール、外部割込み、タイマ割込み、プリエンプション
タスクの状態
複数のタスクがある場合、タスクの状態には次の3つの状態があります。(状態遷移図については、「オートマトンと状態遷移図」(hs-joutai-seni)参照)
- 実行状態(Run)
- CPUが割り当てられ実行している状態
- 待機状態(Wait)
- ファイルから読み込んだデータを処理するタスクのように、入出力が完了するのを待っている状態
- 実行可能状態(Ready)
- CPUが割り当てられれば実行できるのだが、他のタスクがCPUを使っているので、自分に割り当てられるまで待っている状態
各タスクの状態、必要とする資源、優先度などの情報は、タスクコントロールブロック(TCB)に登録されます。そのTCBを用いて、実行可能状態にあるプロセス(タスク)の中から,次に実行するべきプロセスを選んだり、TCBの内容を更新する機能をタスクスケジューラ(ディスパッチャ)といいます。
各状態からの遷移は、次のように行われます。
- ①:タスクの生成→実行可能状態
生成されたタスクは、実行可能状態になり、実行状態になるのを待ちます。
- ②:実行可能状態→実行状態
ディスパッチャは、優先順位(後述)に従って、実行可能状態にあるタスクのなかから、実行すべきタスクを選択し、実行状態にします。
- ③:実行状態→実行可能状態
実行中のタスクが割込み(後述)により、他のタスクに実行権が渡されると、実行可能状態になります。
- ④:実行状態→待機状態
例えば、CPUを使っているタスクが、次のデータをファイルから読み込む状態になったときは、そのデータが読み込まれるまで、待っている必要があります。入出力待ちが生じると、そのタスクは待機状態になり、他のタスクが実行されます。
- ⑤:待機状態→実行可能状態
入出力待ちで待機状態にあったタスクは、その入出力処理が終了すると、実行可能状態になります。
- ⑥:実行状態→タスクの消滅
タスクの実行が終了すると、その情報がタスク管理に伝えられ、このタスクが占有した資源が解放されます。TCBの情報が削除され、タスク管理の対象から外れます。それをタスクの消滅といいます。
優先順位の方式
ディスパッチャが実行可能状態のタスクのなかから実行するタスクを選択する優先順位には、多様な基準があります。通常は、これらを組み合わせたり重みづけをしたりして、実行すべきタスクを決定します。
- 到着順方式
- 実行可能状態になった順に実行権を与える方式です。
- 処理時間順方式
- 処理時間の短いタスクから実行する方式です。「すぐ片付くことからやってしまおう」という発想で、対話型処理の平均応答時間を最小にするのに有効です。
- 優先度順方式
- PCBに設定している実行優先順位に従って選択する方式です。優先順位の高いタスクはすぐに実行されますが、優先順位の低いタスクは、いつになっても実行されないという問題が発生するので、長く待たせれているタスクの優先度を上げるような工夫が必要になります。
- ラウンドロビン方式
- 実行中のタスクをタイマ割込み(後述)などにより、実行可能状態に遷移したとき、待ち行列の最後尾に回す方式です。
割込み
実行中のタスクを中断して他のタスクに実行権を渡すことを割込みといい、割込みのきっかけになる事象をトリガー(引き金の意味)といいます。割込みは多様なトリガーにより発生します。
- 内部割込み
- 実行中のタスク(プログラム)が原因で発生する割込み
- プログラム割込み
- 0除算、オーバーフローなど(プログラムのエラーが多い)
仮想記憶方式でのページング
- スーパーバイザコール
- システムコール、特権モード呼出し割込み、カーネル呼出し割込みともいいます。
通常のプログラムからはアクセスできない保護されたメモリ領域にアクセスすることや、保護されたレジスタを操作すること、CPUの動作モードを変更することなどを、OSの制御プログラムの特権機能が必要になったときに発生します。
- 外部割込み
- 実行中のプログラム以外の原因で発生する割込み
- 機械割込み
- ハードウェアの障害、電源異常などによる割込み
- コンソール割込み
- オペレータの操作による割込み
- 入出力割込み
- 入出力処理の発生や終了による割込み
- タイマ割込み
- 実行中のタスクがCPUを長時間占有すると、他のタスクに大きな影響を及ぼします。それを回避するために、一定時間を経過すると割込みを行い、他のタスクに実行権を渡して、自分は実行可能状態に遷移します(ラウンドロビンにすることが多い)。
関連用語
- プリエンプション方式とノンプリエンプション方式
- プリエンプション方式は、実行中のタスクが割込みにより中断されて、優先度の高いタスクに切り替わり、優先度の高いタスクの処理が終了すると、中断されたタスクの処理を再開する方式です。その割込みで重要なのがタイマ割込みです。
それに対して、ノンプリエンプション方式は、>タイマ割込みを行わない方式で、実行中のタスクが終了後、新しいタスクの処理が開始される方式です。この方式では、いったんCPUを長く使うタスクが実行状態に入ると、他のタスクはなかなか実行されません。
- イベントドリブン方式とタイムスライス方式
- イベントドリブン方式とは、「マウスがクリックされた」「キーボードから入力された」というような事象(イベント)が発生すると、それに応じて処理を行う方式です。グラフィカルユーザインターフェースを持ったプログラムではイベントドリブン方式が広く採用されています。
タイムスライス方式とは、タイムスライス(タイマ割込みでの「一定時間」のこと。数十ミリ秒)により、CPUの利用権を他のタスクに渡す方式です。タイムシェアリング方式ともいいます。タイムスライス方式は必要のないときも必要なときも、 常に一定のオーバーヘッドがかかりますが、多くのタスクを公平に処理するのに適しています。