How does Linux determine the next PID?
Linux如何确定它将用于进程的下一个PID? 这个问题的目的是为了更好地理解Linux内核。 不要害怕发布内核源代码。 如果顺序分配PID,Linux如何填补空白? 当它到达终点时会发生什么?
例如,如果我从Apache运行一个执行
当PID改变时,它将是一个接近的数字,但有多近? 该数字似乎并不完全是连续的。 如果我做
Linux如何选择下一个号码? 前几个PID仍在运行,以及最近打印的PID。 apache如何选择重用这些PID?
内核在(RESERVED_PIDS,PID_MAX_DEFAULT)范围内分配PID。它在每个命名空间中按顺序执行(不同命名空间中的任务可以具有相同的ID)。如果范围用尽,则pid赋值将包含在内。
一些相关代码:
里面的alloc_pid(...)
1 2 3 4 5 6 7 8 | 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()
1 2 3 4 5 6 7 8 9 10 11 12 | 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不仅仅是
PID在用户空间中不出现顺序的原因是因为内核调度可能会在进程'
我宁愿假设您观察到的行为源于另一个来源:
好的Web服务器通常有几个流程实例来平衡请求的负载。这些进程在池中进行管理,并在每次请求进入时分配给某个请求。为了优化性能,Apache可能会将同一进程分配给来自同一客户端的一堆顺序请求。在一定数量的请求之后,进程终止并创建一个新进程。
我不相信linux中按顺序为多个进程分配了相同的PID。
正如你所说新的PID将接近最后一个,我想Linux只是将每个进程分配给最后一个PID + 1.但是有一些进程弹出并在应用程序和系统程序的后台一直被终止,因此你无法预测接下来启动的apache进程的确切数量。
除此之外,您不应该使用任何关于PID赋值的假设作为您实现的东西的基础。 (另见sanmai的评论。)
PID在大多数系统上是顺序的。您可以通过在闲置计算机上自己启动多个进程来查看。
例如使用向上箭头历史记录调用重复运行打印自己的PID的命令:
1 2 3 4 5 6 7 8 | $ 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。
PID可以随机分配。有很多方法可以实现这一目标。