Por que o PID máximo em um sistema Linux de 64 bits 2 ^ 22?

22

Por que não 2 ^ 62 ou 2 ^ 31 ou qualquer outra coisa?

Qual é o valor máximo do ID do processo?

Avó
fonte
2
Isto é? Qual é a sua fonte?
muru
Isso é muito específico para o Linux. Não se aplica ao Unix em geral.
muru 24/09/15
Eu teria preferido usar um número inteiro completo de 64 bits, dessa maneira você poderia garantir que eles nunca serão reutilizados. A reutilização leva a condições de corrida em que o significado de um ID muda entre o momento em que você o obtém e o utiliza.
CodesInChaos

Respostas:

34

Parece ser uma escolha puramente arbitrária. Poderia ser qualquer coisa, mas alguém 1 sentiu 4 milhões é suficiente. Use a fonte :

/*
 * A maximum of 4 million PIDs should be enough for a while.
 * [NOTE: PID/TIDs are limited to 2^29 ~= 500+ million, see futex.h.]
 */
#define PID_MAX_LIMIT (CONFIG_BASE_SMALL ? PAGE_SIZE * 8 : \
    (sizeof(long) > 4 ? 4 * 1024 * 1024 : PID_MAX_DEFAULT))

A história do git parece remontar a 2005, e o valor é esse pelo menos há tanto tempo.


1 A página de manual diz que /proc/sys/kernel/pid_maxfoi adicionada em 2.5.34 e, olhando para o changelog , parece que alguém foi Ingo Molnár :

<[email protected]>
    [PATCH] pid-max-2.5.33-A0

    This is the pid-max patch, the one i sent for 2.5.31 was botched.  I
    have removed the 'once' debugging stupidity - now PIDs start at 0 again.
    Also, for an unknown reason the previous patch missed the hunk that had
    the declaration of 'DEFAULT_PID_MAX' which made it not compile ...

No entanto, o Ingo foi adicionado apenas DEFAULT_PID_MAX. PID_MAX_LIMITfoi adicionado por Linus Torvalds em 2.5.37 :

<[email protected]>
    Make pid_max grow dynamically as needed.

Acontece que eu li mal o changelog.

As alterações estão no patchset 2.5.37 :

diff -Nru a/include/linux/threads.h b/include/linux/threads.h
--- a/include/linux/threads.h   Fri Sep 20 08:20:41 2002
+++ b/include/linux/threads.h   Fri Sep 20 08:20:41 2002
@@ -17,8 +17,13 @@
 #define MIN_THREADS_LEFT_FOR_ROOT 4

 /*
- * This controls the maximum pid allocated to a process
+ * This controls the default maximum pid allocated to a process
  */
-#define DEFAULT_PID_MAX 0x8000
+#define PID_MAX_DEFAULT 0x8000
+
+/*
+ * A maximum of 4 million PIDs should be enough for a while:
+ */
+#define PID_MAX_LIMIT (4*1024*1024)

 #endif

Isso é tanto quanto minhas habilidades de pesquisa me permitem.


Graças a @hobbs, parece que Ingo é a pessoa, afinal. O patch que citei acima foi enviado pela primeira vez por ele. Na postagem do LKML que o acompanha:

a pegada de memória do novo alocador de PID é dimensionada dinamicamente com / proc / sys / kernel / pid_max: os PIDs de 32K padrão causam uma alocação de 4K, um pid_max de 1 milhão causa uma pegada de 128K. O limite absoluto atual para pid_max é de 4 milhões de PIDs - isso não causa alocação no kernel, os bitmaps são tempo de execução alocado por demanda. A tabela pidmap ocupa 512 bytes.

Houve uma discussão acalorada sobre ter limites mais altos, mas parece que nada saiu disso no final.

muru
fonte
2
Você pode obter um repositório git com um histórico mais profundo do Linux, adequado para arqueologia, usando as instruções em stackoverflow.com/questions/3264283/… . Isso mostra a5b5f6a "[PATCH] generic-pidhash-2.5.36-J2, BK-curr" de Ingo Molnar, visível aqui no LWN .
Hbbs #
@hobbs awesome! Afinal, é de Ingo Molnar. Eu me pergunto por que Linus se apropriou do changelog.
muru
11
@muru: Eu acredito que o BitKeeper não suporta a distinção entre autor e autor, essa foi uma das lições que Linus aplicou quando criou o Git. No IIRC, Ingo se recusou a usar o BitKeeper, então ele enviou correções por e-mail e elas foram atribuídas aos ChangeLogs gerados automaticamente ao committer, porque o BitKeeper não possui uma noção separada de autoria. Esse é o meu palpite de qualquer maneira.
Jörg W Mittag
@ JörgWMittag possível. Agora, estou pensando em interpretar mal o changelog e essa parte pode ser sobre um patch diferente.
muru
3
A citação próxima ao final desta resposta indica que o motivo para não escolher um valor arbitrariamente grande são as restrições de memória. Com 128 KB de RAM por 1M de PIDs, usar até 63 bits (deixando o bit de sinal) exigiria, se eu não falhasse a matemática, um milhão de TB de RAM apenas para a tabela PID. Um pouco alto para os sistemas atuais.
um CVn