进程ID的最大值是多少?
另外,是否可以更改进程 ID?
答案1
在 Linux 上,您可以使用以下命令找到系统的最大 PID 值:
$ cat /proc/sys/kernel/pid_max
该值也可以使用同一文件写入,但该值只能扩展到理论最大值 32768 (2^15)(对于 32 位系统)或 4194304(2^22)(对于 64 位系统):
$ echo 32768 > /proc/sys/kernel/pid_max
在大多数 64 位系统上,将此值设置为与 32 位系统上的值相同似乎是规范做法,但这是按照惯例,而不是要求。
/proc/sys/kernel/pid_max
该文件(Linux 2.5 中的新文件)指定 PID 环绕的值(即该文件中的值比最大 PID 大 1)。该文件的默认值 32768 会产生与早期内核相同的 PID 范围。在 32 位平台上,32768 是 的最大值
pid_max
。在 64 位系统上,pid_max
可以设置为最大 2^22 的任何值(PID_MAX_LIMIT
,大约 400 万)。
不,您无法更改正在运行的进程的 PID。在进程启动时,它被内核分配为一个序列号,从那时起它就是它的标识符。要获得新进程,您唯一能做的就是让您的代码分叉一个新进程并终止旧进程。
答案2
其他答案已经解释了
/proc/sys/kernel/pid_max
对于 Linux 和- FreeBSD 为 99999
但问题没有指定操作系统。所以这里还有其他一些:
- 在 Solaris 上,进程 ID 的最大值是内核可调参数 —
pidmax
in/etc/system
— 默认为 30,000,可以设置为 266 到 999,999 之间的任意值。请注意,这不是max_nprocs
,它是一个内核可调参数,其功能略有不同。 - 在 HP-UX 10 上,内核可调参数指定
process_id_min
并process_id_max
规定了允许的进程 ID 的范围。 - 在 AIX 上,进程 ID 包含多个字段,其中包括“进程槽”和“生成计数”字段。最大可能值为 0x03FFFFFE,因为这些字段仅占用整数的底部 26 位,并且除了进程 #1 之外,位 #0 始终为零。
- 在 OpenBSD 上,最大值为 32766。
- 在 NetBSD 上,最大值为 30000。
答案3
对于Linux
进程ID的最大值是多少?
$ cat /proc/sys/kernel/pid_max
4194304
$ sysctl kernel.pid_max
kernel.pid_max = 4194304
在 32 位系统上,结果将为 32768。
如果你指的是可以达到的最大值
根据内核中的定义: https://elixir.bootlin.com/linux/latest/source/include/linux/threads.h#L34
/*
* This controls the default maximum pid allocated to a process
*/
#define PID_MAX_DEFAULT (CONFIG_BASE_SMALL ? 0x1000 : 0x8000)
/*
* A maximum of 4 million PIDs should be enough for a while.
* [NOTE: PID/TIDs are limited to 2^30 ~= 1 billion, see FUTEX_TID_MASK.]
*/
#define PID_MAX_LIMIT (CONFIG_BASE_SMALL ? PAGE_SIZE * 8 : \
(sizeof(long) > 4 ? 4 * 1024 * 1024 : PID_MAX_DEFAULT))
您可以检查 CONFIG_BASE_SMALL
cat /boot/config-`uname -r`| grep -i config_base_small
在我的 RHEL 系统中,计算将其限制为 2^22 = 4 * 1024 * 1024 ~ 4 百万
进行测试
>>> echo 4200000 > /proc/sys/kernel/pid_max; echo $?
bash: echo: write error: Invalid argument
1
>>> echo 4194304 > /proc/sys/kernel/pid_max; echo $?
0
>>> echo 4194305 > /proc/sys/kernel/pid_max; echo $?
bash: echo: write error: Invalid argument
1
另外,是否可以更改进程 ID?
您无法更改当前进程的 PID。
不过,要更改限制,您可以按照以下步骤操作。
## Using PROC interface.
## Changes Temporarily and immediate. It reverts to the default value after reboot
echo "VALUE" > /proc/sys/kernel/pid_max
## Using sysctl interface; It is temporary and immediate too.
sysctl -w kernel.pid_max=VALUE
要保留此值,请将参数添加到文件 /etc/sysctl.conf 或 /etc/sysctl.d/ 中的某个文件中。重新加载它:
sysctl -p [File from which the conf needs to be loaded if present]
参考:
答案4
在 FreeBSD 上,PID 的值在 0 到 99999 之间,根据intro(2)
(关联)。这是手册中的引用:
进程 ID。
系统中的每个活动进程都由称为进程 ID 的非负整数唯一标识。该ID的范围是0到99999。
如果你想自己阅读源代码,那么PID_MAX
定义在sys/sys/proc.h
(关联)。