为什么PID值不连续?


Answers:


16

在Ubuntu上,它们是连续的。在其他操作系统上,可能会有所不同。

内核在(RESERVED_PIDS,PID_MAX_DEFAULT)范围内分配PID。它在每个名称空间中按顺序执行操作(不同名称空间中的任务可以具有相同的ID)。如果范围已用尽,则会分配pid分配。

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

记住...

  • 内核调度可以派生一个进程,因此它似乎可以跳过数字。
  • 当该任务结束时,PID将消失。
  • 在达到PID_MAX_DEFAULT之前,不会重新使用PID。
  • 备用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命令中未显示的另一个进程的子进程。要查看一些扩展结果,您可以使用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仅列出正在运行的进程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.