最初に
本記事は「プロセス」について少し掘り下げた解説記事となります。
ただしOSによって異なる箇所(例えばどこのメモリを確保するか等)やMMUの話はまたそのうち別の記事として解説しようと思います。
スレッドについては→【小ネタ】スレッドってなんだろう?という話
並列処理・並行処理については→【小ネタ】並列処理とは何か?そして並列処理と並行処理の違いとは?
非同期については→Unity非同期完全に理解するための第一歩~非同期処理とは何か~
プロセス
私達が普段起動し使用しているゲームやツール等、それら一つ一つのアプリケーションと、そのアプリケーションに対する「管理情報」をまとめたものが**プロセス
**と呼ばれます。OSから見た時には、プロセスが1つの実行単位となります。
プロセスは、アプリケーションのリソースを保持する機能と、アプリケーションの命令を実行する機能を持っています。
アプリケーション中で割り込みが入った場合には、現在のプロセスで処理中のデータを失う事なく別プロセスへ切り替えるために、CPUが現在の内部状態(レジスタやフラグなど)を保存し、プロセスがすぐに実行状態を読み込んで処理を復帰できるようにします。この時に保存されたCPUの内部状態の事を**コンテキスト
と呼びます。コンテキストはプログラムの実行と共に変化し続けています。プロセスはこのコンテキストの保存領域を用意・管理し、適切なタイミングで保存・復帰を行います。これをコンテキストスイッチ
**と呼びます。
1つのCPUが一定時間毎にコンテキストスイッチを用いることで複数のプロセスを同時に実行状態にすることができます。このような処理方法を**マルチタスク(またはマルチプロセス)
**と言います。
プロセスのメモリ確保
プロセス間は同じプログラムを使用していない限りはメモリを共有しません。それぞれ個別にリソースの割り当てが行われます。32bit版のWindowsでは、プロセスが利用できるメモリー空間は最大2GB(標準設定の場合)となっています。
プロセスはコアの数を増やすことでその分だけ並列処理を行うことができます。
プロセスから更にプロセスをforkして起動することも可能です。この場合プロセス同士で親子関係ができ、起動した側は「親プロセス」で起動された側は「子プロセス」と呼びます。この親子関係はセキュリティの設定や管理等にも使用されています。注意しておきたいのは、親子関係だとしてもお互い別々で仮想メモリ空間を使用し、実行タイミングも異なる点です。
並列処理を行っているプロセスが同じプログラムを使用しているのであれば(例えば親子関係のプロセス)、コード部分は共有で使用されています。しかし変数部分のデータはそれぞれ異なるので、MMUという機能が物理メモリ上には各プロセス毎に固有の領域が確保し、その物理領域にアクセスするための仮想アドレスを用意してくれます。なので、同一プログラムのプロセスを複数使用していたとしてもメモリ圧迫には留意する必要があります。
プロセスのメリットデメリット
メリット
OSによってプロセス同士は関与していないため、一つのプロセスがクラッシュしたとしても、他のプロセスはそのまま実行を続けます。
デメリット
スレッドに比べるとプロセス間の切り替えはメモリの切り替えを伴うため、遅くなってしまいます。