Linux 如何确定下一个 PID?

2024-11-07 08:55:00
admin
原创
203
摘要:问题描述:Linux 如何确定它将用于进程的下一个 PID?这个问题的目的是为了更好地理解 Linux 内核。不要害怕发布内核源代码。如果 PID 是按顺序分配的,Linux 如何填补空白?当它到达末尾时会发生什么?例如,如果我从 Apache 运行一个 PHP 脚本,则<?php print(getm...

问题描述:

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 可以随机分配。有多种方法可以实现这一点。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用