"Чому немає ідентичних ідентифікаторів процесів Windows?"
Той самий код, який виділяє ручки ядра, також використовується для розподілу ідентифікаторів процесу та потоку. Оскільки ручки ядра є кратними чотирма, то також і ідентифікатори процесів і потоків.
Чому ідентифікатори процесу і потоків кратні чотирма?
В операційних системах на базі Windows NT ідентифікатори процесів і потоків завжди бувають кратними чотирма. Це просто збіг?
Так, це просто збіг обставин, і ви не повинні покладатися на нього, оскільки це не є частиною договору програмування. Наприклад, ідентифікатори процесів і потоків Windows 95 не завжди були кратними чотирма. (Для порівняння, причина того, що ручки ядра завжди кратні чотирьом, є частиною специфікації і буде гарантована в осяжному майбутньому.)
Ідентифікатори процесу та потоку є кратними чотирма як побічний ефект повторного використання коду. Той самий код, який виділяє ручки ядра, також використовується для розподілу ідентифікаторів процесу та потоку. Оскільки ручки ядра є кратними чотирма, то також і ідентифікатори процесів і потоків. Це деталізація реалізації, тому не пишіть код, який покладається на неї. Я просто кажу вам, щоб задовольнити вашу цікавість.
Джерело Чому ідентифікатори процесу і потоку кратні чотирма?
Чому РУЧКИ ядра завжди кратні чотирма?
Не дуже добре відомо, що два нижні біта HANDLEs ядра завжди дорівнюють нулю; Іншими словами, їх числове значення завжди кратне 4. Зверніть увагу, що це стосується лише РУЧКІВ ядра; це не стосується псевдо-ручок або будь-якого іншого типу ручок (USER-ручки, GDI-ручки, мультимедійні ручки ...) Ручки ядра - це речі, які ви можете перейти до функції CloseHandle.
Наявність двох нижчих бітів закопується у файлі заголовка ntdef.h:
//
// Low order two bits of a handle are ignored by the system and available
// for use by application code as tag bits. The remaining bits are opaque
// and used to store a serial number and table index.
//
#define OBJ_HANDLE_TAGBITS 0x00000003L
Що принаймні нижній біт HANDLEs ядра завжди дорівнює нулю, мається на увазі функція GetQueuedCompletionStatus, яка вказує на те, що ви можете встановити нижній біт ручки події для придушення сповіщення про порт завершення. Для того, щоб це працювало, нижній біт зазвичай повинен дорівнювати нулю.
Ця інформація не є корисною для більшості авторів програм, які повинні продовжувати трактувати HANDLE як непрозорі значення. Люди, які були б зацікавлені у бітах тегів, - це ті, хто реалізує бібліотеки класів низького рівня або обертає об’єкти ядра всередині більшого фрейму.
Джерело Чому РУЧКИ Ядра завжди кратні чотирма?
Подальше читання