プロセス識別子

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

 概要 
Unix系OSでは、新たなプロセスは fork() システムコールで生成される。そのときに生成された子プロセスのPIDがシステムコールを行った親プロセスに戻り値として返される。すると親プロセスは例えば、子プロセスの終了を  関数で待ち合わせたり、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に戻されて、再び増加していく。macOS や HP-UX では巻き戻し時の開始番号は100となっている。そのとき、現存しているプロセスが使用中のPIDはスキップして二重に割り当てないようにする。この性質を利用してシステムに関する情報を抽出可能であり、このことが潜在的なセキュリティ上の脆弱性だと考える者もいる。そのため、セキュリティ強化を心がけた実装をする場合、PID割り当て方針を通常とは異なるものにすることもある。MPE/iX などのシステムでは、利用可能な最小のPIDを使用し（つまり、終了したプロセスのPIDを即座に再利用することがある）、メモリ上のプロセス情報のカーネルページ数を最小化する。

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

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

Linuxでは、プロセス識別子の最大値は擬似ファイル  にある。

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

 脚注 

 参考文献 

 関連項目 
 pidof
 ユーザー識別子 (UID)
 グループ識別子 (GID)

Category:OSのプロセス管理