Почему значения PID не являются непрерывными?


Ответы:


16

На Ubuntu они непрерывны. В других операционных системах это может отличаться.

Ядро выделяет PID в диапазоне (RESERVED_PIDS, PID_MAX_DEFAULT). Это происходит последовательно в каждом пространстве имен (задачи в разных пространствах имен могут иметь одинаковые идентификаторы). В случае, если диапазон исчерпан, назначение pid оборачивается.

( /programming/3446727/how-does-linux-determine-the-next-pid )

Имейте в виду, хотя ...

  • Планирование ядра может привести к развороту процесса, поэтому может показаться, что он пропускает числа.
  • PID исчезнет, ​​когда эта задача закончится.
  • PID не используются повторно, пока не будет достигнут PID_MAX_DEFAULT.
  • Резервный PID пропускается.

Некоторые темы по stackoverflow:

В комментариях есть команда для проверки присвоения PID:

for i in {1..20}; do sh -c 'echo $$'; done

«Планирование ядра может привести к развороту процесса, поэтому может показаться, что он пропускает числа». - ядро ​​может создать процесс при определении, какой процесс запустить? Это кажется странным.
user253751

Планировщик довольно часто разветвляет процесс. Вероятно, этот бит: lxr.free-electrons.com/source/kernel/pid.c#L125, который его
сдерживает

8

Отсутствующие промежуточные идентификаторы процессов уже мертвы, и их идентификаторы будут повторно использоваться ядром в последующих процессах.

Мертвые процессы не будут показаны в таблице процессов (кроме зомби), следовательно ps -ef не будут их отображать.


3

Обычно PID является непрерывным, но какой-то процесс будет остановлен к тому времени, когда вы запустите команду ps -ef.

Также некоторые процессы могут быть просто подпроцессом другого процесса, который не показан в ps -efкоманде. Чтобы увидеть расширенный результат, и вы можете проверить непрерывный PID, используйтеpstree

pstree -p

Пример вывода:

   ├─teamviewerd(3468)─┬─{teamviewerd}(3474)
│                   ├─{teamviewerd}(3475)
│                   ├─{teamviewerd}(3476)
│                   ├─{teamviewerd}(3477)
│                   ├─{teamviewerd}(3478)

в то время как если вы запустите, ps -efвы просто увидите родительский процесс.

$ ps -ef | grep teamviewerd
root      3468     1  0 Jul15 ?        00:07:38 /opt/teamviewer9/tv_bin/teamviewerd -f

2

Они непрерывны. ПИД назначаются в последовательном порядке до достижения максимального предела. После этого предела он начнется снова с нуля.

Так что просто отсутствующие идентификаторы PID ps -efявляются мертвыми процессами. Обратите внимание, что ps -efперечислены только запущенные процессы.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.