OSの役割として資源管理があると以前の記事で解説しました。その中で、プロセスの管理について本記事では解説していきます。特にプロセスの状態遷移について詳しく解説します。
プロセスとは
まずは、プロセスという単語については明確な定義はなく、さまざまなものが存在します。
OSという文脈では、CPUのスケジューリングの対象となる基本単位として、特定の仕事を遂行するために一連の操作系列を実行する活動のことを言います。プロセスはタスクとも呼ばれます。
あくまで、動的な概念であって、静的なプログラムファイルとは異なるものなので、そこは注意しましょう。
以下のようなさまざまな定義、見方があります。
- 実行中のプログラム
- プログラムの活性化された実態
- CPUが割り当てられた実体
プロセスの管理(概要)
プロセスを管理する上で、プロセッサで実行する、あるいは実行すべきプロセスを効率よくプロセッサへ割り当てることが求められます。OSは、このプロセスの管理を担います。
プロセス管理でOSが担当するタスクは実行するプロセスをプロセッサに割り当てる、実行前にメインメモリにプロセスに配置する、これらのタスクを担当します。
ここで、プロセッサにプロセスを割り当てることをプロセスディスパッチとも言ったりします。特に今やっているプロセスを中断させて、他のプロセスに切り替えるような指示をプロセススイッチとも言います。
以下の図のようなイメージです。OSという管理人がプロセスAという仕事をプロセッサAという実務者Aに渡して、仕事を行ってもらうということをしています。この割り当てることをディスパッチと言ったりします。
他にもOSは、仕事と同じで、処理しないといけないプロセスが多くあると、それらを優先度をつけて実行順序を管理するのもOSの役割になっています。

現在は多くのPCには複数のプロセッサが搭載されていますが、過去は基本的には一つのプロセッサのみが搭載されていました。そのようなPCでもWord, WEBブラウザなど複数のアプリケーションが同時に実行することができていました。これはOSがうまく管理していたからこのようなことが実現できています。なぜこのようなことを実現できるのかを見ていきます。
プロセスの状態と遷移
プロセスの状態
これは仕事と同じで、タスクは複数あってその中で各タスクは待ち状態だったり、できるけど後回ししてるもの、実際に今仕事をしてタスクを進めているものと分かれているかと思います。これと同じようにプロセスも同じように状態があります。
プロセスは生成されてから、常に実行されているわけではなく、プロセスの状況に応じて状態が変わります。状態は複数あって、様々な状態を経て、プロセスは最終的には消滅します。
プロセスは、生成されてから消滅するまでに以下の図に示す3つの状態を遷移します。
- 実行可能状態
- この状態にいるプロセスはいつでも実行可能
- 事象待ちではなく、必要な資源も揃っている
- 待ち状態
- 事象の発生を待ち、ブロックされている状態
- 例えば入出力処理を待っている状態
- 実行状態
- プロセッサで実行中のプロセス
- 一つのプロセッサしかない場合、ある時刻においては一つしか実行できないため、常に一つしかない
- 実行できるプロセス数は搭載されているプロセッサ数に依存する(最大でもプロセッサ数)

ここで、実行可能状態と待ち状態の違いをよく勘違いしますが、決定的な違いは実行状態に遷移したときにすぐさま実行可能かどうかです。
待ち状態の場合は、例えば何かの処理を待っている時で、その先に進めない(ブロックされている)状態です。一方で、実行可能状態はすぐさま実行可能です。
待ち状態になった場合は、実質そのプロセスは何もできないので、プロセッサの時間を有効活用するために、その待ち時間を他のプロセスに割り当てるというのが考え方です。
プロセスの状態遷移
上の図を見ると状態遷移は4つあります。
- 実行可能状態から実行状態への遷移
- 実行状態から実行可能状態への遷移
- 実行状態から待ち状態への遷移
- 待ち状態から実行可能状態への遷移
これらについて一つずつ見ていきます。
1. 実行可能状態から実行状態への遷移
プロセスは生成されるとすぐに実行されるのではなく、ひとまず実行可能状態となります。実行可能状態のプロセスは複数存在します。OSではこれを実行状態に遷移させる権利があり、この遷移をディスパッチと言います。ディスパッチするプロセスはスケジューリングアルゴリズムによって決まります。これは別途記事にします。
実行中のプロセスが完了し終了したり、実行中のプロセスが待ち状態となって空いたときに、ディスパッチが発生します。
2. 実行状態から実行可能状態への遷移
これは今実行しているプロセスをOSが強制的に別のプロセスに割り当てるときに、この遷移は発生します。この遷移を横取り(プリエンプション)と呼びます。これは特定のプロセスがプロセッサを占有するのを防ぐためにこのような遷移があります。これをタイマを活用した時分割制御によって実現します。このようなあるプロセスAからプロセスBに切り替えるOSの機能をプロセススイッチと言います。
時分割制御とプロセススイッチは後で詳しく説明します。
3. 実行状態から待ち状態への遷移
実行中のプロセスは、何らかの処理を待つ操作を実行することによって、自ら待ち状態に遷移します。この遷移は入出力処理でよく発生します。
例えば、キー入力された文字に応じて処理を変化させるようなプロセスの場合、ユーザからの入力を待つ必要があります。このようなときに実行状態から待ち状態への遷移が発生します。
4. 待ち状態から実行可能状態への遷移
待ち状態となっているプロセスが何らかの事象により、そのプロセスは自ら実行可能状態へ遷移します。この遷移をウェイクアップと呼んだりもします。
入力待ちしていたキー入力が発生して、次の状態に移行できるようになったので遷移が発生します。
プロセススイッチ
実行中のプロセスを切り替えるOS機能をプロセススイッチといいます。実際には次の手順で行われます。
- プロセスAからOSへの切り替え
- OSによる処理
- 割り込み処理
- プロセススケジューリング
- プロセスディスパッチ
- OSからプロセス Bへの切り替え

時分割制御
時分割制御は、プロセッサ時間を細かく分割し、個々のプロセスに実行を割り当てるプロセッサ管理・制御方式のことを言います。数~数十ミリ秒程度のタイムスライス、タイムクォンタムと呼ばれるプロセスが連続して処理可能な時間量で制御されます。プロセスを切り替える機能のときにもプロセッサの時間は使用されます。このタイムスライスはハードウェアとしてタイマに設定し、設定した時間間隔ごとにタイマ割り込みが発生し、プロセススイッチによりプロセスの切り替えが発生します。

まとめ
本記事では、OSの機能として非常に重要なプロセスの管理について解説しました。特にプロセスの状態遷移について詳しく解説しました。
コメント