Jeśli komputery zaczynają liczyć od 0, dlaczego proces inicjowania ma pid 1?


27

Niewiele tu do umieszczenia w ciele.


18
pid0 ma specjalne znaczenie dla kill(2)wywołania systemowego gdzie to znaczy ja i waitpid(2)gdzie to oznacza jakikolwiek proces w mojej grupie procesowej co najmniej. Nie wspominając, że fork()powrót 0oznacza, że ​​jesteśmy w dziecku.
Stéphane Chazelas,

1
powinieneś opublikować to jako odpowiedź
Jonathan Muller,

3
Zero powoduje, że flagi są automatycznie ustawiane w większości rejestrów statusu procesora, gdy jest on ładowany do rejestru, umożliwiając oddziałowi pobranie go bez specjalnego porównywania / testowania. Dlatego jest bardzo często używany jako wartość „wartownika”, tj. Wartość, która oznacza tutaj „nieprawidłowy”, „koniec danych” lub „przypadek specjalny”. Więc nawet jeśli komputery zaczną liczyć na 0, będzie wiele przypadków, w których 1 jest pierwszą poprawną wartością dla danej aplikacji lub struktury danych.
LawrenceC,

4
Uwaga dodatkowa: komputery nie zaczynają odliczać od zera. Wiele języków programowania i wierzę, że wszystkie języki maszynowe używają przesunięć, podczas gdy inni (i większość ludzi) używają indeksów, ale bez względu na to, liczenie się liczy. Tablica z dwoma elementami ma dwa elementy (policz je), bez względu na to, czy Twój język odwołuje się do nich przez offset, czy przez indeks.
jthill

jest to prawdopodobnie przypadek przeciwstawnego paradygmatu programowania: grawitacja programisty w kierunku specjalnych wartości flag (zero, ujemna) przewyższa mniejszą skłonność skłonności do zerowania systemów numeracji.
Michael

Odpowiedzi:


29

Procesy muszą mieć element nadrzędny (PPID). Jądro, mimo że nie jest prawdziwym procesem, ręcznie wykonuje niektóre rzeczywiste procesy, takie jak przynajmniej init, i nadaje sobie identyfikator procesu 0. W zależności od systemu operacyjnego może być wyświetlany lub nie jako proces pswyjściowy, ale zawsze jest wyświetlany jako PPID:

np. w systemie 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]
...

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

Zauważ też, że pid 0(i -1inne ujemne wartości w tym zakresie) mają różne znaczenia w zależności od tego, jak funkcja ich używa kill, forkoraz waitpid.

Wreszcie, chociaż initproces ten jest tradycyjnie nazywany pid #1, nie ma to już miejsca, gdy wirtualizacja na poziomie systemu operacyjnego jest używana jak strefy Solaris, ponieważ może być inituruchomionych więcej niż jeden :

$ 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

5

Istnieją dwa zadania ze specjalnie wyróżnianymi identyfikatorami procesów: swapper lub harmonogram ma identyfikator procesu 0 i jest odpowiedzialny za stronicowanie, tak jak jlliagre w poprzednich przykładach, i faktycznie jest częścią jądra, a nie normalnym procesem w trybie użytkownika.

Identyfikator procesu 1 jest zwykle procesem inicjującym odpowiedzialnym przede wszystkim za uruchamianie i zamykanie systemu. Początkowo identyfikator procesu 1 nie był specjalnie zarezerwowany dla init za pomocą jakichkolwiek środków technicznych: po prostu miał ten identyfikator jako naturalną konsekwencję bycia pierwszym procesem wywoływanym przez jądro. Nowsze systemy uniksowe zazwyczaj mają dodatkowe komponenty jądra widoczne jako „procesy”, w którym to przypadku PID 1 jest aktywnie zarezerwowany dla procesu init, aby zachować spójność ze starszymi systemami.


4

Ogólnie 0 jest często używane do oznaczenia „zerowego odniesienia”. Oznaczało to, że chociaż istnieje wartość 0, możesz jej nie użyć, ponieważ chcesz, aby zero oznaczało wartość specjalną.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.