プロセス識別子(プロセスしきべつし、プロセスIDPIDと略記)は、いくつかのオペレーティングシステムカーネルUnix系Windows)で使われている番号で、ある時点で存在するプロセスを一意に識別するために用いられる。優先順位を調整したり、終了させたり等、プロセス(群)を操作する様々な関数の引数として使う。

概要 編集

Unix系OSでは、新たなプロセスは fork() システムコールで生成される。そのときに生成された子プロセスのPIDがシステムコールを行った親プロセスに戻り値として返される。すると親プロセスは例えば、子プロセスの終了を waitpid()英語版 関数で待ち合わせたり、kill() でプロセスを終了させたりする。

Unix系OSでは、プロセス識別子 0 と 1 は特別なタスクを指している。プロセス識別子 0 は swapper または sched と呼ばれ、ページングを担当している。これは実はカーネルの一部であり、ユーザーモードのプロセスではない。プロセス識別子 1 は init プロセスで、主にシステムの立ち上げとシャットダウンを担当している。本来、プロセス識別子 1 は init のために予約されていたわけではなく、単にカーネルが最初に起動するプロセスだったためにこのPIDが init に付与されただけだった。最近のUnix系OSはカーネルの複数のコンポーネントをプロセスとして見せていることがある。その場合、PID 1 は init プロセス用に積極的に予約されていて、古いシステムとの互換性を保っている。カーネルスレッドをサポートするシステムでは、カーネルの複数のプロセスはスレッドとして識別され、プロセス識別子は0しか使用しないこともある。

Unix系OSでは、プロセス識別子はプロセスが生成される順に0から始めて値の小さいほうから付けていく。PIDの最大値はシステムによって異なる。最大値まで使ったとき、PID割り当ては例えば300に戻されて、再び増加していく。macOSHP-UX では巻き戻し時の開始番号は100となっている。そのとき、現存しているプロセスが使用中のPIDはスキップして二重に割り当てないようにする。この性質を利用してシステムに関する情報を抽出可能であり、このことが潜在的なセキュリティ上の脆弱性だと考える者もいる。そのため、セキュリティ強化を心がけた実装をする場合、PID割り当て方針を通常とは異なるものにすることもある[1]MPE/iX などのシステムでは、利用可能な最小のPIDを使用し(つまり、終了したプロセスのPIDを即座に再利用することがある)、メモリ上のプロセス情報のカーネルページ数を最小化する。

Microsoft Windows では、自身のプロセス識別子は GetCurrentProcessId() というAPIで取得し[2]、他のプロセスのプロセス識別子は GetProcessId() というAPIで取得する[3]。内部的にはプロセス識別子を client ID と呼び、thread ID と同じ名前空間から割り当てられるので、両者は決してオーバーラップしない。いわゆるシステムアイドルプロセス英語版のプロセス識別子は0で、システムプロセスのプロセス識別子は4が割り当てられる。

Unix系OSでは、自身のプロセス識別子は getpid() システムコールで得られ、シェルでは $$ という変数で得られる。親プロセスのプロセス識別子は getppid() システムコールで得られる。

Linuxでは、プロセス識別子の最大値は擬似ファイル /proc/sys/kernel/pid_max にある[4]

pidファイル 編集

長時間動作し続けるプロセス(例えば MySQL デーモンなど)は、自身のPIDをファイルに書いておき、他のプロセスが参照できるようにしていることがある。

脚注 編集

  1. ^ comp.unix.aix Frequently Asked Questions”. 2008年7月21日閲覧。
  2. ^ GetCurrentProcessId Function”. Windows Developer Center. 2009年5月20日閲覧。
  3. ^ ProcessId Function”. Windows Developer Center. 2011年3月5日閲覧。
  4. ^ proc - process information pseudo-filesystem”. Linux Programmer's Manual. 2009年12月28日閲覧。

参考文献 編集

この記事は2008年11月1日以前にFree On-line Dictionary of Computingから取得した項目の資料を元に、GFDL バージョン1.3以降の「RELICENSING」(再ライセンス) 条件に基づいて組み込まれている。

関連項目 編集