プロセスは「新規→準備完了→実行→…→終了」という決まった状態を行き来します。誰が、いつ、なぜ状態を変えるのかを可視化します。
プロセスは、生まれてから死ぬまで決まった状態(state)を行き来します。これをプロセス状態遷移と呼びます。基本は 準備完了 / 実行 / 待機 の3状態モデル、拡張版で 新規 / 終了 を加えた5状態モデルです。
身近な例えでは、「コールセンターのオペレーター」に似ています。電話が掛かってくるまで待機列で待ち(準備完了)、自分の番が来て応対中(実行)、お客様の保留中(待機)、対応終了(終了)── と決まった流れがあります。スーパーバイザー(OS)が誰を応対担当に回すか決め、対応時間が長すぎると交代させたりします。
上のツールで「基本のライフサイクル」を ▶ 再生すると、プロセスが状態を順に渡り歩く流れを観察できます。
プロセスがとる主要な状態は 3つ。これがプロセス状態遷移の基本骨格です。
・準備完了(Ready):CPU を待っている状態。実行可能だが、まだ CPU が回ってきていない
・実行(Running):CPU で実際に命令を実行中。同時に1つだけがこの状態(1コアの場合)
・待機(Waiting / Blocked):I/O 完了や他プロセスの応答などを待っている。CPU は使わない
この3つの違いは「CPU を使えるか / 使っているか / 待ちで使えないか」で区別できます。特に準備完了と待機の違いが重要で、準備完了は「いつでも実行できるけど順番待ち」、待機は「外部要因が解決しないと実行を再開できない」です。
| イベント | 遷移 | 誰が起こす? |
|---|---|---|
| ディスパッチ | 準備完了 → 実行 | スケジューラ |
| タイムアウト | 実行 → 準備完了 | タイマー割り込み |
| I/O 要求 | 実行 → 待機 | プロセス自身 |
| I/O 完了 | 待機 → 準備完了 | 装置からの割り込み |
状態遷移はイベントで引き起こされます。プロセス自身が起こすもの、OS のタイマーが起こすもの、外部装置が起こすものに分かれます。
特に重要なのは:
・ディスパッチ:「準備完了 → 実行」を引き起こす。スケジューラの仕事
・タイムアウト(プリエンプション):「実行 → 準備完了」。タイマー割り込みで強制的に CPU を取り上げる
・ブロック(I/O 要求):「実行 → 待機」。プロセス自身が外部処理を要求した瞬間に発生
・ウェイクアップ(I/O 完了):「待機 → 準備完了」。外部装置から「処理終わったよ」の通知を受けて目を覚ます
実行中のプロセスから OS が強制的に CPU を取り上げることをプリエンプション(preemption)と呼びます。これによって 1つのプロセスが CPU を占有し続けないように制御しています。
仕組み:
・OS はタイマー割り込みを一定間隔(例: 10ms)で発生させる
・割り込みを受けた OS は「もうこのプロセスのタイムスライスは切れた」と判断
・プロセスを準備完了状態に戻し、別のプロセスにディスパッチ
このおかげで、複数のプロセスがあたかも同時に動いているように見えるのです(実際は超高速で交代しているだけ)。上のツール「タイムアウト」シナリオで、P1 と P2 が交互に CPU を使う様子を確認できます。
「実行」と「準備完了」だけでは足りません。プロセスがディスクからファイルを読んだり、ネットワークから応答を待ったりするとき、CPU は数百万〜数十億サイクル分も待たされます。その間ずっと CPU を独占していたら大きな無駄です。
そこで OS は次のように動きます:
・プロセスが I/O 要求をしたら待機状態に移し、CPU を取り上げる
・空いた CPU を準備完了の別プロセスに渡す
・I/O が完了したら、待機中のプロセスを準備完了状態に戻す(wakeup)
・また順番が来たら実行を再開
この仕組みのおかげで、複数プロセスを抱えていても CPU を遊ばせないマルチタスクが実現できます。上のツール「I/O 待ちのフロー」を ▶ 再生すると、P1 が待つ間に P2 が CPU を使う様子が確認できます。
3状態モデルを拡張し、プロセスの誕生と終了を明示的に扱うのが5状態モデルです。基本は3状態モデルですが、5状態モデルも合わせて理解しておくとよいでしょう。
・新規(New):プロセス生成中。PCB は作成中だがまだスケジュールには参加しない
・終了(Terminated):実行が終わり、メモリ等の片付け中
3状態モデルで覚えてから、5状態は「新規が前に追加、終了が後ろに追加」と覚えれば十分。さらに「中断(suspended)」を加えた7状態モデルもあります。
状態が変わるたびに必ず理由(イベント)があります。「誰が・なぜ」を理解すると、状態遷移図が暗記ではなく理屈で分かるようになります。
準備完了 → 実行(dispatch):OSのスケジューラ(=プロセスに番を割り振る係)が準備完了の中から1つ選んでCPUを渡します。次に実行するプロセスをどう選ぶかはスケジューリングアルゴリズム(到着順・優先度順など)で決まります。
実行 → 準備完了(timeout):OSは一定時間ごとにタイマー割り込み(=強制的な中断信号)を発生させます。これでプロセスが長く居座るのを防ぎ、別のプロセスに順番を回します。これがプリエンプション(強制的な交代)の仕組みです。
実行 → 待機(I/O要求):プロセス自身がディスク読み込みやネットワーク応答待ちをOSに依頼した瞬間、OSはそのプロセスを待機状態に移してCPUを別のプロセスに渡します。プロセスが「自分から止まる」遷移です。
待機 → 準備完了(I/O完了):外部装置が処理を終えると割り込み(=「終わったよ」の信号)でOSに通知します。OSが待機中のプロセスを準備完了キューに戻します。
1つのCPUコアは、ある瞬間に実行できるのは1つのプロセスだけです。それなのに「複数のアプリが同時に動いている」ように見えるのはなぜでしょうか。
答えは超高速の切り替えにあります。OSのスケジューラは数ミリ秒(1ミリ秒=0.001秒)単位でプロセスを切り替え続けます。人間の目にはその切り替えが見えないので、まるで同時に動いているように感じます。これをマルチタスク(複数の仕事を並行してこなす仕組み)と呼びます。
上の図では、P1とP2がCPUを交互に使っている様子を表しています。それぞれが「実行」→「準備完了(待ち)」→「実行」を繰り返し、全体としてどちらも少しずつ進んでいます。状態遷移図を理解すると、この「なぜ同時に動いて見えるのか」というマルチタスクの仕組みが自然に分かるようになります。