O que acontece quando você fica sem PIDs?

8

Esta é uma questão puramente acadêmica, porque isso nunca acontecerá.

Se um PID for armazenado como o tipo pid_t, e não algum tipo de precisão arbitrária, haverá um limite para o número de PIDs que podem existir ao mesmo tempo. Existe um comportamento definido para quando os PIDs excederem?

O 65536 ° processo matará / sbin / init e criará um pânico no kernel? Ou existe alguma medida de segurança em vigor?

Fred Frey
fonte
2
stackoverflow.com/questions/6294133/maximum-pid-in-linux Acho que você poderia alterar o valor máximo e descobrir;)
2
Números mais baixos são reutilizados (o OpenBSD e outros selecionam aleatoriamente os PIDs) e você provavelmente atingirá outro limite (por exemplo, ficar sem memória por conta de todos os processos ou trocar a morte ou o OOM killer), antes de forkfalhar por não pid disponível.
thrig
1
Para obter informações: não acredito que tenha visto um PID maior que 2 ^ 15-1 = 32767. Você viu?
Th
3
Nenhuma das duplicatas sugeridas realmente responde a essa pergunta.
Julie Pelletier
1
Não está claro se você está perguntando o que acontece quando os PIDs atingem algum valor máximo (seja de 2 ^ 15 ou 2 ^ 32) ou o que acontece quando não é mais possível alocar um novo PID, o que não é a mesma coisa . Não acho que sua pergunta seja uma duplicata de nenhuma das perguntas marcadas; ambos perguntam qual é o limite, não o que acontece quando você o excede. Se você atualizar a pergunta para esclarecer o que está perguntando, votarei para reabri-la. (Você já tem respostas para ambas as versões possíveis.)
Keith Thompson

Respostas:

8

O forksyscall deve retornar -1 e definido errnocomo EAGAIN . O que acontecer depois disso dependerá do processo chamado fork.

Do garfo :

A função fork () falhará se:

[EAGAIN]

O sistema não possuía os recursos necessários para criar outro processo, ou o limite imposto pelo sistema ao número total de processos em execução em todo o sistema ou por um único usuário {CHILD_MAX} seria excedido.

JigglyNaga
fonte
9

O POSIX não especifica que o PID de cada novo processo seja obtido incrementando o PID anterior. Requer apenas que seja único.

Em um sistema em que os PIDs são incrementados em cada um deles fork(), observei que os valores retornam após atingir um limite superior (que na minha experiência é de cerca de 2 15 ). Depois de entender, os novos PIDs não são estritamente incrementados, pois alguns valores de PID ainda serão utilizados nos ciclos anteriores.

Não deve haver problema até que você tenha 2 N executando processos simultaneamente . Suspeito que o sistema tenha algum limite de capacidade muito antes disso. Nesse caso, a fork()chamada do sistema falharia e provavelmente configurada errnocomo EAGAINou ENOMEM( man forkpara detalhes).

O código implementado forkpode ou não verificar se existem PIDs disponíveis. Pode não incomodar, porque pressupõe que os recursos do sistema acabariam antes de chegar a esse ponto, ou pode ter uma verificação explícita por uma questão de integridade e para lidar com possibilidades futuras. Eu não verifiquei, e se eu tivesse, poderia apenas resolver o kernel que eu tinha examinado.

Keith Thompson
fonte
Claro que sei que isso nunca aconteceria, mas o sistema tem um número limitado de PIDs para atribuir. Eu só quero saber o que acontece quando acabar.
Fred Frey
1
Essa resposta é realmente a única que realmente responde à pergunta. O comportamento depende do sistema, mas só precisa garantir um pid exclusivo por novo processo. É claro que você fica limitado pela quantidade máxima configurada de PIDs, detalhada nas 2 perguntas marcadas como duplicadas, mas é muito improvável que isso aconteça, a menos que seu sistema esteja executando contêineres ou você tenha um erro grave em um programa ou script instalado.
Julie Pelletier
2

O limite máximo de PID é muito muito menor que 2^((sizeof(int)*CHAR_BIT) . Consulte Qual é o valor máximo do ID do Processo? . Em outras palavras, seus PIDs nunca chegarão perto de 4 bilhões.

Quando todos os slots pid estiverem preenchidos, as forkchamadas começarão a falhar errno==EAGAIN(consulte a bifurcação (2) ). Se você simplesmente atingir o topo sem preencher todos os slots, o próximo PID será o próximo slot livre após 1 (1 é init)

PSkocik
fonte