Почему нет нечетных идентификаторов процессов Windows?
Если вы любите возиться с Windows и учиться по ходу дела, вы, возможно, заметили, что идентификаторы процессов и потоков Windows имеют четные номера, кратные четырем. Это почему? Сегодняшний пост SuperUser Q & A содержит ответы на вопросы любопытных читателей..
Сегодняшняя сессия вопросов и ответов пришла к нам благодаря SuperUser - подразделению Stack Exchange, группе веб-сайтов вопросов и ответов, управляемой сообществом..
Вопрос
Читатель SuperUser Питер Хандорф (Peter Hahndorf) хочет знать, почему не существует нечетных идентификаторов процессов Windows:
Есть много способов взглянуть на идентификаторы процессов в Windows. Использование PowerShell:
Я получаю этот результат:
Как видите, все идентификаторы процессов имеют четную нумерацию, и не только это: все они кратны четырем. Вы можете смотреть так усердно, как вы хотите, и вы никогда не найдете нечетного идентификатора процесса, по крайней мере, ни в одной версии на базе Windows NT. Что является причиной этого?
Почему нет нечетных идентификаторов процессов Windows?
Ответ
Участник SuperUser DavidPostill имеет ответ для нас:
Почему нет нечетных идентификаторов процессов Windows?
Тот же код, который выделяет дескрипторы ядра, также используется для выделения идентификаторов процессов и потоков. Поскольку дескрипторы ядра кратны четырем, то идентификаторы процессов и потоков тоже.
Почему идентификаторы процессов и потоков кратны четырем?
В операционных системах на базе Windows NT идентификаторы процессов и потоков всегда кратны четырем. Это просто совпадение?
Да, это просто совпадение, и вы не должны полагаться на него, поскольку это не является частью контракта на программирование. Например, идентификаторы процессов и потоков в Windows 95 не всегда были кратны четырем. Для сравнения, причина того, что дескрипторы ядра всегда кратны четырем, является частью спецификации и будет гарантирована в обозримом будущем..
Идентификаторы процессов и потоков кратны четырем, что является побочным эффектом повторного использования кода. Тот же код, который выделяет дескрипторы ядра, также используется для выделения идентификаторов процессов и потоков. Поскольку дескрипторы ядра кратны четырем, то идентификаторы процессов и потоков тоже. Это деталь реализации, поэтому не пишите код, который опирается на него. Я просто говорю вам, чтобы удовлетворить ваше любопытство.
Источник: Почему идентификаторы процессов и потоков кратны четырем?
Почему дескрипторы ядра всегда кратны четырем?
То, что не очень хорошо известно, это то, что два нижних бита дескрипторов ядра всегда равны нулю; другими словами, их числовое значение всегда кратно четырем. Обратите внимание, что это относится только к дескрипторам ядра; это не относится к псевдо-маркерам или к любому другому типу дескрипторов (маркеры USER, маркеры GDI, мультимедийные маркеры и т. д.). Ручки ядра - это то, что вы можете передать функции CloseHandle..
То, что по крайней мере нижний бит дескрипторов ядра всегда равен нулю, подразумевается функцией GetQueuedCompletionStatus, которая указывает, что вы можете установить нижний бит дескриптора события, чтобы подавить уведомление порта завершения. Чтобы это работало, нижний бит обычно должен быть нулевым.
Эта информация бесполезна для большинства разработчиков приложений, которые должны продолжать обрабатывать дескрипторы как непрозрачные значения. Люди, которые будут заинтересованы в битах тегов, это те, кто реализует низкоуровневые библиотеки классов или оборачивает объекты ядра в более крупную среду.
Источник: Почему дескрипторы ядра всегда кратны четырем?
Дальнейшее чтение
Старое новое: практическое развитие на протяжении эволюции Windows. Автор Raymond Chen (Ведущий инженер по разработке программного обеспечения в Microsoft)
Есть что добавить к объяснению? Отключить звук в комментариях. Хотите узнать больше ответов от других технически подкованных пользователей Stack Exchange? Ознакомьтесь с полным обсуждением здесь.