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

27

Não há muito para colocar aqui no corpo.

benwaffle
fonte
18
pid0 tem um significado especial para a kill(2)chamada do sistema em que significa eu mesmo e para waitpid(2)onde significa pelo menos qualquer processo no meu grupo de processos . Sem mencionar que fork()retornar 0significa que estamos na criança.
Stéphane Chazelas
11
você deve publicá-lo como resposta #
Jonathan Muller
3
Zero faz com que os sinalizadores sejam definidos automaticamente na maioria dos registros de status da CPU quando carregados em um registro, permitindo que uma ramificação seja executada sem compará-los / testá-los especificamente. Portanto, é muito usado como um valor "sentinela", ou seja, um valor que significa "inválido", "fim dos dados" ou "caso especial" aqui. Portanto, mesmo que os computadores comecem a contar em 0, haverá muitos casos em que 1 é o primeiro valor válido para o aplicativo ou a estrutura de dados em questão.
18713 Lawrence13
4
Uma observação: os computadores não começam a contar em zero. Muitas linguagens de programação e acredito que todas as linguagens de máquina usam deslocamentos onde outras pessoas (e a maioria das pessoas) usam índices, mas, não importa o quê, a contagem está contando. Uma matriz com dois elementos possui dois elementos (conte-os), independentemente de seu idioma se referir a eles por deslocamento ou por índice.
jthill
este é provavelmente um caso de paradigmas subjacentes de programação opostos: a gravitação do programador em relação a valores de flag especiais (zero, negativo) supera a menor atração de uma tendência para sistemas de numeração baseados em zero.
22613 Michael

Respostas:

29

Os processos precisam ter um pai (PPID). O kernel, apesar de não ser um processo real, está, no entanto, criando alguns processos reais, como pelo menos o init, e está fornecendo o ID de processo 0. Dependendo do sistema operacional, ele pode ou não ser exibido como um processo na pssaída, 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 -1outros valores negativos) têm significados diferentes, dependendo da função que eles usam kill, forke waitpid.

Por fim, enquanto o initprocesso é tradicionalmente considerado pid #1, isso não acontece mais quando a virtualização no nível do SO é usada como zonas Solaris, pois pode haver mais de uma initexecuçã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
jlliagre
fonte
5

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

O ID do processo 1 geralmente é o processo de inicialização principal responsável por iniciar e desligar 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 conseqüência natural de ser o primeiro processo invocado pelo kernel. Os sistemas Unix mais recentes geralmente têm componentes adicionais do kernel visíveis como 'processos'; nesse caso, o PID 1 é reservado ativamente para que o processo init mantenha consistência com os sistemas mais antigos.

curratore
fonte
4

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

user606723
fonte