Чи використовує Windows 7 повторне використання ідентифікаторів процесу?


19

Чи використовує Windows 7 повторне використання ідентифікаторів процесу?

Причина, що я задаю це питання, пов’язана з моїм досвідом того, що Windows XP і Linux ніколи не видають ідентифікатори процесу вище 20–30 к. Однак моя машина Windows 7 досягне ідентифікаторів до 5–10 кб або більше протягом декількох годин після перезавантаження, що є моїм звичайним досвідом минулого. Наступного ранку я перевіряю, і які процеси набирають 250 або більше, що ні.

Я активував функцію аудиту безпеки для реєстрації створення та припинення процесу. Ніщо не генерує сотні чи тисячі процесів. Лише 513 цих подій зареєстровано протягом 24 годин, але сотні тисяч ідентифікаторів процесів були використані, як видно.

Я спробував шукати своє запитання, і одне із запропонованих раніше запитань вказувало на чудовий блог Марка Русиновича . Але ця стаття, хоч і дуже цікаве читання, залишила мене спантеличеною.


2
Б'юсь об заклад, що вони скидаються після перезавантаження ...
Остін Т французький

3
Звичайно, вони є, тому що при запуску завантаження взагалі немає процесів, тому всі PID> 4 не використовуються.
grawity

1
Я думаю, що його / її суть полягала в тому, що якщо Windows зрештою не повторно використає PID, він закінчиться і вимагатиме перезавантаження.
Саймон Ріхтер

Відповіді:


22

З мого тестування видно, що у вас є одне помилкове припущення, номери PID не видаються в послідовному порядку. Це дуже просто довести, виконайте наступну команду з командного рядка. Він повинен відкрити 3 примірники блокнота.

notepad & notepad & notepad

На моїй машині тут знаходяться PID з 3-х примірників, які відкриваються одночасно.

введіть тут опис зображення

Як ви можете бачити стрибки PID навколо, якщо ви відкриєте їх по черзі, ви також побачите, що наступний PID не завжди більший за попередній. Наприклад, я відкрив 4-ю копію блокнота і дістав цю

введіть тут опис зображення

Отже, схоже, що Windows 7 просто вибирає випадковий невикористаний PID кожен раз, коли він запускає процес, тому дуже добре може бути PID повторно використаний під час роботи Windows без перезавантаження.


Я написав простий скрипт powerhell (потрібен v2 або новіший, див. Цю відповідь, редагуйте історію для C # версії), щоб довести це точно

$h = new-object 'System.Collections.Generic.HashSet[string]'
do {
    $proc = Start-Process 'notepad' -PassThru
    $id = $proc.Id
    Stop-Process $id
} while ($h.Add($id))
$count = $h.Count
Write-Host "Took $count PIDs to hit a duplicate, the duplicate was $id."

Запускаючи програму 10 разів, вона завжди займала між собою 134та 147запусками блокнота, щоб той самий PID був використаний повторно (Чому це число таке мале? Проблема дня народження гаджета GO-GO !)


5
Windows NT робить це ще швидше, оскільки PID завжди кратні чотирма .
grawity

Спасибі Скотту. Чи є скрипт / утиліта оболонки, яка могла б відстежувати всі процеси PID-номерів і записувати їх у файл із назвою процесу, якому вони також були призначені?
isildur

1
Ви могли б, але я не бачу користі в цьому. Ви просто хочете відслідковувати всі розпочаті процеси або вам дійсно не важливо PID?
Скотт Чемберлен

На даний момент я просто хочу знати, який процес (и) запускається стільки разів, що він перемістив номери ідентифікаторів процесу в діапазон 500k +. Можливо, процес навіть нерестує. Це просто базовий робочий стіл win 7, антивірус і firefox, гра чи дві, і ми на цьому не робимо багато іншого. Дякую за відповіді.
isildur

Тому я видалив стару утиліту, яка проіндексувала дискові диски, використовуючи пакетні файли, які хтось написав років тому, і виявилося, що це був винуватець генерування таких високих PID-номерів. Зараз ця ж машина працює тижнями, і найвищий номер PID на сьогоднішній день - 12252.
isildur

1

Я пройшов тест протягом години, і за цей час закінчилося 302 процеси. З них у 70 було спільне значення PID, тому я б сказав, що PID часто використовується повторно.

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