Se os computadores começam a contar em 0, por que o processo init tem um pid de 1?

26

Não há muito para colocar aqui no corpo, a questão é auto-explicativa.

    
por benwaffle 19.11.2013 / 14:27

3 respostas

28

Os processos precisam ter um pai (PPID). O kernel, apesar de não ser um processo real, ainda oferece alguns processos reais como, pelo menos, init, e está dando a si o ID do processo. Dependendo do sistema operacional, ele pode ou não ser exibido como um processo em ps output, mas é sempre exibido como um PPID:

por exemplo, no 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]
...

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

Observe também que pid 0 (e -1 e outros valores negativos para esse assunto) têm significados diferentes, dependendo de qual função os usam, como kill , fork e waitpid .

Por fim, embora o processo init receba tradicionalmente pid #1 , esse não é mais o caso quando a virtualização no nível do sistema operacional é usada como as regiões do Solaris, pois pode haver mais de um init em execução:

$ 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
    
por 19.11.2013 / 14:44
5

Há duas tarefas com IDs de processo especialmente distintos: swapper ou sched tem ID de processo 0 e é responsável pela paginação, como jlliagre colocou nos exemplos anteriores, e é realmente parte do kernel em vez de um processo normal de modo de usuário.

O ID do processo 1 é geralmente o processo inicial principalmente responsável por iniciar e encerrar o sistema. Originalmente, o ID do processo 1 não era especificamente reservado para o init por nenhuma medida técnica: ele simplesmente tinha esse ID como uma consequência natural de ser o primeiro processo invocado pelo kernel. Sistemas Unix mais recentes normalmente têm componentes adicionais do kernel visíveis como 'processos', caso em que o PID 1 é reservado para o processo init para manter a consistência com sistemas mais antigos.

    
por 19.11.2013 / 16:50
4

Em geral, 0 é frequentemente usado para significar uma 'referência nula'. Isso significa que mesmo que o valor 0 exista, você pode não usá-lo porque deseja zero para significar um valor especial.

    
por 19.11.2013 / 18:23