Linux 如何确定下一个 PID?

2024-11-07 08:55:00
admin
原创
32
摘要:问题描述: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 可以随机分配。有多种方法可以实现这一点。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用