Question Pourquoi n'y a-t-il pas d'ID de processus Windows impair?


Il existe plusieurs manières d’examiner les ID de processus sous Windows.

Par exemple, en utilisant la commande PowerShell:

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

Nous voyons la sortie suivante:

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

Tous les identifiants de processus sont des nombres pairs et, en plus, ils sont tous multiples de 4.

Il n'y a pas d'ID de processus impair sur les versions de Windows basées sur Windows NT.

Quelle est la raison pour ça?


158
2017-07-06 08:21


origine


Peut-être intéressant: Quelques détails sur linux - justskins.com/forums/why-are-process-ids-204416.html - Dave
En effet il n'y en a pas. C'est étrange. - AndreKR


Réponses:


"Pourquoi n'y a-t-il pas d'ID de processus Windows impair?"

Le même code qui alloue les descripteurs du noyau est également utilisé pour   allouer les identifiants de processus et de threads. Puisque les descripteurs de noyau sont multiples   sur quatre, les identifiants de processus et de threads le sont aussi.


Pourquoi les ID de processus et de thread sont-ils des multiples de quatre?

Sur les systèmes d'exploitation Windows NT, les ID de processus et de thread se produisent   toujours être un multiple de quatre. Est-ce juste une coïncidence?

Oui, c’est juste une coïncidence, et vous ne devriez pas vous y fier car c’est   ne fait pas partie du contrat de programmation. Par exemple, processus Windows 95   et les identifiants de threads n'étaient pas toujours des multiples de quatre. (En comparaison, le   la raison pour laquelle les poignées du noyau sont toujours un multiple de quatre fait partie de   la spécification et sera garantie dans un avenir prévisible.)

Les identifiants de processus et de thread sont des multiples de quatre comme effet secondaire du code   réutilisation. Le même code qui alloue les descripteurs du noyau est également utilisé pour   allouer les identifiants de processus et de threads. Puisque les descripteurs de noyau sont multiples   sur quatre, les identifiants de processus et de threads le sont aussi. Ceci est une implémentation   détail, alors n'écrivez pas de code qui en dépend. Je vous dis juste de   satisfaire votre curiosité.

La source Pourquoi les ID de processus et de thread sont-ils des multiples de quatre?


Pourquoi les HANDLE du noyau sont-elles toujours un multiple de quatre?

On ne sait pas très bien que les deux derniers bits des HANDLE du noyau sont   toujours zéro; en d'autres termes, leur valeur numérique est toujours un multiple   de 4. Notez que cela ne concerne que les HANDLE du noyau; il ne s'applique pas   à des pseudo-poignées ou à tout autre type de poignée (poignées USER, GDI   poignées, poignées multimédias ...) Les poignées du noyau sont des choses que vous pouvez passer   à la fonction CloseHandle.

La disponibilité des deux derniers bits est enterrée dans le ntdef.h   En tête de fichier:

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

Au moins le bit inférieur de HANDLE du noyau est toujours nul.   implicite par la fonction GetQueuedCompletionStatus, qui indique   que vous pouvez définir le bit inférieur du descripteur d'événement pour supprimer   notification de port d'achèvement. Pour que cela fonctionne, le fond   bit doit normalement être zéro.

Cette information n'est pas utile pour la plupart des rédacteurs d'applications, qui   devrait continuer à traiter les POIGNÉES comme des valeurs opaques. Les personnes qui   serait intéressé par les bits d'étiquette sont ceux qui mettent en œuvre   bibliothèques de classes de bas niveau ou encapsulent des objets du noyau dans un   cadre plus large.

La source Pourquoi les HANDLE du noyau sont-elles toujours un multiple de quatre?


Lectures complémentaires



166
2017-07-06 09:13



Une citation dit "Vous ne devriez pas vous y fier car cela ne fait pas partie du contrat de programmation" mais alors les prochaines revendications ntdef.h dit que les bits sont "disponible pour être utilisé par le code d'application en tant que bits d'étiquette."  La documentation dans un fichier d'en-tête public est à peu près aussi proche d'un "contrat de programmation" comme vous pouvez obtenir, la première revendication est incorrecte. - BlueRaja - Danny Pflughoeft
@BlueRaja, "Pas très connu, c'est que les deux derniers bits de les HANDLE du noyau sont toujours nulles; en d'autres termes, leur valeur numérique est toujours un multiple de 4."Le code de ntdef.h s’applique également à d’autres types de poignées (poignées USER, poignées GDI, poignées multimédia ...) - DavidPostill♦
@BlueRaja: les descripteurs du noyau sont multiples et sont contractuels, vous pouvez donc vous y fier; identifiants de processus (qui sont ne pas les mêmes que les descripteurs de processus), à la place, se produire être multiple de quatre, mais ce n'est qu'un détail d'implémentation, vous ne devriez donc pas vous y fier. - Matteo Italia
@BlueRaja Je pense que Raymond vous dirait que celui qui a écrit la documentation a regardé le monde à travers verres de couleur noyau et donc seulement des poignées de noyau et pas d'autres types de poignées. - CodesInChaos
@Mehrdad: bien, les descripteurs USER et GDI ne sont généralement pas appelés "kernel" (bien qu'ils soient générés par des composants fonctionnant en mode noyau). - Matteo Italia