Я хотел бы знать, как генерируются идентификаторы процессов (также известные как PID) в Windows. Он уникален для разных машин? например, рассмотрим идентификатор 5856, который в настоящее время назначен моей программе Firefox. То же самое для одного и того же исполняемого образа на другой машине?
Как генерируется PID (идентификатор процесса) в режиме ядра под Windows?
Ответы (4)
Идентификаторы процессов не уникальны для разных машин. Их можно повторно использовать на том же компьютере для последующих процессов, и обычно они не будут одинаковыми между двумя вызовами одного и того же исполняемого файла.
Вы не должны заботиться о том, как он генерируется - единственное, в чем вы можете быть уверены, это то, что идентификатор процесса однозначно идентифицирует один запущенный процесс, т. е. в любой момент времени будет только один процесс с этим идентификатором.
Генерация PID - это в основном секрет, который Microsoft официально не документирует, потому что им придется придерживаться этой реализации, как только они ее задокументируют. Однако оно всегда кратно 4, но это не то поведение, на которое следует полагаться. Они не уникальны, и их можно использовать повторно.
Рэймонд Чен упоминает об этом в своем блоге.
Идентификаторы дескрипторов процесса, потока и ядра берутся из общей процедуры. Технически это DWORD, хотя я не помню, когда в последний раз видел их выше 65 536. Их можно использовать повторно, и это всего лишь механизм, основанный на противодействии.
Процессы поддерживаются как объекты в ядре и, как таковые, экспортируются в пользовательский режим так же, как и любой другой объект в системе (например, события, мьютексы, семафоры, таймеры и т. д.) через HANDLE.
Таким образом, идентификаторы процессов на самом деле являются просто HANDLE для обработки объектов, которые хранятся в глобальной таблице дескрипторов (PspCidTable, как деталь реализации). Интересно отметить, что потоки также поддерживаются как объекты и также вставляются в эту таблицу. Идентификаторы потока тогда на самом деле просто HANDLEs для объектов потока.
-Скотт