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 :
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.
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.
Respostas:
Parece ser uma escolha puramente arbitrária. Poderia ser qualquer coisa, mas alguém 1 sentiu 4 milhões é suficiente. Use a fonte :
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_max
foi adicionada em 2.5.34 e, olhando para o changelog , parece que alguém foi Ingo Molnár :No entanto, o Ingo foi adicionado apenasDEFAULT_PID_MAX
.PID_MAX_LIMIT
foi adicionado por Linus Torvalds em 2.5.37 :Acontece que eu li mal o changelog.
As alterações estão no patchset 2.5.37 :
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:
Houve uma discussão acalorada sobre ter limites mais altos, mas parece que nada saiu disso no final.
fonte