Linux 如何确定下一个 PID?
- 2024-11-07 08:55:00
- admin 原创
- 33
问题描述:
Linux 如何确定它将用于进程的下一个 PID?这个问题的目的是为了更好地理解 Linux 内核。不要害怕发布内核源代码。如果 PID 是按顺序分配的,Linux 如何填补空白?当它到达末尾时会发生什么?
例如,如果我从 Apache 运行一个 PHP 脚本,则<?php print(getmypid());?>
在点击刷新时,相同的 PID 会打印出来几分钟。这段时间取决于 Apache 正在接收多少请求。即使只有一个客户端,PID 最终也会改变。
当 PID 改变时,它将是一个接近的数字,但有多接近呢?这个数字似乎不是完全连续的。如果我执行以下命令,ps aux | grep apache
我会得到相当多的进程:
Linux 如何选择下一个数字?前几个 PID 仍在运行,以及打印的最新 PID。Apache 如何选择重用这些 PID?
解决方案 1:
内核在 (RESERVED_PIDS, PID_MAX_DEFAULT) 范围内分配 PID。它在每个命名空间中按顺序分配 PID(不同命名空间中的任务可以具有相同的 ID)。如果范围已用尽,则 pid 分配将回绕。
一些相关代码:
在 alloc_pid(...) 内部
for (i = ns->level; i >= 0; i--) {
nr = alloc_pidmap(tmp);
if (nr < 0)
goto out_free;
pid->numbers[i].nr = nr;
pid->numbers[i].ns = tmp;
tmp = tmp->parent;
}
分配pidmap()
static int alloc_pidmap(struct pid_namespace *pid_ns)
{
int i, offset, max_scan, pid, last = pid_ns->last_pid;
struct pidmap *map;
pid = last + 1;
if (pid >= pid_max)
pid = RESERVED_PIDS;
/* and later on... */
pid_ns->last_pid = pid;
return pid;
}
请注意,内核上下文中的 PID 不仅仅是int
标识符;相关结构可以在 中找到/include/linux/pid.h
。除了 id,它还包含具有该 id 的任务列表、引用计数器和用于快速访问的散列列表节点。
PID 在用户空间中不按顺序出现的原因是内核调度可能会在进程fork()
调用之间分叉一个进程。事实上,这很常见。
解决方案 2:
我宁愿假设你所观察到的行为源自另一个来源:
好的 Web 服务器通常有多个进程实例来平衡请求的负载。这些进程在一个池中进行管理,每次收到请求时分配给特定请求。为了优化性能,Apache 可能会将同一个进程分配给来自同一客户端的一系列连续请求。在一定数量的请求之后,该进程将终止并创建一个新进程。
我不相信Linux会按顺序为多个进程分配相同的PID。
正如您所说,新的 PID 将接近最后一个,我猜 Linux 只是为每个进程分配最后一个 PID + 1。但是有一些进程在后台被应用程序和系统程序弹出并被终止,因此您无法预测下一个启动的 apache 进程的确切数量。
除此之外,您不应使用任何有关 PID 分配的假设作为您实现某些东西的基础。(另请参阅 sanmai 的评论。)
解决方案 3:
在大多数系统中, PID是连续的。您可以通过在空闲机器上自行启动多个进程来看到这一点。
例如,使用向上箭头历史记录调用来重复运行打印其自身 PID 的命令:
$ ls -l /proc/self
lrwxrwxrwx 1 root root 0 Mar 15 19:32 /proc/self -> 21491
$ ls -l /proc/self
lrwxrwxrwx 1 root root 0 Mar 15 19:32 /proc/self -> 21492
$ ls -l /proc/self
lrwxrwxrwx 1 root root 0 Mar 15 19:32 /proc/self -> 21493
$ ls -l /proc/self
lrwxrwxrwx 1 root root 0 Mar 15 19:32 /proc/self -> 21494
不要依赖于此:出于安全原因,有些人运行的内核会花费额外的 CPU 时间来随机选择新的 PID。
解决方案 4:
PID 可以随机分配。有多种方法可以实现这一点。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件