进程ID的最大值是多少?

进程ID的最大值是多少?

进程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 位系统上的值相同似乎是规范做法,但这是按照惯例,而不是要求。

man 5 proc:

/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 的最大值是内核可调参数 —pidmaxin /etc/system— 默认为 30,000,可以设置为 266 到 999,999 之间的任意值。请注意,这不是max_nprocs,它是一个内核可调参数,其功能略有不同。
  • 在 HP-UX 10 上,内核可调参数指定process_id_minprocess_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(关联)

相关内容