Яке максимальне значення ідентифікатора процесу?


42

Яке максимальне значення ідентифікатора процесу?

Також, чи можна змінити ідентифікатор процесу?

Відповіді:


61

В Linux ви можете знайти максимальне значення PID для вашої системи за допомогою цього:

$ cat /proc/sys/kernel/pid_max

Це значення також можна записати за допомогою одного і того ж файлу, проте значення може бути розширене лише до теоретичного максимуму 32768 для 32-бітових систем або 4194304 для 64-бітного:

$ echo 32768 > /proc/sys/kernel/pid_max

Здається, що для більшості 64-бітових систем нормальна практика встановлює це значення таким же значенням, як і в 32-бітових системах, але це скоріше за умовою, а не про вимогу.

Від man 5 proc:

/proc/sys/kernel/pid_max  
  This file (new in Linux 2.5) specifies the value at which PIDs wrap around
  (i.e., the value in this file is one greater than the maximum PID). The
  default value for this file, 32768, results in the same range of PIDs as
  on earlier kernels. On 32-bit platfroms, 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).

І ні, ви не можете змінити PID запущеного процесу. Він отримує ядро ​​як послідовний номер під час запуску процесу, і це його ідентифікатор з цього часу. Єдине, що ви могли зробити, щоб отримати новий - це роздвоїти код нового процесу та припинити старий.


і ми можемо бути впевнені в бітах ядра з цим
Водолій Сила,

2
Цікавий напівконтрприклад для історії "не може змінити PID" - це випадок багатопотокової програми, де одна з допоміжних потоків виконує exec (). Він накладає весь процес, але змінює PID (на TID виконуваного потоку).
fche

3
Максимальне значення PID для 32-розрядної машини - 32767, а не 32768. 0 - це планувальник, а 1 - init, а потім користувацькі процеси отримують від 2 до 32767.

2
користувач129258 має рацію і узгоджується як із сторінкою керівництва, так і з ядром doco. Максимально допустиме значення PID , в відповідно до проханням питання, на одиницю менше , ніж значення в цьому псевдо-файлу.
JdeBP

1
@ user129258, це стосується лише якщо ви використовуєте init. Завжди є можливість завантажуватися безпосередньо в оболонку, скажімо, зайнятий і робити те, що робити вручну звідти, без контролю за роботою. Або навіть мати кілька сценаріїв запуску і повернутися до оболонки. У будь-якому випадку оболонка буде PID 1 в такому випадку.
Тім

9

Інші відповіді пояснили

  • /proc/sys/kernel/pid_max для Linux та
  • 99999 для FreeBSD

Але питання не вказало операційну систему. Ось ось деякі інші:

  • У Solaris, максимальне значення ідентифікатора процесу є параметр ядра перебудовується - pidmaxв /etc/system- то по замовчуванням 30000 і які можуть бути встановлені в будь-якому місці між 266 і 999999. Зауважте, що це не так max_nprocs, це параметр, що регулюється в ядрі, з тонко іншою функцією.
  • На HP-UX 10 перехідні ядра називають process_id_minі process_id_maxпрописують діапазон допустимих ідентифікаторів процесу.
  • На AIX ідентифікатори процесу містять декілька полів, включаючи "слот процесу" та "кількість поколінь". Максимально можливе значення 0x03FFFFFE, оскільки поля займають лише найнижчі 26 біт цілого числа, а біт № 0 завжди дорівнює нулю, за винятком процесу №1.
  • На OpenBSD максимум - 32766.
  • У NetBSD максимум - 30000.

Станом на OpenBSD 6.5, максимум становить 99999 згідно з введенням (2), а не 32766.
Kaiepi

4

У FreeBSD значення PID становить від 0 до 99999 згідно intro(2)(посилання) . Ось цитата з посібника:

Ідентифікатор процесу
Кожен активний процес у системі однозначно ідентифікується за допомогою негативного цілого числа, що називається ідентифікатором процесу. Діапазон цього ідентифікатора - від 0 до 99999.

Якщо ви хочете прочитати вихідний код самостійно, PID_MAXце визначено в sys/sys/proc.h(посилання) .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.