Почему значения 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
перечисляет только запущенные процессы.