"¿Por qué no hay identificadores de proceso de Windows extraños?"
El mismo código que asigna identificadores de kernel también se usa para asignar ID de procesos y subprocesos. Dado que los identificadores de kernel son múltiplos de cuatro, también lo son las ID de proceso y subproceso.
¿Por qué los ID de proceso y de hilo son múltiplos de cuatro?
En los sistemas operativos basados en Windows NT, las ID de procesos y subprocesos siempre son múltiplos de cuatro. ¿Es esto sólo una coincidencia?
Sí, es solo una coincidencia, y no debe confiar en él, ya que no forma parte del contrato de programación. Por ejemplo, las ID de proceso y subproceso de Windows 95 no siempre fueron múltiplos de cuatro. (En comparación, la razón por la cual los identificadores de kernel son siempre múltiplos de cuatro es parte de la especificación y estará garantizada en el futuro previsible).
Las ID de proceso e hilo son múltiplos de cuatro como efecto secundario de la reutilización del código. El mismo código que asigna identificadores de kernel también se usa para asignar ID de proceso y subprocesos. Dado que los identificadores de kernel son múltiplos de cuatro, también lo son las ID de proceso y subproceso. Este es un detalle de implementación, así que no escriba código que se base en él. Solo te digo que satisfagas tu curiosidad.
Fuente ¿Por qué los ID de proceso y de hilo son múltiplos de cuatro?
¿Por qué los kernel HANDLEs siempre son múltiplos de cuatro?
No se sabe muy bien que los dos bits inferiores de las MANIJAS del núcleo son siempre cero; en otras palabras, su valor numérico es siempre un múltiplo de 4. Tenga en cuenta que esto solo se aplica a las MANIJAS del núcleo; no se aplica a pseudo-manejadores ni a ningún otro tipo de manejador (manejadores de USUARIO, manejadores GDI, manejadores multimedia ...) Los manejadores de kernel son cosas que puede pasar a la función CloseHandle.
La disponibilidad de los dos bits inferiores está oculta en el archivo de encabezado 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
La función GetQueuedCompletionStatus implica que al menos el bit inferior de los MANIPULADORES del kernel siempre es cero, lo que indica que puede establecer el bit inferior del controlador de eventos para suprimir la notificación del puerto de finalización. Para que esto funcione, el bit inferior normalmente debe ser cero.
Esta información no es útil para la mayoría de los escritores de aplicaciones, que deberían seguir tratando los MANEJOS como valores opacos. Las personas que estarían interesadas en los bits de etiqueta son aquellos que están implementando bibliotecas de clases de bajo nivel o están envolviendo objetos del núcleo dentro de un marco más grande.
Fuente ¿Por qué los MANEJOS del núcleo siempre son múltiplos de cuatro?
Otras lecturas