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.