Linux的进程pid编号极限

简介: 整理本文,起源是看到知乎上的一个问题,为什么Linux的进程pid编号极限最大值( process pid max)是131070?

整理本文,起源是看到知乎上的一个问题,为什么Linux的进程pid编号极限最大值( process pid max)是131070?

问题中提到,通过提问者的测试(Ubuntu18.04操作系统下),Python脚本实现的分配进行pid脚本,渠道系统自动分配给进程的最大pid值是131070,这是一个并不特殊的值。(通常可以想到的上限会是与二进制数字相关,例如1024,65536等等)。

很高兴,看到还是有很多人在坚持知乎的本来精神,先问是不是,再问为什么。  

Linux 内核的进程 PID 最大值并非 131070,而是 32768 (32 位系统)和 2 的 22 次方(64 位系统)。这是Linux手册中明确给出的说明:

/proc/sys/kernel/pid_max (since Linux 2.5.34)

This file specifies the value at which PIDs wrap around (i.e., the value in this file is one greater than the maximum PID). PIDs greater than this value are not allocated; thus, the value in this file also acts as a system-wide limit on the total number of processes and threads. The default value for this file, 32768, results in the same range of PIDs as on earlier kernels. On 32-bit platforms, 32768 is the maximum value for pid_max. On 64-bit systems, pid_max can be set to any value up to 2^22 (PID_MAX_LIMIT, approximately 4 million).

为了方便理解,上述内容翻译成中文:

/proc/sys/kernel/pid_max (从Linux 2.5.34版本开始)

这个文件明确指定了pid的取值范围(也就是说,文件中的值是允许的最大pid值+1)。比这个数字大的值将不会分配为pid。因此,此文件中的值还作为系统范围内进程和线程总数的限制。此文件的默认值32768,与早期内核的PID范围相同。 在32位系统中,32768是pid_max的最大值。64位系统,pid_max最大可达2^22。(PID_MAX_LIMIT,约4亿)。

到达极限的情况:

1、当 PID 达到上限后,内核会从 0 重新开始寻找可用的 PID 并分配。

2、而所有 PID 均已被占用的话,则将抛出

fork failed: Resource temporarily unavailable

提问者所说的最大值应该只是发行版设置( CentOS 8.0 64 位上为 400w 左右)。通过上述Linux手册中的说明,我们也可以通过修改/proc/sys/kernel/pid_max 这个文件的值来调整pid的取值范围。

在测试环境的机器上查看了这个文件的设置(系统版本:Linux 3.10.0-1127.18.2.el7.x86_64):

可见,虽然是64位系统,但默认也设置了32768,确实如手册中描述一致。通过:

echo value > /proc/sys/kernel/pid_max

手动修改,可以设置预期的最大pid数值(2^22以下)

附Linux内核源码地址:

官网链接:https://www.kernel.org/

git: https://git.kernel.org/

镜像:https://mirrors.edge.kernel.org/pub/

相关文章
|
1天前
|
弹性计算 运维 Shell
统计Linux 进程相关数量信息
【4月更文挑战第29天】
5 0
|
1天前
|
弹性计算 运维 Shell
统计 Linux 进程相关数量信息
【4月更文挑战第29天】
6 1
|
7天前
|
存储 Linux
【linux进程信号(二)】信号的保存,处理以及捕捉
【linux进程信号(二)】信号的保存,处理以及捕捉
|
7天前
|
NoSQL Linux 程序员
【linux进程信号(一)】信号的概念以及产生信号的方式
【linux进程信号(一)】信号的概念以及产生信号的方式
|
7天前
|
消息中间件 Linux
【linux进程间通信(二)】共享内存详解以及进程互斥概念
【linux进程间通信(二)】共享内存详解以及进程互斥概念
|
7天前
|
Linux
【linux进程间通信(一)】匿名管道和命名管道
【linux进程间通信(一)】匿名管道和命名管道
|
7天前
|
Java Shell Linux
【linux进程控制(三)】进程程序替换--如何自己实现一个bash解释器?
【linux进程控制(三)】进程程序替换--如何自己实现一个bash解释器?
|
7天前
|
存储 Linux C语言
【linux进程控制(一)】进程终止--如何干掉一个进程?
【linux进程控制(一)】进程终止--如何干掉一个进程?
|
7天前
|
安全 Linux 编译器
【linux进程(七)】程序地址空间深度剖析
【linux进程(七)】程序地址空间深度剖析
|
Linux 调度
LINUX PID 1和SYSTEMD 专题
  Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2) idle进程其pid=0,其前身是系统创建的第一个进程,也是唯一一个没有通过fork或者kernel_thread产生的进程。
1259 0

热门文章

最新文章