19

Windows 7 повторно использует идентификаторы процессов?

Причина, по которой я задаю этот вопрос, заключается в том, что, как мне кажется, Windows XP и Linux никогда не генерируют идентификаторы процессов выше 20–30 КБ. Тем не менее, мой компьютер с Windows 7 достигнет идентификаторов до 5–10 тыс. Или более в течение нескольких часов после перезагрузки, что является моим обычным опытом в прошлом. На следующее утро я проверяю, и некоторые процессы 250k или выше, что не так.

Я активировал функцию аудита безопасности, чтобы регистрировать создание и завершение процесса. Ничто не порождает сотни или тысячи процессов. Только 513 из этих событий зарегистрированы в течение 24-часового периода, однако сотни тысяч идентификаторов процессов были использованы.

Я попытался найти свой вопрос, и один из предложенных ранее вопросов указал на чудесный блог Марка Руссиновича. Но эта статья, хотя и очень интересное чтение, оставила меня озадаченным.

2 ответа2

22

Из моего тестирования выяснилось, что у вас есть одно ложное предположение, что номера PID не указаны в последовательном порядке. Это очень легко доказать, выполните следующую команду из командной строки. Следует открыть 3 копии блокнота.

notepad & notepad & notepad

На моей машине PID 3-х копий, которые открывались одновременно.

Как вы можете видеть, что PID сильно перепрыгивает, если вы открываете их по одному, вы также увидите, что следующий PID не всегда больше предыдущего. Например, я открыл 4-ую копию блокнота и получил это

Таким образом, похоже, что Windows 7 будет просто выбирать случайный неиспользуемый PID каждый раз, когда запускает процесс, так что вполне возможно, что PID будет повторно использоваться во время работы Windows без перезагрузки.


Я написал простой скрипт powershell (требуется версия 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 Gadget проблема с днем рождения !)

1

Я провел тест в течение часа, и за это время было завершено 302 процесса. Из них у 70 был общий PID, поэтому я бы сказал, что PID часто используется повторно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .