Frage Warum gibt es keine seltsamen Windows-Prozess-IDs?


Es gibt viele Möglichkeiten, Prozess-IDs in Windows zu untersuchen.

Verwenden Sie beispielsweise den PowerShell-Befehl:

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

Wir sehen folgende Ausgabe:

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

Alle Prozess-IDs sind gerade Zahlen und zusätzlich sind sie alle Vielfache von 4.

Es gibt keine ungeraden Prozess-IDs in Windows-Versionen, die auf Windows NT basieren.

Was ist der Grund dafür?


158
2017-07-06 08:21


Ursprung


Möglicherweise interessant: Einige Details über Linux - justskins.com/forums/why-are-process-ids-204416.html - Dave
Tatsächlich gibt es keine. Das ist seltsam. - AndreKR


Antworten:


"Warum gibt es keine seltsamen Windows-Prozess-IDs?"

Derselbe Code, der Kernel-Handles zuweist, wird auch verwendet   Ordnen Sie Prozess- und Thread-IDs zu. Da Kernel-Handles ein Vielfaches sind   von vier, so sind auch Prozess- und Thread-IDs.


Warum sind Prozess- und Thread-IDs ein Vielfaches von vier?

Auf Windows NT-basierten Betriebssystemen treten Prozess- und Thread-IDs auf   immer ein Vielfaches von vier sein. Ist das nur Zufall?

Ja, es ist nur ein Zufall, und Sie sollten sich nicht darauf verlassen, weil es so ist   nicht Teil des Programmiervertrags. Zum Beispiel, Windows 95 Prozess   und Thread-IDs waren nicht immer Vielfache von vier. (Zum Vergleich: die   Grund, dass Kernel-Handles immer ein Vielfaches von vier sind   die Spezifikation und wird auf absehbare Zeit garantiert.)

Prozess- und Thread-IDs sind ein Vielfaches von vier als Nebeneffekt des Codes   Wiederverwendung. Derselbe Code, der Kernel-Handles zuweist, wird auch verwendet   Ordnen Sie Prozess- und Thread-IDs zu. Da Kernel-Handles ein Vielfaches sind   von vier, so sind auch Prozess- und Thread-IDs. Dies ist eine Implementierung   Detail, also schreibe keinen Code, der darauf angewiesen ist. Ich sage es dir nur   befriedige deine Neugierde.

Quelle Warum sind Prozess- und Thread-IDs ein Vielfaches von vier?


Warum sind Kernel-GRIFFE immer ein Vielfaches von vier?

Nicht sehr bekannt ist, dass die beiden unteren Bits von Kernel-GRIFFEN sind   immer Null; mit anderen Worten, ihr numerischer Wert ist immer ein Vielfaches   von 4. Beachten Sie, dass dies nur für Kernel-GRIFFE gilt; es trifft nicht zu   zu Pseudo-Handles oder zu jeder anderen Art von Handle (USER-Handles, GDI   Griffe, Multimedia-Griffe ...) Kernel-Griffe sind Dinge, die Sie weitergeben können   zur CloseHandle-Funktion.

Die Verfügbarkeit der unteren zwei Bits ist im ntdef.h vergraben   Header-Datei:

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

Das zumindest das unterste Bit von Kernel HANDLE ist immer Null ist   impliziert durch die GetQueuedCompletionStatus-Funktion, die angibt   Sie können festlegen, dass das unterste Bit des Ereignishandle unterdrückt wird   Benachrichtigung über den Abschluss-Port. Damit dies funktioniert, der Boden   Bit muss normalerweise Null sein.

Diese Information ist für die meisten Anwendungsentwickler nicht nützlich   sollte HANDLE weiterhin als undurchsichtige Werte behandeln. Die Leute die   wäre an Tag-Bits interessiert, sind diejenigen, die implementieren   Low-Level-Klassenbibliotheken oder Wrapping Kernel-Objekte innerhalb einer   größerer Rahmen.

Quelle Warum sind Kernel-GRIFFE immer ein Vielfaches von vier?


Weiterführende Literatur



166
2017-07-06 09:13



Ein Zitat sagt "Sie sollten sich nicht darauf verlassen, da es nicht Teil des Programmiervertrags ist" aber dann die nächsten Ansprüche ntdef.h sagt die Bits sind "verfügbar für den Anwendungscode als Tag-Bits."  Die Dokumentation in einer öffentlichen Header-Datei ist ungefähr so ​​nah an a "Programmiervertrag" Wie Sie bekommen können, ist die erste Behauptung falsch. - BlueRaja - Danny Pflughoeft
@BlueRaja, "Nicht sehr bekannt ist, dass die unteren zwei Bits von Kernel-GRIFFE sind immer Null; mit anderen Worten, ihr numerischer Wert ist immer ein Vielfaches von 4."Der Code in ntdef.h gilt auch für andere Arten von Handles (USER-Handles, GDI-Handles, Multimedia-Handles ...) - DavidPostill♦
@BlueRaja: Kernel-Griffe sind ein Vielfaches von vier und das ist vertraglich, so dass man sich darauf verlassen kann; Prozess-IDs (welche sind nicht das gleiche wie Prozesshandles), stattdessen geschehen um ein Vielfaches von vier zu sein, aber das ist nur ein Implementierungsdetail, also sollten Sie sich nicht darauf verlassen. - Matteo Italia
@BlueRaja Ich denke, Raymond würde dir sagen, dass derjenige, der die Dokumentation geschrieben hat, die Welt durchschaut hat kernfarbene Gläser und bezog sich nur auf Kernel-Handles und nicht auf andere Arten von Handles. - CodesInChaos
@Mehrdad: Nun, USER und GDI-Handles werden normalerweise nicht als "Kernel" -Handles bezeichnet (obwohl sie von Komponenten generiert werden, die im sogenannten Kernel-Modus laufen). - Matteo Italia