Pourquoi n'y a-t-il pas d'identifiants de processus Windows impairs-numérotés?
Si vous aimez bricoler avec Windows et apprendre au fur et à mesure, vous avez peut-être remarqué que les identificateurs de processus et de fil Windows sont numérotés de manière paire et sont des multiples de quatre. Pourquoi donc? Le message de questions et réponses du superutilisateur d'aujourd'hui contient les réponses aux questions d'un lecteur curieux.
La séance de questions et réponses d'aujourd'hui nous est offerte par SuperUser, une sous-division de Stack Exchange, un groupe de sites Web de questions-réponses dirigé par la communauté..
La question
Le lecteur de superutilisateur Peter Hahndorf veut savoir pourquoi il n’existe pas d’ID de processus Windows impairs:
Il existe de nombreuses manières d’examiner les ID de processus dans Windows. Utilisation de PowerShell:
J'obtiens ce résultat:
Comme vous pouvez le constater, tous les ID de processus sont numérotés de manière paire, pas seulement cela, ils sont tous des multiples de quatre. Vous pouvez regarder aussi fort que vous le souhaitez et vous ne trouverez jamais d'ID de processus impair, du moins sur aucune version basée sur Windows NT. Quelle est la raison pour ça?
Pourquoi n'y a-t-il pas d'identifiants de processus Windows impairs?
La réponse
DavidPostill, contributeur à SuperUser, a la solution pour nous:
Pourquoi n'y a-t-il pas d'identifiants de processus Windows impairs?
Le même code qui alloue les descripteurs de noyau est également utilisé pour allouer les ID de processus et de thread. Comme les descripteurs de noyau sont un multiple de quatre, il en va de même pour les identificateurs de processus et de thread.
Pourquoi les ID de processus et de fil sont-ils des multiples de quatre??
Sur les systèmes d'exploitation Windows NT, les ID de processus et de threads sont toujours un multiple de quatre. Est-ce juste une coïncidence?
Oui, c'est juste une coïncidence, et vous ne devriez pas compter dessus, car cela ne fait pas partie du contrat de programmation. Par exemple, les identifiants de processus et de threads Windows 95 n'étaient pas toujours des multiples de quatre. En comparaison, la raison pour laquelle les adresses de noyau sont toujours un multiple de quatre fait partie de la spécification et sera garantie dans un avenir proche..
Les ID de processus et de thread sont des multiples de quatre, ce qui est un effet secondaire de la réutilisation du code. Le même code qui alloue les descripteurs de noyau est également utilisé pour allouer les ID de processus et de thread. Les identifiants de noyau étant des multiples de quatre, il en va de même des identifiants de processus et de thread. Il s'agit d'un détail d'implémentation. N'écrivez pas de code qui en dépend. Je vous dis simplement de satisfaire votre curiosité.
La source: Pourquoi les ID de processus et de fil sont-ils des multiples de quatre??
Pourquoi le noyau traite-t-il toujours un multiple de quatre??
Ce que l’on ne sait pas très bien, c’est que les deux derniers bits des descripteurs de noyau sont toujours à zéro; autrement dit, leur valeur numérique est toujours un multiple de quatre. Notez que cela s’applique uniquement aux descripteurs du noyau; il ne s'applique pas aux pseudo-descripteurs ni à aucun autre type de descripteur (descripteurs USER, descripteurs GDI, descripteurs multimédias, etc.). Les descripteurs de noyau sont des éléments que vous pouvez transmettre à la fonction CloseHandle.
Qu'au moins le bit inférieur des descripteurs de noyau soit toujours égal à zéro, cela est impliqué par la fonction GetQueuedCompletionStatus, qui indique que vous pouvez définir le bit inférieur du descripteur d'événement pour supprimer la notification de port d'achèvement. Pour que cela fonctionne, le bit du bas doit normalement être zéro.
Ces informations ne sont pas utiles pour la plupart des rédacteurs d'applications, qui doivent continuer à traiter les descripteurs comme des valeurs opaques. Les personnes qui seraient intéressées par les balises sont celles qui implémentent des bibliothèques de classes de bas niveau ou encapsulent des objets du noyau dans un cadre plus large..
La source: Pourquoi le noyau traite-t-il toujours un multiple de quatre??
Lectures complémentaires
The Old New Thing: Développement pratique tout au long de l’évolution des fenêtres par Raymond Chen (Ingénieur principal en conception de logiciels chez Microsoft)
Avez-vous quelque chose à ajouter à l'explication? Sound off dans les commentaires. Voulez-vous lire plus de réponses d'autres utilisateurs de Stack Exchange doués en technologie? Découvrez le fil de discussion complet ici.