プロセス

プロセスとは、処理のことである。情報処理においてプログラムの動作中のインスタンスを意味し、プログラムのコードおよび全ての変数やその他の状態を含む。オペレーティングシステム  によっては、プロセスが複数のスレッドで構成される場合があり、命令を同時並行して実行する。

1. 概要
-----

コンピュータプログラムは命令の受動的集合体である。プロセスはそれら命令の実際の実行である。同じプログラムに対応する複数のプロセスが存在しうる。例えば、同じプログラムのインスタンスをいくつか開始することは、複数のプロセスの実行を意味することが多い。

マルチタスクは複数のプロセスがプロセッサや他のシステム資源を共有するための技法である。各CPUはある時点には1つのタスクだけを実行している。しかし、マルチタスクでは各プロセッサに各タスク間で切り替えさせることができ、各タスクの終了を待たずに次々とタスクを実行できる。OSの実装にもよるが、タスク間切り替えは入出力操作の際に行われたり、タスクが明示的に切り替え可能であることを指示したり、ハードウェア割り込みの際に行われたりする。

マルチタスクの典型的形態としてタイムシェアリングがある。タイムシェアリングは、対話型ユーザアプリケーションの素早い応答を可能にする技法である。タイムシェアリングシステムでは、コンテキストスイッチが高速に行われる。そのため、同一プロセッサ上で複数のプロセスが同時に実行されているように見える。複数プロセスを同時に実行することを並行性  と呼ぶ。

セキュリティと信頼性のため、現代のOSは個々のプロセス間での直接の通信ができないようにしており、厳密に統制・制御されたプロセス間通信機能を提供している。

2. プロセスの構成
----------

一般に、プロセスは以下のようなリソースから構成される:

プログラムに対応する実行命令コードの「イメージ」
メモリには実行コードとプロセス固有データ、コールスタック、ヒープ領域などを格納している。
プロセスに割り当てられたリソースの記述子。例えば、ファイル記述子やファイルハンドル。
セキュリティ属性。プロセスの所有者やプロセスに関わるパーミッションなど。
プロセッサ状態。レジスタの内容、物理メモリのアドレッシングなど。「状態」はプロセス実行中はレジスタに存在し、そうでないときはメモリに存在する。OSは各プロセスのこれらの情報の大部分をプロセス制御ブロックというデータ構造に保持している。

これらリソースの一部、少なくともプロセッサの状態情報は、プロセスというよりもスレッドに対応している。

オペレーティングシステムはプロセス同士を分離させておいて必要なリソースを割り当て、プロセス間で互いに干渉しあってシステム障害を発生したりしないようにする。オペレーティングシステムはプロセス間通信の機構も用意してプロセスが安全に通信し合えるようにしている。

3. プロセスの分類
----------

プロセスは、その役割で分類すると、OSの機能を実現するシステムプロセスと、ユーザー権限で実行されるユーザープロセスがある。

プロセスは、そのプログラム部分の性質で分類すると、以下のようになる。

再配置可能 プロセスを補助記憶装置から主記憶装置に読み込む際、主記憶のどの位置に読み込んでも実行が可能なプログラム。アドレス指定が、プロセスの先頭アドレスからの相対位置で表現されていればよい。リロケータブルコードのうち、特に位置独立コードと呼ばれるものは、リンカやローダの機能に依らずとも自由な位置での実行が可能なコードであり、単にリロケータブルであるものとは区別される。 再使用可能 主記憶に読み込まれて実行を終えたプログラムが、再度の主記憶への読み込みを行うことなく再実行できることをいう。これには、実行し終えたプログラムをプログラム自身が書き換えない、実行後にプログラム内部変数に影響が残ってしまわないことなどが必要である。 再帰可能 自分自身を呼び出すことが可能なもの。 再入可能 プログラムの実行中、別のプロセスが同じプログラムを同時に実行できるもの。プログラム部分とデータ部分が別の記憶領域に分かれていて、コード部分だけ共有できればよい。同時実行したいプロセスは、データ部分だけ独自に新しく用意する。リエントラントなコードは、当然にリカーシブ、リユーザブルである。

4. 歴史
-----

コンピュータ制御ソフトウェアは1960年代初めまでに IBM 7090/94 IBSYS のような監視制御ソフトウェアから実行制御ソフトウェアへと発展した。コンピュータは高速化していったが、CPU時間は安価ではなく、しかも完全に使われたわけではない。そのためマルチプログラミングが必要とされ、また可能となった。

マルチプログラミングとは、複数のプログラムを同時に実行することを意味する。当初は単一のプロセッサ上で動作し、少ない資源を共有していた。マルチプログラミングはまた、より幅広い用語であるマルチプロセッシングの基本形態でもある。

プログラムは、プロセッサへの命令列で構成されている。単一のプロセッサは一度に1つの命令しか実行できない。つまり同時に複数のプログラムを実行することは不可能である。プログラムは長い待ち合わせが必要な計算資源を必要とすることがあり、時間のかかる操作を行うこともある。そういったとき、プロセッサは何もしていない「アイドル」状態になる。プロセッサを常に動作させるため、そういった入出力待ち状態のプログラムの実行を中断し、別のプログラムを起動または再開させる。ユーザーから見れば、複数のプログラムが同時に動作しているように見える。

間もなく「プログラム」の観念は「実行中プログラムとそのコンテキスト」という観念に拡張された。これがプロセスという概念の誕生である。

これは、リエントラントなコードの発明とともに必要になった。

スレッドという概念が生まれるのはその少し後になる。タイムシェアリングシステム、コンピュータネットワーク、マルチプロセッサ、メモリ共有型コンピュータなどが登場し、古い「マルチプログラミング」は真のマルチタスクやマルチプロセッシングにとって代わられ、さらにはマルチスレッドへと進化していったのである。

5. マルチタスクOSにおけるプロセス管理
---------------------

マルチタスクオペレーティングシステムでは多くのプロセスを並行実行するためにプロセス間でコンテキストスイッチを行うことがある。ただし1つのシングルコアCPUにおいては、ある一時点にひとつのプロセスしか実行できない。

主プログラムを1つのプロセスとし、それ以外を並列に動作するプロセス群として独立させ、非同期に動作するサブルーチンとして実装することもある。プロセスはリソースを所有しており、メモリ上のプログラムの「イメージ」はそのようなリソースの1つと言える。マルチプロセッシングシステムでは多くのプロセスが同じリエントラントなプログラムのメモリ上のコピーを共有しているが、プログラムの「イメージ」は個々のプロセスが所有していると言える。

組み込みシステムのオペレーティングシステムでは、プロセスをタスクと呼ぶことが多い。「プロセス」という用語は「時間を占める何か」であり、対照的に「メモリ」は「空間を占める何か」である。また、ジョブがユーザーから見た処理の単位であるのに対し、「プロセス」は、コンピュータ側から見た処理の単位である。

以上の説明はオペレーティングシステムに管理されるプロセスにも、プロセス計算で定義されるプロセスにも当てはまる。

プロセスが中断された状態ならば、ディスクにスワップアウトすることができるが、仮想記憶システムではこれは透過的であって、あるメモリブロックの内容がディスク上にあってメモリ上にないという状態は正常な状態である。動作中プロセスの「未使用」部分もディスクにスワップアウトすることができる。実行中プログラムやそのデータのいかなる部分も、対応するプロセスを実行するにあたって物理メモリ上に存在する必要はない。しかし、プロセスがディスク上のコードやデータを必要としたとき、実行が中断されてページングとして知られている方法でその内容が物理メモリに移動される。

6. プロセスの状態遷移
------------

マルチタスクが可能なOSのカーネルは、個々のプロセスの状態を保持する必要がある。この状態の名称は標準化されていないが、どのOSでも似たような機能を持っている。

以下の典型的なプロセス状態は多くのコンピュータシステム上で見られる。これらの状態のほとんどで、プロセスはメインメモリ上に存在する。

6.1. 生成
-------

プロセスが最初に作成されると、生成状態あるいは新規状態となる。この状態ではプロセスは走行可能状態にされるのを待つ。この状態遷移をさせるのはスケジューラである。多くのシステムではこの遷移が自動的に行われるが、リアルタイムオペレーティングシステムでは遅延が生じることがある。リアルタイムシステムで多くのプロセスを走行可能状態にしてしまうと、過飽和とシステムリソースの競合が発生し、プロセスのリアルタイム性を損なってしまう。

6.2. 走行可能
---------

走行可能状態あるいはスケジュール待ち状態のプロセスはメインメモリにロードされCPUによる実行を待っている。任意の時点の走行可能状態のプロセスは非常に多数になる可能性がある。例えば、プロセッサが1個のシステムでは一度にひとつのプロセスしか実行できないので、他のプロセスの多くは実行されるのを待っている状態となる。

6.3. 走行中
--------

走行中状態、実行中状態、活性状態などと呼ばれる。この状態のプロセスは現にCPU上で実行されている。この状態で割り当てられたタイムスライスを使い切ると走行可能状態に戻される。あるいはプログラムの実行が終了すれば終了状態になるし、何らかのリソースが必要になればブロック状態になるだろう。

6.4. ブロック状態
-----------

スリープ状態ともいう。プロセスはリソースを確保できないと、プログラム実行を続けられなくなるのでCPUから外されてブロック状態となる。プロセスはそのリソースが利用可能となるまでブロック状態のままとなるが、これがデッドロック状態を発生させることもある。ブロック状態のプロセスに対してオペレーティングシステムはリソースが利用可能となったことを知らせる。オペレーティングシステムはブロックされなくなったプロセスを再び走行可能状態にし、そこから走行中状態にディスパッチされると、プロセスは利用可能となったリソースを使用することになる。

6.5. 終了状態
---------

プロセスは走行中状態でプログラムの実行完了によって終了状態となるか、明示的に終了させられることもある。どちらの場合でもプロセスは終了状態になる。プロセスがこの状態になってもメモリから消去されない場合、この状態をゾンビ状態とも呼ぶ。

UNIX系オペレーティングシステムにおいて、ゾンビプロセス