PIDと増分方法

PIDと増分方法

たとえば、10のプロセスがあるとします。

process p0 with PID 1.
process p1 with PID 2.
process p2 with PID 3.
process p3 with PID 4.
process p4 with PID 5.
process p5 with PID 6.
process p6 with PID 7.
process p7 with PID 8.
process p8 with PID 9.
process p9 with PID 10.

次のプロセスを終了するとき:

kill 7

そして、プロセスp6が正常に終了し、プロセスp5とp7の間に空きスペースがある。 p10をプロセスとして実行すると、カーネルはPID 11をp10に割り当てます。

問題は、カーネル(linuxとfreebsd)がp11プロセスにPID 7を割り当てるのではなく、増分PIDを割り当てる理由です。

ベストアンサー1

PIDは一度解放されると再利用されません。これにより、競合が発生し、最終的にセキュリティ制限を回避するために使用できるバグが発生する可能性があります(参照:PIDレースによるAndroidセキュリティバグの例)。

PIDが再利用されると、何らかの理由でPIDを保持するプロセス(例えば, 他のプロセスにシグナルを送信する) 通信しようとしているプロセスが終了したことをすぐに認識できない場合があります。 PIDがリサイクルされると、それを使用するプロセスが変更されたかどうかを確実に検出することは困難です。この再使用を遅らせると、競合の可能性が低くなります(不可能ではありませんが)。別の方法としては、最大PIDを上げること(完了)があります。例えばFedoraでは/proc/sys/kernel/pid_max)を参照してください。しかし、これは可能性を減らすだけです。

Linuxカーネルは最近pidfdsを追加しました。プロセスとそのPIDを推論する安定した方法を提供します。

おすすめ記事