Pregunta ¿Por qué no hay ID de procesos de Windows impares?


Hay muchas formas de examinar los ID de proceso en Windows.

Por ejemplo, usando el comando de PowerShell:

ps | select Id, ProcessName  | Sort Id | ft -AutoSize

Vemos el siguiente resultado:

  Id ProcessName         
  -- -----------         
   0 Idle                
   4 System              
 264 svchost             
 388 smss                
 476 csrss               
 536 wininit             
 580 winlogon                      
 620 services            
 628 lsass                          
 728 svchost             
 828 dwm                                     
1060 chrome              
1080 rundll32            
1148 vmms                                        
1620 spoolsv                                                
2912 taskhostex          
3020 explorer       
...     

Todos los identificadores de proceso son números pares y, además, son todos múltiplos de 4.

No hay ID de proceso impar en ninguna versión de Windows basada en Windows NT.

¿Cuál es la razón para esto?


158


origen


Posiblemente interesante: Algunos detalles sobre Linux - justskins.com/forums/why-are-process-ids-204416.html - Dave
De hecho, no hay ninguno. Eso es extraño. - AndreKR


Respuestas:


"¿Por qué no hay códigos de proceso de Windows impares?"

El mismo código que asigna los identificadores de kernel también se usa para   asignar procesos e identificadores de subprocesos. Como los controladores del kernel son múltiples   de cuatro, también lo son las identificaciones de proceso y de subprocesos.


¿Por qué las identificaciones de procesos y subprocesos son múltiplos de cuatro?

En los sistemas operativos basados ​​en Windows NT, las identificaciones de procesos y subprocesos suceden   siempre ser un múltiplo de cuatro. ¿Es esto sólo una coincidencia?

Sí, es solo una coincidencia, y no deberías confiar en ella ya que es   no forma parte del contrato de programación. Por ejemplo, el proceso de Windows 95   y las identificaciones de subprocesos no siempre eran múltiplos de cuatro. (En comparación, el   razón por la que los controladores del kernel son siempre un múltiplo de cuatro es parte de   la especificación y se garantizará en el futuro previsible).

Las identificaciones de procesos y subprocesos son múltiplos de cuatro como un efecto secundario del código   reutilizar. El mismo código que asigna los identificadores de kernel también se usa para   asignar procesos e identificadores de subprocesos. Como los controladores del kernel son múltiples   de cuatro, también lo son las identificaciones de proceso y de subprocesos. Esta es una implementación   detalle, así que no escriba código que dependa de él. Solo te estoy diciendo que   satisface tu curiosidad

Fuente ¿Por qué las identificaciones de procesos y subprocesos son múltiplos de cuatro?


¿Por qué las MANIJAS del kernel siempre son múltiplo de cuatro?

No muy conocido es que los dos últimos bits de las MANIJAS del kernel son   siempre cero; en otras palabras, su valor numérico es siempre un múltiplo   de 4. Tenga en cuenta que esto se aplica solo a las MANIJAS del kernel; no aplica   a pseudo-identificadores o a cualquier otro tipo de identificador (identificadores de USUARIO, GDI   identificadores, manejos multimedia ...) Los identificadores de kernel son cosas que puedes pasar   a la función CloseHandle.

La disponibilidad de los dos bits inferiores está enterrada en el ntdef.h   archivo de cabecera:

//
// 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

Que al menos la parte inferior de las MANIJAS del kernel siempre es cero es   implicado por la función GetQueuedCompletionStatus, que indica   que puede configurar el bit inferior del identificador de evento para suprimir   notificación del puerto de terminación. Para que esto funcione, la parte inferior   bit debe ser normalmente cero.

Esta información no es útil para la mayoría de los escritores de aplicaciones, que   debería continuar tratando a HANDLEs como valores opacos. La gente quien   estarían interesados ​​en los bits de las etiquetas son los que están implementando   bibliotecas de clases de bajo nivel o están envolviendo objetos kernel dentro de un   marco más grande.

Fuente ¿Por qué las MANIJAS del kernel siempre son múltiplo de cuatro?


Otras lecturas



166



Una cita dice "No deberías confiar en él, ya que no es parte del contrato de programación" pero luego las siguientes afirmaciones ntdef.h dice que los bits son "disponible para su uso por código de aplicación como bits de etiqueta".  La documentación en un archivo de encabezado público es lo más parecido a "contrato de programación" como puede obtener, entonces el primer reclamo es incorrecto. - BlueRaja - Danny Pflughoeft
@BlueRaja, "No muy conocido es que los dos últimos bits de MANIJAS del kernel son siempre cero; en otras palabras, su valor numérico es siempre un múltiplo de 4."El código en ntdef.h también se aplica a otros tipos de identificadores (identificadores USER, identificadores GDI, identificadores multimedia ...) - DavidPostill♦
@BlueRaja: los controladores del kernel son múltiplos de cuatro y eso es contractual, por lo que puedes confiar en él; ID de proceso (que son no lo mismo que los identificadores de proceso), en su lugar, ocurrir ser múltiplo de cuatro, pero eso es solo un detalle de implementación, por lo que no debe confiar en él. - Matteo Italia
@BlueRaja Creo que Raymond le diría que quien escribió la documentación miró al mundo a través de vasos de color kernel y, por lo tanto, solo se refiere a los identificadores del kernel y no a otros tipos de identificadores. - CodesInChaos
@Mehrdad: bueno, los manejadores de USER y GDI normalmente no se denominan manejadores de "kernel" (aunque son generados por componentes que se ejecutan en el llamado modo kernel). - Matteo Italia