Como são PIDs
atribuídos em RHEL7?
Qual é a probabilidade de um PID
usado antes da inicialização ser atribuído a um processo após a reinicialização?
Em outras palavras, quão estatisticamente concebível é - on RHEL7
- que o mesmo PID
seja atribuído a um processo que inicia após a reinicialização de uma máquina, que é idêntico a um PID
que foi usado antes da reinicialização.
Editar:
Exemplo: antes de uma reinicialização, existe o daemon A com PID 544, a máquina é reinicializada e, após a reinicialização, o daemon A é iniciado e recebe o PID 544 atribuído.
Se o sistema init for determinístico, é altamente provável que os daemons iniciados por esse sistema init comecem com o mesmo pid nas reinicializações, pois o mesmo código será executado a cada inicialização (embora com randomização de ocasionais
fsck
ouselinux
remarcações ou outros não- em cada código de inicialização).No entanto,
systemd
no RHEL7 não é determinístico: os PIDs são alocados em sequência, mas executamsystemd
tarefas em paralelo, possivelmente em vários núcleos, possivelmente esperando por vários serviços de hardware ou rede. Vamos ver o que acontece antes e depois da lista de processos:Portanto, são dois processos (exceto os óbvios "PID eins" não aleatórios e threads do kernel marcados com
[
) com o mesmo PID. Em 30 reinicializações registrando praticamente as mesmas informações, parecesystemd
ser muito bom em randomizar os pids; durante essas reinicializações/usr/lib/systemd/systemd-logind
surgiu em:Os dados foram capturados com um serviço de inicialização:
que correu:
Assim que o sistema estiver funcionando, a ordem de criação do processo será randomizada quando os trabalhos não no
@reboot
cron forem acionados, os usuários fizerem login e executarem vários comandos diferentes, etc. Isso dependerá do sistema, quantos PIDs são criados nele, etc.Então, sim, é estatisticamente concebível que um daemon apareça no mesmo PID em um sistema RedHat que usa
systemd
. No entanto, as probabilidades variam dependendo do hardware e dos serviços exatos que o sistema oferece.Resposta curta
100%
(Não estou sugerindo que será a mesma imagem, embora init seja sempre PID=1. Só que depois que um processo morre, em algum momento seu PID será reutilizado.)
Resposta mais longa
Eles podem ser reutilizados antes da reinicialização. Eles contam até que todos os PIDs possíveis sejam usados e então começam novamente, evitando os que estão em uso.
Na reinicialização, eles reiniciam em 1 (o processo init é sempre 1).
Esta é uma resposta geral que deve ser verdadeira para TODOS os Unixs.
Existe 100% de certeza de que um determinado PID será reutilizado após uma reinicialização, mas não há garantia de que um determinado programa obterá o mesmo PID após uma reinicialização que tinha antes da reinicialização (e na maioria dos casos, não será ).
O Linux, como outros sistemas UNIX, usa um método simples para descobrir qual PID um processo recém-criado possui, ele apenas pega o próximo em ordem numérica após o PID usado para o último processo iniciado que não está em uso. Quando atinge o limite especificado por
/proc/sys/kernel/pid_max
, ele começa em 1 novamente. Observe que este sysctl é ajustável pelo usuário, mas, de uma perspectiva prática, apenas limita o número total de processos no sistema.Agora, há algumas exceções específicas a essa regra. Na inicialização, o que quer que seu sistema use como
init
(systemd por padrão no RHEL, mas você pode especificar um binário arbitrário na linha de comando do kernel) é sempre iniciado como PID 1. No Linux especificamente, PID 2 é semprekthreadd
, que é o processo central do kernel responsável por iniciar todos os outros encadeamentos do kernel, e muitos encadeamentos do kernel que são iniciados muito cedo geralmente também têm o mesmo PID nas reinicializações (por exemplo, PID 4 quase sempre será o encadeamento do manipulador softirq para CPU 0 em sistemas x86) , mas isso depende da configuração de hardware do sistema.