如果我们输入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
仅列出正在运行的进程。