Linux如何确定下一个PID?

时间:2010-08-10 07:03:27

标签: linux apache linux-kernel kernel

Linux如何确定它将用于进程的下一个PID?这个问题的目的是为了更好地理解Linux内核。不要害怕发布内核源代码。如果顺序分配PID,Linux如何填补空白?当它到达终点时会发生什么?

例如,如果我从Apache运行一个执行<?php print(getmypid());?>的PHP脚本,则会在刷新时打印出相同的PID几分钟。这段时间是apache接收的请求数量的函数。即使只有一个客户端,PID最终也会改变。

当PID改变时,它将是一个接近的数字,但有多近?该数字似乎并不完全是连续的。如果我做ps aux | grep apache,我会得到相当多的流程:

enter image description here

Linux如何选择下一个号码?前几个PID仍在运行,以及最近打印的PID。 apache如何选择重用这些PID?

4 个答案:

答案 0 :(得分:49)

内核在(RESERVED_PIDS,PID_MAX_DEFAULT)范围内分配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;
}

alloc_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()调用之间分配进程。事实上,这很常见。

答案 1 :(得分:11)

我宁愿假设您观看的行为来自其他来源

好的Web服务器通常有几个流程实例来平衡请求的负载。这些进程在池中进行管理,并在每次请求进入时分配给某个请求。为了优化性能,Apache可能会将同一进程分配给来自同一客户端的一堆顺序请求。在一定数量的请求终止进程并创建新进程后。

我不相信linux中按顺序为多个进程分配了相同的PID。

正如你所说新的PID将接近最后一个,我猜Linux只是将每个进程分配给最后一个PID + 1.但是有一些进程在应用程序和系统的后台一直弹出并被终止程序,因此您无法预测接下来启动的apache进程的确切数量。

除此之外,你应该使用任何关于PID赋值的假设作为你实现的东西的基础。 (另见sanmai的评论。)

答案 2 :(得分:8)

大多数系统上的PID are sequential。您可以通过在闲置计算机上自己启动多个进程来查看。

e.g。使用向上箭头历史记录调用重复运行打印自己的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。

答案 3 :(得分:4)

PID可以随机分配。有a number of ways来实现这一目标。