Se i computer iniziano a contare da 0, perché il processo di init ha un pid di 1?


27

Non c'è molto da mettere qui nel corpo.


18
pid0 ha un significato speciale per la kill(2)chiamata di sistema dove significa me stesso e per waitpid(2)dove significa almeno qualsiasi processo nel mio gruppo di processi . Per non parlare del fatto che fork()tornare 0significa che siamo nel bambino.
Stéphane Chazelas,

1
dovresti inviarlo come risposta
Jonathan Muller,

3
Lo zero fa sì che i flag vengano impostati automaticamente sulla maggior parte dei registri di stato della CPU quando viene caricato in un registro, consentendo a un ramo di utilizzarlo senza confrontarlo / testare specificamente per esso. Pertanto è molto usato come valore "sentinella", cioè un valore che significa "non valido", "fine dei dati" o "caso speciale" qui. Quindi, anche se i computer iniziano a contare da 0, ci saranno molti casi in cui 1 è il primo valore valido per l'applicazione o la struttura dati in questione.
LawrenceC

4
Una nota a margine: i computer non iniziano a contare da zero. Molti linguaggi di programmazione e credo che tutti i linguaggi automatici utilizzino gli offset in cui altri (e la maggior parte degli umani) usano gli indici ma, indipendentemente da ciò, il conteggio sta contando. Un array con due elementi ha due elementi (contali), indipendentemente dal fatto che la tua lingua si riferisca a loro per offset o per indice.
jillill

questo è probabilmente il caso di opposti paradigmi di programmazione: la gravitazione del programmatore verso valori di bandiera speciali (zero, uno negativo) supera l'attrazione minore di una propensione per i sistemi di numerazione a base zero.
michael

Risposte:


29

I processi devono avere un genitore (PPID). Il kernel, nonostante non sia un processo reale, sta comunque realizzando alcuni processi reali come almeno init, e si sta dando l'ID di processo 0. A seconda del sistema operativo potrebbe essere visualizzato o meno come processo in psoutput ma viene sempre visualizzato come PPID:

ad es. su 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]
...

su 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
...

Nota anche che pid 0(e -1altri valori negativi per quella materia) hanno significati diversi a seconda della funzione che li usano come kill, forke waitpid.

Infine, mentre il initprocesso viene tradizionalmente dato pid #1, questo non è più il caso quando la virtualizzazione a livello di sistema operativo viene utilizzata come le zone Solaris, poiché può essercene più di una in initesecuzione:

$ 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

Esistono due attività con ID di processo particolarmente distinti: swapper o sched ha l'ID di processo 0 ed è responsabile del paging, come jlliagre messo negli esempi prima, ed è effettivamente parte del kernel piuttosto che un normale processo in modalità utente.

L'ID processo 1 è in genere il processo di init principalmente responsabile dell'avvio e dell'arresto del sistema. Inizialmente, l'ID processo 1 non era specificamente riservato per init da alcuna misura tecnica: aveva semplicemente questo ID come conseguenza naturale dell'essere il primo processo invocato dal kernel. I sistemi Unix più recenti in genere hanno componenti del kernel aggiuntivi visibili come "processi", nel qual caso il PID 1 è attivamente riservato al processo init per mantenere la coerenza con i sistemi più vecchi.


4

In generale, 0 viene spesso utilizzato per indicare un "riferimento null". Ciò significa che anche se esiste il valore 0, potresti non utilizzarlo perché vuoi che zero significhi un valore speciale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.