Как генерируется PID (идентификатор процесса) в режиме ядра под Windows?

Я хотел бы знать, как генерируются идентификаторы процессов (также известные как PID) в Windows. Он уникален для разных машин? например, рассмотрим идентификатор 5856, который в настоящее время назначен моей программе Firefox. То же самое для одного и того же исполняемого образа на другой машине?


person J. Rattz    schedule 04.01.2011    source источник


Ответы (4)


Идентификаторы процессов не уникальны для разных машин. Их можно повторно использовать на том же компьютере для последующих процессов, и обычно они не будут одинаковыми между двумя вызовами одного и того же исполняемого файла.

Вы не должны заботиться о том, как он генерируется - единственное, в чем вы можете быть уверены, это то, что идентификатор процесса однозначно идентифицирует один запущенный процесс, т. е. в любой момент времени будет только один процесс с этим идентификатором.

person villintehaspam    schedule 04.01.2011
comment
Ну, а вы знаете, на какой основе он генерируется? - person J. Rattz; 04.01.2011
comment
Нет, это не задокументировано и может меняться между версиями Windows, пакетами обновлений или обновлениями, а также в зависимости от времени суток или фазы луны. :) - person villintehaspam; 04.01.2011
comment
Было очень познавательно, особенно фаза луны :) - person J. Rattz; 04.01.2011
comment
Добро пожаловать! :) Хорошо, если серьезно, я просто пытаюсь указать, что вы просто не можете полагаться на какое-то конкретное поведение. Вы можете попробовать опубликовать другой вопрос, в котором говорится, чего вы пытаетесь достичь - вместо этого может быть какая-то помощь. - person villintehaspam; 04.01.2011

Генерация PID - это в основном секрет, который Microsoft официально не документирует, потому что им придется придерживаться этой реализации, как только они ее задокументируют. Однако оно всегда кратно 4, но это не то поведение, на которое следует полагаться. Они не уникальны, и их можно использовать повторно.

Рэймонд Чен упоминает об этом в своем блоге.

person vcsjones    schedule 04.01.2011
comment
Они кратны только 4 из-за побочного эффекта; это не предусмотрено дизайном и теоретически может измениться. - person Joe; 04.01.2011
comment
Да, именно это Рэймонд указывает в своем блоге. Я обновлю свой ответ, чтобы уточнить. - person vcsjones; 04.01.2011

Идентификаторы дескрипторов процесса, потока и ядра берутся из общей процедуры. Технически это DWORD, хотя я не помню, когда в последний раз видел их выше 65 536. Их можно использовать повторно, и это всего лишь механизм, основанный на противодействии.

person Joe    schedule 04.01.2011
comment
Я видел такие процессы один раз в Windows 10 с некоторыми 6-значными PID. Но это редкость. - person Paul Stelian; 08.03.2017

Процессы поддерживаются как объекты в ядре и, как таковые, экспортируются в пользовательский режим так же, как и любой другой объект в системе (например, события, мьютексы, семафоры, таймеры и т. д.) через HANDLE.

Таким образом, идентификаторы процессов на самом деле являются просто HANDLE для обработки объектов, которые хранятся в глобальной таблице дескрипторов (PspCidTable, как деталь реализации). Интересно отметить, что потоки также поддерживаются как объекты и также вставляются в эту таблицу. Идентификаторы потока тогда на самом деле просто HANDLEs для объектов потока.

-Скотт

person snoone    schedule 05.01.2011