Чому значення PID не є безперервним?


Відповіді:


16

На Ubuntu вони безперервні. В інших операційних системах це може відрізнятися.

Ядро виділяє PID в діапазоні (RESERVED_PIDS, PID_MAX_DEFAULT). Це робиться послідовно у кожному просторі імен (завдання в різних просторах імен можуть мати однакові ідентифікатори). У випадку, коли діапазон вичерпаний, присвоєння розсилки розгортається.

( /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

"Планування ядра може розщедрити процес, так що, можливо, може пропустити числа." - ядро ​​може створити процес, визначаючи, який процес запустити? Це здається дивним.
користувач253751

Досить часто для планувальника розгортається процес. Напевно, це трохи: lxr.free-electrons.com/source/kernel/pid.c#L125, що це визначає :)
Rinzwind

8

Ідентифікатори процесу, відсутні між ними, уже мертві, а їх PID-коди будуть використані ядром у наступних процесах.

Відмерлі процеси не відображатимуться в таблиці процесів (крім зомбі), отже, 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.