Como são gerados os PIDs?

37

No * nix, os PIDs são identificadores exclusivos para processos em execução. Como são gerados os PIDs? É apenas um inteiro que é incrementado ou uma estrutura mais complexa, como uma lista? Como eles são reciclados? Ao reciclar, quero dizer que, quando um processo termina, o PID será eventualmente reutilizado por outro processo.

    
por Giovanni Funchal 26.04.2010 / 16:08

4 respostas

35

Como wikipedia diz,

Under Unix, process IDs are usually allocated on a sequential basis, beginning at 0 and rising to a maximum value which varies from system to system. Once this limit is reached, allocation restarts at zero and again increases. However, for this and subsequent passes any PIDs still assigned to processes are skipped.

Portanto, é realmente uma política muito simples para "geração", apenas incrementar um contador e "reciclar", apenas envolver o número em um valor máximo e continuar incrementando até encontrar um número atribuído a um processo que tenha terminou e foi removido da tabela de processos.

Algumas implementações do Unix, como o AIX, usam uma política menos simples, consulte, por exemplo, esta FAQ .

    
por 26.04.2010 / 16:14
11

Isso varia.

A maioria dos sistemas simplesmente mantém uma contagem do último PID gerado, adicione um (encapsulamento em um número máximo como 65535 ou um pouco menor - geralmente o wrap ocorre em 65000 ou até mesmo 60000) e verifica se o número não está em uso (repetindo se o PID ainda estiver em uso - então o PID 1, o kernel, é ainda está lá e não é 'reeditado').

Outros sistemas de segurança geram um número aleatório e verificam se ele não está em uso.

A qualquer momento, é garantido que todos os números PID são únicos.

    
por 26.04.2010 / 16:15
6

Quanto à parte de reciclagem da questão, uma coisa a ter em mente é que um pid não se torna disponível assim que o processo com esse pid termina. O pid não fica disponível até que o pai desse processo colete o status de término de seu filho por meio de alguma forma da chamada do sistema wait (). Uma criança que é terminada, mas cujo pai não emitiu uma espera, é chamada de zumbi e geralmente aparece em um ps como extinta. É possível que um pai mal-comportado morra de fome o sistema de pids se ele lançar filhos e não esperar () por eles.

Se o pai de um processo morrer antes de coletar o status de um filho, tudo bem. O filho é herdado pelo init, que garante que um wait () seja emitido e o pid seja reciclado.

    
por 26.04.2010 / 19:13
3

Eles são números de sequência e envolvem (em um valor específico do sistema operacional) se o sistema estiver ativo por tempo suficiente. Os números nunca são reutilizados, a menos que estejam livres no ponto de fork() .

    
por 26.04.2010 / 16:15