Каково максимальное значение идентификатора процесса?

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 запущенного процесса. Он присваивается ядром в качестве последовательного номера во время запуска процесса, и это его идентификатор с того времени. Единственное, что вы можете сделать, чтобы получить новый, - это заставить ваш код раскошелиться на новый процесс и завершить старый.

Калеб
источник
и мы можем быть уверены в битах ядра с этим
Водолей Power
2
Любопытный полу-контрпример к истории «не может изменить PID» - это случай многопоточной программы, где один из вспомогательных потоков выполняет exec (). Он перекрывает весь процесс, но изменяет PID (на TID исполняемого потока).
fche
3
Максимальное значение PID для 32-разрядного компьютера равно 32767, а не 32768. 0 - это планировщик, а 1 - инициализация, а затем пользовательские процессы получают от 2 до 32767.
2
user129258 прав и согласуется как со страницей руководства, так и с ядром doco. Максимально допустимое значение PID , в соответствии с просьбой вопрос, на единицу меньше , чем значение в этом псевдо-файла.
JdeBP
1
@ user129258, это работает, только если вы используете init. Всегда есть возможность загрузиться прямо в оболочку, скажем, busybox, и делать что-то вручную оттуда без контроля работы. Или даже иметь некоторые стартовые скрипты и вернуться в оболочку. В любом случае оболочка будет 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.
JdeBP
источник
Начиная с OpenBSD 6.5, максимум в настоящее время составляет 99999 согласно intro (2), а не 32766.
Kaiepi
4

В FreeBSD значение PID составляет от 0 до 99999 согласно intro(2)(ссылка) . Вот цитата из руководства:

Идентификатор процесса.
Каждый активный процесс в системе уникально идентифицируется неотрицательным целым числом, называемым идентификатором процесса. Диапазон этого идентификатора составляет от 0 до 99999.

Если вы хотите прочитать исходный код самостоятельно, PID_MAXэто определено в sys/sys/proc.h(ссылка) .

Матеуш Пиотровский
источник