タスクが実行可能・実行中・待機の3状態を移り変わる仕組み。
タスクの状態遷移とは、タスク(=実行させたい仕事の単位)が、生成されてから終了するまでの間に、いくつかの状態を行き来する仕組みのことです。基本となるのが実行可能・実行中・待機の3状態モデルです。
身近な例で考えると、1台のレジに並ぶ客に似ています。列に並んで待つ(実行可能)、レジで会計する(実行中)、商品を取りに売り場へ戻る(待機)のように、客は状況に応じて立場を移り変わります。
上のツールで▶ボタンを押すと、タスクが「実行可能→実行中→待機→実行可能」と状態を移り変わり、どの矢印(遷移)をたどるのかを順番に確認できます。
3つの状態には、それぞれ次のような意味があります。
・実行可能(ready):いつでも動けるが、CPU(=中央処理装置)の割当てを待っている状態
・実行中(running):CPUを使って、実際に処理を実行している状態
・待機(waiting/blocked):I/O(=入出力、ディスクやネットワークのやり取り)などの完了を待っている状態
ポイントは、実行中になれるタスクは一度に1つだけという点です。CPUが1つなら、同時に処理できるタスクも1つだからです。残りのタスクは実行可能(順番待ち)か、待機(I/Oの完了待ち)のどちらかにいます。
実行可能と待機はどちらも「いま実行していない」状態ですが、違いは「すぐ動けるかどうか」です。実行可能はCPUさえ空けばすぐ動けますが、待機はI/Oが終わるまで動けません。上のツールでは、状態ごとに色を変えてあるので見分けられます。
状態と状態をつなぐ矢印(遷移)には、それぞれ「どんなときに移るか」という条件があります。
・実行可能 → 実行中:ディスパッチ(=CPUの割当て)が行われたとき
・実行中 → 実行可能:タイムスライス満了・プリエンプション(=持ち時間切れで横取りされたとき)
・実行中 → 待機:I/O要求などで処理を一時停止したとき
・待機 → 実行可能:待っていたI/Oが完了したとき
ここで特に注意したいのが、実行可能から待機への直接の遷移は無いという点です。待機に入れるのは「実行中のタスクがI/Oを要求したとき」だけだからです。まだ動いてもいないタスクが、いきなりI/Oの完了を待つことはありません。
同じく、待機からいきなり実行中へも移りません。I/Oが完了したらまず実行可能へ戻り、順番待ちに並び直します。CPUは1つしかないので、空くまで待つ必要があるからです。上のツールの矢印をたどると、どの遷移が「ある」か「無い」かを確かめられます。