Как PID (Process Indentifier) ​​генерируется в режиме ядра под Windows? - PullRequest
6 голосов
/ 04 января 2011

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

Ответы [ 4 ]

4 голосов
/ 04 января 2011

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

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

2 голосов
/ 04 января 2011

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

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

1 голос
/ 04 января 2011

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

0 голосов
/ 06 января 2011

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

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

-scott

...