Як створюються PID?


42

На * nix, PID - це унікальні ідентифікатори для запущених процесів. Як створюються PID? Це просто ціле число, яке збільшується, або більш складна структура, така як список? Як вони переробляються? Під переробкою я маю на увазі, що коли процес закінчується, його PID з часом буде повторно використаний іншим процесом.


Відповіді:


39

Як говорить вікіпедія ,

У Unix ідентифікатори процесу зазвичай розподіляються на послідовній основі, починаючи з 0 і піднімаючись до максимального значення, яке варіюється від системи до системи. Як тільки ця межа буде досягнута, розподіл перезавантажується на нулі і знову збільшується. Однак для цього та подальших пропусків будь-які PID, все ще призначені процесам, пропускаються.

так що це дійсно дуже проста політика щодо "генерації", просто збільшивши лічильник та "переробляючи", просто оберніть це число на максимальне значення і продовжуйте збільшувати, поки не знайдете число, яке було призначено процесу, який закінчився і має було видалено з таблиці процесів.

Деякі реалізації Unix, такі як AIX, використовують менш просту політику, див., Наприклад, цей FAQ .


Дякую за відповідь. До речі, що саме ця AIX політика "є менш простою"?

1
@Helltone, я не думаю, що AIX документує саме таку політику, яку вона використовує (щоб вона могла змінитися при будь-якому випуску), але ви можете вважати це генерацією випадкових чисел у відповідному діапазоні (що повторюється, поки не буде створено PID, це наразі не використовується).
Алекс Мартеллі

Цей алгоритм здається мені трохи проблематичним. Як ви гарантуєте, що ви не зіткнетеся з тупиком? І чи не існує проблеми з продуктивністю?

1
Ядро контролює і нічого не потрібно блокувати, то як воно могло зайти в тупик? Так, є невелика ціна продуктивності (невелика додаткова накладні витрати на час розщелки - скажімо, кілька десятків машинних інструкцій для конгруденційного PRNG або / dev / urandom read, порівняно з багатьма меншими за зустрічний приріст), але це завжди що стосується заходів, спрямованих на поліпшення безпеки (наприклад, перевірте на центральних процесорах комунікації HTTPS та звичайний HTTP ;-).
Алекс Мартеллі

Я мав на увазі лайволк ( while(true);), вибачте, я швидко відповів ;-)

11

Він змінюється.

Більшість систем просто зберігають підрахунок останнього створеного PID, додають його (загортання на максимальну кількість, наприклад 65535 або трохи менше - часто обертання відбувається на рівні 65000 або навіть 60000), і перевіряють, чи не використовується ця кількість в даний час ( повторюється, якщо PID все ще використовується - значить, PID 1, ядро, все ще існує і не перезавантажується).

Інші системи, орієнтовані на безпеку, генерують число навмання і перевіряють, чи воно не використовується.

У будь-який момент часу гарантується, що всі номери PID є унікальними.


9

Що стосується частини запитання про переробку, то слід пам’ятати, що PID не стає доступним, як тільки процес із цим підом закінчується. Pid не стає доступним, поки батько цього процесу не збирає статус припинення своєї дитини через певну форму системного виклику wait (). Дитина, яку припиняють, але батько якої не видав очікування, називається зомбі, і, як правило, проявляється в PS як неіснуючий. Можливо, недоброзичливий батько голодує системою під, якщо вона запускає дітей і не чекає () на них.

Якщо батько процесу помирає, перш ніж він збирає статус дитини, це нормально. Дитина передається у спадок від init, який переконається, що чекання () видається, і Pid буде перероблений.


Це дуже важлива деталь. Без нього навіть простим myprog &слід wait $!було б UB.
Андреас

3

Вони є порядковими номерами і обертаються круглим (за специфічним для ОС значенням), якщо система працює досить довго. Цифри ніколи не використовуються повторно, якщо тільки вони не є безкоштовними fork().

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.