プロセス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ビットシステムでは、最大2^22(約400万)pid_max
の値に設定できます。PID_MAX_LIMIT
いいえ、実行中のプロセスの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では、カーネルチューナブルは許可されているプロセスIDの範囲を指定し
process_id_min
て規制します。process_id_max
- AIX では、プロセス ID には、プロセス・スロットおよびビルド数フィールドを含む複数のフィールドが含まれます。可能な最大値は 0x03FFFFFE です。なぜなら、これらのフィールドは整数の下位26ビットのみを占有し、プロセス#1を除いて、ビット#0は常に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から400万に制限されています。
テストを行う
>>> 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
(関連)。