Warum gibt es keine ungeraden Windows-Prozess-IDs?

160

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 die 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 ein Vielfaches von 4 .

Unter Windows-Versionen, die auf Windows NT basieren, gibt es keine ungewöhnlichen Prozess-IDs.

Was ist der Grund dafür?

Peter Hahndorf
quelle
6
Möglicherweise interessant: Einige Details zu Linux - justskins.com/forums/why-are-process-ids-204416.html
Dave
13
In der Tat gibt es keine. Das ist seltsam.
AndreKR

Antworten:

168

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

Derselbe Code, der Kernel-Handles zuweist, wird auch zum Zuweisen von Prozess- und Thread-IDs verwendet. Da Kernel-Handles ein Vielfaches von vier sind, sind dies auch Prozess- und Thread-IDs.


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

Unter Windows NT-basierten Betriebssystemen sind Prozess- und Thread-IDs immer ein Vielfaches von vier. Ist das nur ein Zufall?

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

Prozess- und Thread-IDs sind ein Vielfaches von vier als Nebeneffekt der Wiederverwendung von Code. Derselbe Code, der Kernel-Handles zuweist, wird auch zum Zuweisen von Prozess- und Thread-IDs verwendet. Da Kernel-Handles ein Vielfaches von vier sind, sind dies auch Prozess- und Thread-IDs. Dies ist ein Implementierungsdetail. Schreiben Sie also keinen Code, der darauf basiert. Ich sage dir nur, dass du deine Neugier befriedigen sollst.

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


Warum sind Kernel-HANDLES immer ein Vielfaches von vier?

Nicht sehr bekannt ist, dass die unteren beiden Bits von Kernel-HANDLEs immer Null sind. Mit anderen Worten, ihr numerischer Wert ist immer ein Vielfaches von 4. Beachten Sie, dass dies nur für Kernel-Handles gilt. Dies gilt nicht für Pseudo-Handles oder andere Arten von Handles (USER-Handles, GDI-Handles, Multimedia-Handles ...). Kernel-Handles sind Dinge, die Sie an die CloseHandle-Funktion übergeben können.

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

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

Dass mindestens das unterste Bit von Kernel-HANDLEs immer Null ist, wird von der Funktion GetQueuedCompletionStatus impliziert, die angibt, dass Sie das unterste Bit des Ereignis-Handles festlegen können, um die Abschluss-Port-Benachrichtigung zu unterdrücken. Damit dies funktioniert, muss das untere Bit normalerweise Null sein.

Diese Informationen sind für die meisten Anwendungsentwickler nicht hilfreich, die HANDLEs weiterhin als undurchsichtige Werte behandeln sollten. Die Leute, die sich für Tag-Bits interessieren würden, sind diejenigen, die Bibliotheken auf niedriger Ebene implementieren oder Kernel-Objekte in einem größeren Framework verpacken.

Source Warum sind Kernel-HANDLES immer ein Vielfaches von vier?


Weitere Lektüre


DavidPostill
quelle
3
In einem Zitat heißt es: "Sie sollten sich nicht darauf verlassen, da es nicht Teil des Programmiervertrags ist." In den nächsten Ansprüchen heißt es in ntdef.h: "Die Bits können vom Anwendungscode als Tag-Bits verwendet werden." Die Dokumentation in einer öffentlichen Header-Datei kommt einem "Programmiervertrag" so nahe wie möglich, sodass die erste Behauptung falsch ist.
BlueRaja - Danny Pflughoeft
2
@BlueRaja, "Nicht sehr bekannt ist, dass die unteren beiden Bits von Kernel-HANDLE immer Null sind. 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
37
@BlueRaja: Kernel-Handles sind ein Vielfaches von vier, und das ist vertraglich geregelt, sodass Sie sich darauf verlassen können. Prozess - IDs (die nicht das gleiche wie Verfahren behandelt), stattdessen passieren Vielfaches von vier sein, aber das ist nur eine Implementierung Detail, so dass Sie nicht darauf verlassen sollte.
Matteo Italia
6
@BlueRaja Ich denke, Raymond würde dir sagen, wer auch immer die Dokumentation geschrieben hat, hat die Welt durch kernfarbene Gläser betrachtet und sich daher nur auf Kernel-Griffe und nicht auf andere Arten von Griffen bezogen.
CodesInChaos
1
@Mehrdad: Nun, USER- und GDI-Handles werden normalerweise nicht als "Kernel" -Handles bezeichnet (obwohl sie von Komponenten generiert werden, die im sogenannten Kernel-Modus ausgeführt werden).
Matteo Italia