为什么PID值不连续?

为什么PID值不连续?

如果我们输入ps -ef,我们会得到一个进程列表。为什么 PID 号不连续?

答案1

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

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

https://stackoverflow.com/questions/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

答案2

其间缺失的进程 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

答案4

它们是连续的。PID 按顺序分配,直到达到最大限制。超过此限制后,它将从零重新开始。

因此,中缺少的 PID 只是ps -ef死进程的PID。请注意,ps -ef仅列出正在运行的进程。

相关内容