Чому не існує жодних ідентифікаторів процесів 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 процес і ідентифікатори ниток не завжди кратні чотирьох. Для порівняння, причина того, що ручки ядра завжди кратні чотирьом, є частиною специфікації і буде гарантоване в найближчому майбутньому.
Ідентифікатори процесів і потоків кратні чотирьох як побічний ефект повторного використання коду. Той же код, який виділяє ручки ядра, також використовується для виділення ідентифікаторів процесів і потоків. Оскільки ручки ядра кратні чотирьом, так це і ідентифікатори процесів і потоків. Це деталізація реалізації, тому не пишіть код, який спирається на нього. Я просто кажу вам, щоб задовольнити свою цікавість.
Джерело: Чому процеси і ідентифікатори ниток кратні чотирьох?
Чому ядро обробляє завжди кратне чотири?
Те, що не дуже добре відомо, полягає в тому, що два нижні біти ручки ядра завжди дорівнюють нулю; іншими словами, їх числове значення завжди кратно чотирьом. Зверніть увагу, що це стосується тільки ручок ядра; він не поширюється на псевдоручки або на будь-який інший тип ручки (ручки користувача, ручки GDI, мультимедійні ручки тощо). Ручки ядра - це речі, які можна передати функції CloseHandle.
Що, принаймні, нижній біт ручок ядра завжди дорівнює нулю, мається на увазі функція GetQueuedCompletionStatus, яка вказує, що ви можете встановити нижній біт ручки події, щоб припинити сповіщення про порт завершення. Для того, щоб це працювало, нижній біт повинен бути рівним нулю.
Ця інформація не є корисною для більшості авторів програм, які повинні продовжувати розглядати ручки як непрозорі значення. Люди, які будуть зацікавлені в бітах тегів, це ті, які впроваджують бібліотеки класів низького рівня або переносять об'єкти ядра всередину більшої рамки.
Джерело: Чому ядро обробляє завжди кратне чотири?
Подальше читання
Старе нове: Практичний розвиток упродовж еволюції вікон Реймонд Чен (Головний інженер з розробки програмного забезпечення в Microsoft)
Маєте щось додати до пояснення? Звучить в коментарях. Хочете прочитати більше відповідей від інших технологічних користувачів Stack Exchange? Перегляньте повний потік обговорення тут.