Por que os processos não preenchem IDs de processo vazios?

2

Todo mundo sabe que o número 1 do PID é systemd (ou algo equivalente). E todo processo depois disso leva outro PID, contando.

No entanto, quando há 50 processos em execução (até PID 50) e o processo com PID 2 termina e um novo processo é iniciado, não será PID 2, mas será PID 51. Por que isso?

Eu notei que, por exemplo com descritores de arquivos, não é assim, mas quando eu fechar o descritor de arquivos 4 e abrir um novo descritor de arquivos, ele terá o número 4.

    
por hgiesel 10.04.2016 / 18:01

1 resposta

3

A maioria das variantes Unix aloca IDs de processo sequencialmente: 1, 2, 3, 4, ... Quando o maior valor de PID possível é atingido, eles começam novamente em 1, ignorando os PIDs que já existem.

Isto não é uma obrigação. Por exemplo, o OpenBSD atribui PIDs aleatoriamente, não seqüencialmente; esta também é uma opção no FreeBSD. O objetivo é melhorar a segurança, embora os benefícios sejam duvidosos .

Há uma vantagem (duvidosa) para esse comportamento: torna raro que uma identificação de processo seja reutilizada imediatamente após o processo ser interrompido. Existem muitos programas por aí que monitoram processos e assumem que, após o processo morrer, o PID não estará em uso - o que será interrompido se o PID for usado por um novo processo. Esses programas têm uma desculpa: não há boas APIs para monitorar um processo, exceto de seus pais. Mas esses programas são difundidos o suficiente para que o OpenBSD evite a reutilização de um PID por alguns instantes (alguns minutos, se bem me lembro) após um processo ter morrido.

A principal razão para esse comportamento é que foi feito nos sistemas Unix tradicionais e não há motivos strongs para mudar. Para descritores de arquivos, o Unix historicamente usou o primeiro número fd livre, e esse comportamento foi feito um padrão oficial, então todos os sistemas Unix / POSIX têm que fazer desta forma.

    
por 11.04.2016 / 02:01