プロセス識別子

プロセス識別子(PID)とは



プロセス識別子(プロセスID、PIDと略記)は、オペレーティングシステム(OS)が実行中のプロセスを識別するために使用する番号です。主にUnix系やWindows系のOSカーネルで用いられ、各プロセスに一意の識別子を付与します。このPIDを使って、プロセスの優先順位の調整、終了、情報の取得など、さまざまな操作が行われます。

Unix系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)

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。