プロセス識別子(PID)とは
プロセス識別子(
プロセスID、PIDと略記)は、
オペレーティングシステム(OS)が実行中の
プロセスを識別するために使用する番号です。主に
Unix系やWindows系のOS
カーネルで用いられ、各
プロセスに一意の識別子を付与します。このPIDを使って、
プロセスの優先順位の調整、終了、情報の取得など、さまざまな操作が行われます。
Unix系OSでは、`fork()`
システムコールによって新しい
プロセスが生成されます。この時、子
プロセスのPIDが親
プロセスに返され、親
プロセスは子
プロセスの状態を監視したり、終了させたりできます。具体的には、`waitpid()`関数で子
プロセスの終了を待ち合わせたり、`kill()`コマンドで
プロセスを強制終了させたりします。
Unix系OSでは、PID 0と1は特別なタスクに割り当てられています。PID 0は`swapper`または`sched`と呼ばれ、ページングを担当する
カーネルの一部です。PID 1は`init`
プロセスで、システムの起動とシャットダウンを担います。かつては
カーネルが最初に起動する
プロセスにPID 1が付与されていましたが、現在では`init`
プロセス用に積極的に予約されていることが多くなっています。また、
カーネルスレッドをサポートするシステムでは、
カーネルの複数の
プロセスがスレッドとして識別され、PID 0のみを使用する場合もあります。
PIDは通常、
プロセスが生成された順に小さい値から割り当てられ、最大値に達すると値が巻き戻ります。この巻き戻り時の開始番号はシステムによって異なります(例:macOSや
HP-UXでは100)。ただし、既存の
プロセスが使用中のPIDはスキップして割り当てることで、PIDが重複しないようにします。このPID割り当ての仕組みを利用してシステム情報を取得できるため、セキュリティ上の脆弱性となり得ると指摘されています。セキュリティを重視する実装では、PID割り当て方針を変更することもあります。
MPE/iXなどのシステムでは、利用可能な最小のPIDを再利用し、メモリ上の
プロセス情報の
カーネルページ数を最小限に抑えることがあります。
WindowsにおけるPID
Microsoft Windowsでは、自身のPIDは`GetCurrentProcessId()` APIで取得でき、他の
プロセスのPIDは`GetProcessId()` APIで取得します。Windows内部では、
プロセス識別子はクライアントIDとして扱われ、スレッドIDと同じ名前空間から割り当てられるため、両者が重複することはありません。システムアイドル
プロセスのPIDは0、システム
プロセスのPIDは4です。
PIDの取得方法
Unix系OSでは、自身のPIDは`getpid()`
システムコールで取得でき、シェルでは`$$`という変数で参照できます。また、親
プロセスのPIDは`getppid()`
システムコールで取得できます。
Linuxでは、PIDの最大値は`/proc/sys/kernel/pid_max`ファイルに記録されています。
PIDファイル
長時間動作する
プロセス(例:
MySQLデーモンなど)は、自身のPIDをファイルに書き出すことがあります。これにより、他の
プロセスがPIDを参照し、その
プロセスを制御できるようになります。
セキュリティ上の注意
PIDの割り当てや利用方法によっては、セキュリティ上の脆弱性につながる可能性があります。そのため、PIDを扱う際には十分に注意を払い、適切なセキュリティ対策を講じる必要があります。
まとめ
プロセス識別子(PID)は、OSが
プロセスを管理するために不可欠な情報であり、
プロセスの操作やシステム監視に広く利用されています。PIDの仕組みを理解することは、システム運用やセキュリティ対策において非常に重要です。
関連項目
pidof
ユーザー識別子 (UID)
* グループ識別子 (GID)