II-8-4. プロセスの生成と管理

プロセスの概念を簡単に説明し、forkシステムコールによって新たにプロセスを生成する方法、プロセス管理情報を得る方法、procファイルシステムを利用したプロセス情報の取得など、プロセスの生成と管理を行うプログラミング手法を紹介する。

【学習の要点】

* プロセスとは、カーネルによって管理される実行の単位である。すべてのプロセスはカーネルによってプロセスIDというユニークな番号が与えられる。

* あるプロセスが、新しくプロセスを生成するには、forkシステムコールを用いる。forkによって生成されたプロセスは、それを呼び出したプロセスの子プロセスとなる。

* カーネルはprocインタフェースを使用してプロセス情報をユーザに公開する。通常/procにマウントされる疑似ファイルシステムにあるプロセスIDが名前となったディレクトリ下のファイルから、そのプロセスに関する情報が取得できる。

図II-8-4. プロセスのforkとjoin

【解説】

1) プロセスの生成

* あるユーザプロセスは、forkシステムコールを使って自分自身の複製を生成することができる。複製によって生成されたプロセスは、forkを呼び出したプロセスの子プロセスと呼ばれ、それに対してforkを呼び出した側を親プロセスという。

* Linuxの多くのディストリビューションでは、すべてのプロセスはinitプロセスの子プロセスである。initプロセスは、カーネルが最初に生成するユーザプロセスである。

* 子プロセスは、ファイル記述子などのプロセスリソースを親プロセスと共有することができる。アドレス空間はコピーが作成され、それぞれ独立して管理される。

* 子プロセスは、exec系システムコールにより、親プロセスとは別のプログラムに置き換えることができる。

* fork後は親プロセスと子プロセスの処理は並列して実行されるが、親プロセスは、waitシステムコールにより、子プロセスの終了を待つことができる。

* 子プロセスの生成から終了までの一般的な流れ

- 親プロセス: forkシステムコールにより子プロセスを生成

- 親プロセス: (処理)

- 親プロセス: waitシステムコールにより、子プロセスの終了を待つ

- 子プロセス: execveにより自分自身を他のプログラムに置き換え

- 子プロセス: (処理)

- 子プロセス: exitシステムコールにより終了

- 親プロセス: 子プロセスの終了を検知

* 親プロセスと子プロセスは、そのままではアドレス空間は共有しない。これらのプロセスが互いに通信するには、シグナルまたはパイプ、共有メモリあるいはソケットを利用する。

2) プロセスの確認

* 通常/procにマウントされるproc疑似ファイルシステムは、現在システム上に存在するプロセスに関する情報を取得するための仕組みを提供する。

* /proc下にあるプロセスIDディレクトリ内には、statusファイルなどが存在し、シェル上からプロセス情報を取得するのに便利である。

* /proc直下には、meminfoやcpuinfoファイルが存在する。これらはそれぞれ、システムに搭載されている物理メモリ/仮想メモリに関する情報と、CPUに関する情報を含む。

* /proc下にあるプロセス毎の情報は、top(1)やps(1)シェルコマンドを使用して一覧表示することができる。

OSS Course Naviのコンテンツは IPA OSS モデルカリキュラムを基としています。

フォーラム会員企業専用

記事配信

コンテンツ配信

ユーザログイン