
コンピューティングにおいて、プロセスとは、1つまたは複数のスレッドによって実行されるコンピュータプログラムのインスタンスのことです。プロセスモデルにはさまざまな種類があり、軽量なものもありますが、ほとんどすべてのプロセス(仮想マシン全体を含む)は、プログラムコード、割り当てられたシステムリソース、物理的および論理的なアクセス権限、実行アクティビティの開始、制御、調整を行うためのデータ構造を含むオペレーティングシステム(OS)プロセスに基づいています。OSによっては、プロセスは命令を並行して実行する複数の実行スレッドで構成される場合があります。[ 1 ] [ 2 ]
コンピュータプログラムは、通常ディスク上のファイルに格納された一連の命令の受動的な集合体であるのに対し、プロセスは、ディスクからメモリに読み込まれた命令を実行するプロセスです。同じプログラムに複数のプロセスが関連付けられる場合があり、例えば、同じプログラムを複数起動すると、複数のプロセスが実行されることがよくあります。
マルチタスクとは、複数のプロセスがプロセッサ(CPU)やその他のシステムリソースを共有できるようにする手法です。各CPU(コア)は一度に1つのプロセスを実行します。しかし、マルチタスクでは、各プロセッサが実行中のタスク間を、各タスクの完了を待つことなく切り替えることができます(プリエンプション)。オペレーティングシステムの実装によっては、タスクが開始されて入出力操作の完了を待つとき、タスクが自発的にCPUを解放するとき、ハードウェア割り込みが発生するとき、およびオペレーティングシステムのスケジューラがプロセスがCPU時間の割り当てを使い果たしたと判断したとき(例えば、Linuxカーネルの完全公平スケジューラによる場合)に、切り替えが行われます。
マルチタスクの一般的な形式は、CPUのタイムシェアリングによって実現されます。これは、ユーザーのプロセスやスレッド、さらには独立したカーネルタスクの実行をインターリーブする方法です。ただし、後者の機能はLinuxなどのプリエンプティブカーネルでのみ実現可能です。プリエンプションは、CPUバウンドプロセスよりも高い優先度が与えられる対話型プロセスに重要な副作用をもたらします。そのため、ユーザーはキーを押したりマウスを動かしたりするだけで、すぐにコンピューティングリソースが割り当てられます。さらに、ビデオや音楽再生などのアプリケーションには、何らかのリアルタイム優先度が与えられ、他の優先度の低いプロセスよりも優先されます。タイムシェアリングシステムでは、コンテキストスイッチが高速に実行されるため、複数のプロセスが同じプロセッサ上で同時に実行されているように見えます。このように複数のプロセスが同時に実行されるように見える状態を並行処理と呼びます。
セキュリティと信頼性を確保するため、最新のオペレーティングシステムのほとんどは、独立したプロセス間の直接通信を防止し、厳密に仲介・制御されたプロセス間通信を提供しています。


一般的に、コンピュータシステムのプロセスは、以下のリソースから構成される(または、以下のリソースを所有すると言われる)。
オペレーティングシステムは、アクティブなプロセスに関するこれらの情報のほとんどを、プロセス制御ブロックと呼ばれるデータ構造に保持します。スレッドまたは子プロセスをサポートするオペレーティングシステムでは、リソースの任意のサブセット(通常は少なくともプロセッサの状態)を、プロセスのそれぞれのスレッドに関連付けることができます。
オペレーティングシステムは、プロセスを分離し、必要なリソースを割り当てることで、プロセス同士の干渉やシステム障害(デッドロックやスラッシングなど)の発生を抑制します。また、オペレーティングシステムは、プロセス間通信のためのメカニズムを提供することで、プロセスが安全かつ予測可能な方法で相互作用できるようにします。
マルチタスクオペレーティングシステムは、プロセスを切り替えることで、多くのプロセスが同時に(つまり並列に)実行されているように見せかけますが、実際には、単一のCPU上で一度に実行できるプロセスは1つだけです(CPUに複数のコアがある場合は、マルチスレッドなどの同様の技術を使用できます)。[ a ]
一般的には、単一のプロセスはメインプログラムに、子プロセスは非同期サブルーチンのように動作する並列プロセスに関連付けられます。プロセスはリソースを所有すると言われ、そのプログラムのイメージ(メモリ内)もそのようなリソースの一つです。しかし、マルチプロセッシングシステムでは、多くのプロセスが同じメモリ上の同じ再入可能プログラムを実行したり、共有したりすることがありますが、各プロセスはそれぞれ独自のプログラムイメージを所有すると言われます。
組み込みオペレーティングシステムでは、プロセスはしばしば「タスク」と呼ばれます。「プロセス」(またはタスク)の意味は「時間を消費するもの」であり、「メモリ」は「空間を消費するもの」です。[ b ]
上記の説明は、オペレーティングシステムによって管理されるプロセスと、プロセス計算によって定義されるプロセスの両方に適用されます。
プロセスが待機を必要とする要求を行った場合、そのプロセスはブロックされます。プロセスがブロック状態にある間は、ディスクへのスワップの対象となりますが、仮想メモリシステムではこれは透過的です。仮想メモリシステムでは、プロセスのメモリ領域が実際にはディスク上に存在し、メインメモリ上に存在しない場合もあります。アクティブなプロセス/タスク(実行中のプログラム)の一部であっても、最近使用されていない場合は、ディスクへのスワップの対象となります。実行中のプログラムとそのデータのすべての部分が、関連するプロセスがアクティブであるために物理メモリに存在する必要はありません。

マルチタスクを可能にするオペレーティングシステムカーネルでは、プロセスが特定の状態を持つ必要があります。これらの状態の名前は標準化されていませんが、同様の機能を持っています。[ 1 ]
プロセス同士が通信する必要がある場合、アドレス空間の一部を共有するか、他の形式のプロセス間通信 (IPC) を使用する必要があります。たとえば、シェルパイプラインでは、最初のプロセスの出力を 2 番目のプロセスに渡す必要があり、以下同様です。別の例としては、協調的でありながら部分的に独立したプロセスに分解され、同時に実行できるタスク (つまり、並行処理または真の並列処理を使用する - 後者のモデルは並行実行の特殊なケースであり、実行準備が整ったプロセスに対して複数の CPU コアが利用可能な場合に実現可能です) があります。
異なるオペレーティングシステム(OS)を実行している異なるマシン上で、2つ以上のプロセスが同時に実行されることもあり得るため、通信と同期のためのメカニズム(分散コンピューティング用の通信プロトコルと呼ばれる)が必要となる(例:メッセージパッシングインターフェース(MPI))。
1960年代初頭までに、コンピュータ制御ソフトウェアは、例えばIBSYSのようなモニタ制御ソフトウェアから、実行制御ソフトウェアへと進化しました。コンピュータは次第に高速化しましたが、コンピュータ時間は依然として安価ではなく、十分に活用されていませんでした。このような環境下で、マルチプログラミングが可能になり、必要不可欠となりました。マルチプログラミングとは、複数のプログラムを同時に実行することです。当初は、単一プロセッサのコンピュータアーキテクチャの結果として、複数のプログラムが単一のプロセッサ上で実行され、限られたハードウェアリソースを共有していました。そのため、並行処理は逐次的なものでした。後に複数のプロセッサを搭載したシステムでは、複数のプログラムが並列に同時に実行されるようになりました。
プログラムは、プロセッサに対する一連の命令で構成されます。1つのプロセッサは一度に1つの命令しか実行できません。複数のプログラムを同時に実行することは不可能です。プログラムによっては、入力デバイスなど、大きな遅延を伴うリソースが必要になる場合や、プリンタへの出力など、処理に時間がかかる処理を開始する場合があります。このような場合、プロセッサは「アイドル状態」(未使用)になります。プロセッサを常に稼働状態に保つため、このようなプログラムの実行は中断され、オペレーティングシステムはプロセッサを別のプログラムの実行に切り替えます。ユーザーには、プログラムが同時に実行されているように見えます(これが「並列処理」と呼ばれる所以です)。
その後まもなく、「プログラム」という概念は「実行中のプログラムとそのコンテキスト」という概念へと拡張されました。プロセスという概念が生まれ、これは再入可能なコードの発明によって必要不可欠なものとなりました。スレッドはやや遅れて登場しました。しかし、タイムシェアリング、コンピュータネットワーク、マルチCPU共有メモリコンピュータといった概念の出現により、従来の「マルチプログラミング」は真のマルチタスク、マルチプロセッシング、そして後にマルチスレッドへと進化しました。