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

Если мы введем ps -ef тогда мы получаем список процессов. Почему номера PID не являются непрерывными?

4 ответа

Решение

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

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

( https://stackoverflow.com/questions/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

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

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

Обычно 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

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

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

Другие вопросы по тегам