Warum ist System PID 4 nicht PID 1?

1721
Hydraxan14

Mein Google-Fu hat mich versagt!

Unter Linux ist der Prozess mit der niedrigsten PID die initPID 1, da dies der erste Prozess ist, der nach dem Laden des Kernels gestartet wird, und für den Start aller anderen Prozesse verantwortlich ist.

pi@raspberry:~ $ ps -ef --sort=pid | head -n 5 UID PID PPID C STIME TTY TIME CMD root 1 0 0 Jan22 ? 00:02:20 /sbin/init root 2 0 0 Jan22 ? 00:00:00 [kthreadd] root 3 2 0 Jan22 ? 00:05:54 [ksoftirqd/0] root 5 2 0 Jan22 ? 00:00:00 [kworker/0:0H] 

Unter Windows ist der Prozess mit der niedrigsten PID die SystemPID 4.

PS C:\Users\msbob> Get-Process | Sort-Object Id | Select -First 5  Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 0 0 0 24 0 0 Idle 755 0 144 844 4 4 System 32 1 556 1268 4 388 smss 521 82 139796 124204 390 6.07 424 iexplore 661 12 2268 4728 49 604 csrss 

Warum ist SystemPID 4 unter Windows und nicht PID 1?

1

1 Antwort auf die Frage

5
Jamie Hanrahan

Sie werden feststellen, dass alle PIDs durch 4 teilbar sind. 4 ist daher die erste verfügbare PID nach 0 (was der Leerlaufprozess ist).

Aus dem Grund, dass das wahr ist, finden Sie in diesem MSDN - Beitrag von Raymond Chen:

Prozess- und Thread-IDs sind Vielfache von vier als Nebeneffekt der Wiederverwendung von Code. Der gleiche Code, den der Kernel zuweist, wird auch für die Zuordnung von Prozess- und Thread-IDs verwendet. Da Kernel-Handles ein Vielfaches von vier sind, gilt dies auch für Prozess- und Thread-IDs.

Beachten Sie jedoch, dass Prozess-IDs eigentlich nicht für die Verarbeitung von Werten für diese Prozesse geeignet sind. Die Zahlen werden nur mit demselben Algorithmus generiert.

Und aus dem Grund, dass Kernel-Handles immer durch vier teilbar sind ... Raymond Chen zur Rettung !

Die Verfügbarkeit der beiden unteren Bits ist in der Headerdatei ntdef.h enthalten:

// Low order two bits of a handle are ignored by the system and available  // for use by application code as tag bits. The remaining // and used to store a serial number and table index.  #define OBJ_HANDLE_TAGBITS 0x00000003L 

(Für diejenigen, die mit binären Zahlen nicht vertraut sind: Eine positive binäre Ganzzahl mit ihren zwei niederwertigen Bits Null ist immer durch vier teilbar, genau wie eine Dezimalzahl, die mit "00" endet, immer durch 100 teilbar ist.)

Also ... eine wunderliche Antwort ist, dass die erste PID wirklich "1" ist. Es ist nur so, dass der Task-Manager ua nicht weiß, dass er in der internen Form um zwei Bits nach links verschoben ist. :)

Aha! Googeln "Windows PID durch 4 teilbar" brachte mich zu [diese Antwort] (http://superuser.com/a/571470/676912), die mehr Details enthält. Vielen Dank! Hydraxan14 vor 7 Jahren 0
Ich fügte weitere Informationen hinzu, basierend auf den MSDN-Blogbeiträgen von Raymond Chen, von denen der erste von dieser Antwort abgelehnt wurde. Jamie Hanrahan vor 7 Jahren 0
Danke an wen auch immer für die "beste Antwort" und die zusätzlichen Upvotes. :) Jamie Hanrahan vor 7 Jahren 0