Wenn Computer bei 0 beginnen zu zählen, warum hat der Init-Prozess eine PID von 1?

27

Nicht viel hier in den Körper zu stecken.

benwaffle
quelle
18
pid0 hat eine besondere Bedeutung für den kill(2)Systemaufruf, bei dem es sich um mich selbst handelt und bei waitpid(2)dem es sich mindestens um einen Prozess in meiner Prozessgruppe handelt . Ganz zu schweigen davon, dass die fork()Rückkehr 0bedeutet, dass wir im Kind sind.
Stéphane Chazelas
1
Sie sollten dies als Antwort posten
Jonathan Muller
3
Null bewirkt, dass Flags in den meisten Statusregistern der CPU automatisch gesetzt werden, wenn sie in ein Register geladen werden, so dass eine Verzweigung darauf zugreifen kann, ohne sie speziell zu vergleichen / zu testen. Daher wird es sehr häufig als "Sentinel" -Wert verwendet, dh ein Wert, der hier "ungültig", "Datenende" oder "Sonderfall" bedeutet. Obwohl Computer bei 0 beginnen zu zählen, gibt es viele Fälle, in denen 1 der erste gültige Wert für die betreffende Anwendung oder Datenstruktur ist.
LawrenceC
4
Eine Randnotiz: Computer beginnen nicht bei Null zu zählen. Viele Programmiersprachen und ich glaube, dass alle Maschinensprachen Offsets verwenden, bei denen andere (und die meisten Menschen) Indizes verwenden, aber unabhängig davon, was zählt, zählt das Zählen. Ein Array mit zwei Elementen besteht aus zwei Elementen (zählt sie), unabhängig davon, ob Ihre Sprache nach Offset oder Index auf sie verweist.
19.
Dies ist wahrscheinlich ein Fall von entgegengesetzten zugrundeliegenden Programmierparadigmen: Die Gravitation des Programmierers in Richtung spezieller Flag-Werte (null, negative eins) übertrifft die geringere Anziehungskraft einer Neigung für auf null basierende Nummerierungssysteme.
Michael

Antworten:

29

Prozesse müssen eine übergeordnete (PPID) haben. Obwohl der Kernel kein echter Prozess ist, fertigt er einige echte Prozesse wie mindestens init von Hand und gibt sich die Prozess-ID 0. Abhängig vom Betriebssystem wird er möglicherweise als Prozess in der psAusgabe angezeigt oder auch nicht, wird aber immer angezeigt als PPID:

zB unter Linux:

$ ps -ef|head
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 09:09 ?        00:00:00 /sbin/init
root         2     0  0 09:09 ?        00:00:00 [kthreadd]
root         3     2  0 09:09 ?        00:00:00 [ksoftirqd/0]
...

unter Solaris:

$ ps -ef|head
     UID   PID  PPID   C    STIME TTY         TIME CMD
    root     0     0   0   Oct 19 ?           0:01 sched
    root     5     0   0   Oct 19 ?          11:20 zpool-rpool1
    root     1     0   0   Oct 19 ?           0:13 /sbin/init
    root     2     0   0   Oct 19 ?           0:07 pageout
    root     3     0   1   Oct 19 ?         117:10 fsflush
    root   341     1   0   Oct 19 ?           0:15 /usr/lib/hal/hald --daemon=yes
    root     9     1   0   Oct 19 ?           0:59 /lib/svc/bin/svc.startd
...

Beachten Sie auch , dass pid 0(und -1und andere negative Werte für diese Angelegenheit) haben unterschiedliche Bedeutungen je nachdem , was Funktion nutzen sie mögen kill, forkund waitpid.

Obwohl der initProzess traditionell mit pid angegeben wird #1, ist dies nicht mehr der Fall, wenn Virtualisierung auf Betriebssystemebene wie Solaris-Zonen verwendet wird, da mehrere initausgeführt werden können:

$ ps -ef|head
     UID   PID  PPID   C    STIME TTY         TIME CMD
    root  4733  3949   0 11:07:25 ?           0:26 /lib/svc/bin/svc.configd
    root  4731  3949   0 11:07:24 ?           0:06 /lib/svc/bin/svc.startd
    root  3949  3949   0 11:07:14 ?           0:00 zsched
  daemon  4856  3949   0 11:07:46 ?           0:00 /lib/crypto/kcfd
    root  4573  3949   0 11:07:23 ?           0:00 /usr/sbin/init
  netcfg  4790  3949   0 11:07:34 ?           0:00 /lib/inet/netcfgd
    root  4868  3949   0 11:07:48 ?           0:00 /usr/lib/pfexecd
    root  4897  3949   0 11:07:51 ?           0:00 /usr/lib/utmpd
  netadm  4980  3949   0 11:07:54 ?           0:01 /lib/inet/nwamd
jlliagre
quelle
5

Es gibt zwei Tasks mit speziell definierten Prozess-IDs: swapper oder sched hat die Prozess-ID 0 und ist für das Paging verantwortlich, wie in den vorherigen Beispielen beschrieben, und ist eher Teil des Kernels als ein normaler Prozess im Benutzermodus.

Die Prozess-ID 1 ist normalerweise der Initialisierungsprozess, der hauptsächlich für das Starten und Herunterfahren des Systems verantwortlich ist. Ursprünglich war die Prozess-ID 1 durch keine technischen Maßnahmen speziell für init reserviert: Sie hatte lediglich diese ID als natürliche Folge des ersten vom Kernel aufgerufenen Prozesses. Neuere Unix-Systeme haben in der Regel zusätzliche Kernel-Komponenten, die als "Prozesse" angezeigt werden. In diesem Fall ist PID 1 aktiv für den Init-Prozess reserviert, um die Konsistenz mit älteren Systemen zu gewährleisten.

curratore
quelle
4

Im Allgemeinen wird 0 häufig verwendet, um eine Nullreferenz zu kennzeichnen. Dies bedeutet, dass der Wert 0 möglicherweise nicht verwendet wird, da Null einen bestimmten Wert kennzeichnen soll.

user606723
quelle