¿Por qué no hay identificaciones de proceso de Windows extrañas?


160

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

Por ejemplo, usando el comando 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 ID de proceso son números pares y, además, todos son múltiplos de 4 .

No hay identificadores de proceso extraños en ninguna versión de Windows que se base en Windows NT.

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


66
Posiblemente interesante: algunos detalles sobre Linux - justskins.com/forums/why-are-process-ids-204416.html
Dave

13
De hecho no hay ninguno. Eso es extraño.
AndreKR

Respuestas:


168

"¿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



3
Una cita dice "no debe confiar en él, ya que no es parte del contrato de programación", pero luego el siguiente reclamo ntdef.h dice que los bits están "disponibles para su uso por el código de aplicación como bits de etiqueta". La documentación en un archivo de encabezado público es lo más cercana posible a un "contrato de programación" , por lo que el primer reclamo es incorrecto.
BlueRaja - Danny Pflughoeft

2
@BlueRaja, "No muy conocido es que los dos bits inferiores de MANEJOS del núcleo son siempre cero; en otras palabras, su valor numérico siempre es un múltiplo de 4. " El código en ntdef.h se aplica también a otros tipos de controladores (Manijas de
usuario

37
@BlueRaja: los controladores de kernel son múltiples de cuatro y eso es contractual, por lo que puede confiar en él; identificadores de proceso (que son no lo mismo que se encarga de proceso), en cambio, pasan a ser múltiplo de cuatro, pero eso es sólo un detalle de implementación, por lo que no debe confiar en ella.
Matteo Italia

66
@BlueRaja Creo que Raymond le diría que quien escribió la documentación miró al mundo a través de anteojos de color de grano y, por lo tanto, solo se refirió a los mangos de los granos y no a otros tipos de mangos.
CodesInChaos

1
@Mehrdad: bueno, los manejadores USER y GDI normalmente no se llaman manejadores "kernel" (aunque son generados por componentes que se ejecutan en el llamado modo kernel).
Matteo Italia
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.