PID値が連続していないのはなぜですか?


14

入力ps -efすると、プロセスのリストが取得されます。PID番号が連続していないのはなぜですか?

回答:


16

Ubuntuでは継続的です。他のオペレーティングシステムでは異なる場合があります。

カーネルは、(RESERVED_PIDS、PID_MAX_DEFAULT)の範囲でPIDを割り当てます。これは各名前空間で順番に行われます(異なる名前空間のタスクは同じIDを持つことができます)。範囲が使い果たされた場合、pidの割り当ては折り返します。

/programming/3446727/how-does-linux-determine-the-next-pid

でも気をつけて...

  • カーネルスケジューリングはプロセスをフォークすることができるため、番号をスキップしているように見える場合があります。
  • そのタスクが終了すると、PIDは消えます。
  • PIDは、PID_MAX_DEFAULTに達するまで再利用されません。
  • 予約済みPIDはスキップされます。

stackoverflowに関するいくつかのトピック:

コメントには、PIDの割り当てをテストするコマンドがあります。

for i in {1..20}; do sh -c 'echo $$'; done

「カーネルスケジューリングはプロセスを分岐させることができるため、番号をスキップしているように見える場合があります。」-カーネルは、実行するプロセスを決定しながらプロセスを作成できますか?それは奇妙に思えます。
user253751

スケジューラがプロセスを分岐することはかなり一般的です。おそらくこのビット:lxr.free-electrons.com/source/kernel/pid.c#L125で決定されます:)
Rinzwind

8

間に存在しないプロセスIDはすでに無効であり、それらのPIDは後のプロセスでカーネルによって再利用されます。

デッドプロセスはプロセステーブルに表示されないため(ゾンビを除く)、ps -ef表示されません。


3

通常、PIDは継続的ですが、コマンドを実行するまでに一部のプロセスが停止しますps -ef

また、一部のプロセスは、ps -efコマンドに表示されていない別のプロセスのサブプロセスである場合があります。拡張された結果を確認し、連続PIDを確認するには、pstree

pstree -p

サンプル出力:

   ├─teamviewerd(3468)─┬─{teamviewerd}(3474)
│                   ├─{teamviewerd}(3475)
│                   ├─{teamviewerd}(3476)
│                   ├─{teamviewerd}(3477)
│                   ├─{teamviewerd}(3478)

一方、実行ps -efすると、親プロセスのみが表示されます。

$ ps -ef | grep teamviewerd
root      3468     1  0 Jul15 ?        00:07:38 /opt/teamviewer9/tv_bin/teamviewerd -f

2

それらは連続的です。PIDは、上限に達するまで順番に割り当てられます。この制限の後、ゼロからやり直します。

したがって、欠落しているPID ps -efはデッドプロセスのものです。ps -ef実行中のプロセスのみがリストされることに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.