Por que no Linux moderno, o tamanho padrão da pilha é tão grande - 8 MB (até 10 em algumas distribuições)

10

Por exemplo, no OSX, é ainda menor que 512k.

Existe algum tamanho recomendado, tendo em mente que o aplicativo não usa recursão e não aloca muitas variáveis ​​de pilha ?
Eu sei que a pergunta é muito ampla e depende muito do uso, mas ainda queria perguntar, pois eu queria saber se há alguma razão oculta / interna / do sistema por trás desse grande número.


Fiquei pensando, como pretendo alterar o tamanho da pilha para 512 KiB no meu aplicativo - isso ainda soa como um grande número para isso, mas é muito menor que 8MiB - e levará a uma memória virtual do processo significativamente reduzida, como eu tem muitos encadeamentos (E / S).

Também sei que isso não dói, bem explicado aqui : Tamanho da pilha padrão para pthreads

Kiril Kirov
fonte
Você está usando uma CPU de 32 bits? As CPUs X86_64 oferecem um espaço de endereço virtual de até 128 terabytes (no espaço do usuário), o que deve ser suficiente para muitas pilhas de 8 MB.
Johan Myréen 05/10
@ JohanMyréen - não, é x64. Não é grande coisa, eu só estava pensando, não há razão real para fazer isso (no momento).
22418 Kiril Kirov
Em 2019 e 8 MiB há muita memória? Acho que não. Ter um tamanho de pilha padrão grande facilita a gravação de programas com recursão. Fiquei muito surpreso ao saber que o tamanho padrão da pilha no Windows é de apenas 1MiB!
oldherl

Respostas:

15

Como já foi dito, e como é mencionado no link que você fornece na sua pergunta, ter uma pilha de 8MiB não prejudica nada (além de consumir espaço de endereço - em um sistema de 64 bits que não importa).

O Linux usa pilhas de 8MiB há muito tempo; a mudança foi introduzida na versão 1.3.7 do kernel, em julho de 1995. Naquela época, era apresentada como a introdução de um limite, anteriormente não havia um:

Limite a pilha de acordo com algum padrão sadio: o root sempre pode aumentar esse limite, se necessário. 8MB parece razoável.

No Linux, o limite da pilha também afeta o tamanho dos argumentos do programa e o ambiente, que são limitados a um quarto do limite da pilha ; o kernel aplica um mínimo de 32 páginas para os argumentos e o ambiente.

Para threads, se o limite da pilha ( RLIMIT_STACK) é ilimitado, pthread_createaplica seus próprios limites às pilhas de novas threads - e na maioria das arquiteturas, isso é inferior a 8MiB.

Stephen Kitt
fonte
1
Nossa interessante. Eu pensei que foi introduzido recentemente. Eu tenho cerca de 200 threads (esse é outro tópico longo, então vamos ignorá-lo por enquanto) e topmostra resultados assustadores do VIRT. Embora, aprofundando um pouco mais, a maior parte desse espaço de endereço virtual seja obtida nas arenas por thread (memória), não no tamanho da pilha, portanto, diminuir o tamanho da pilha não reduzirá drasticamente a memória virtual. Eu só estava curioso por que 8MiB e por que tanto.
22618 Kiril Kirov
O "8 MB" significa apenas que a pilha de cada thread pode aumentar para 8 MB se o thread decidir usá-lo. Mas a memória física não será alocada até que a memória seja realmente usada. Se seus 200 threads usarem 512 KB cada, você usará 100 MB de RAM física, não 1,6 GB.
Guntram Blohm apoia Monica
Se você não está trocando, a coluna RES topfornece uma resposta muito melhor para "que memória esse processo está realmente usando" do que o VIRT.
Kbolino #
1
@ Guntram, o OP está ciente disso, veja o link na pergunta.
Stephen Kitt
1

8 MB é o tamanho virtual da pilha. Uma falha de página ocorrerá quando seu aplicativo tentar usar mais pilha do que o atualmente alocado fisicamente. O manipulador de falhas de página do kernel alocará uma página física e seu aplicativo continuará.

Consulte /unix//a/280865/21212 para obter uma explicação completa.

Portanto, reduzir o tamanho da pilha não deve ter efeito na redução do uso de memória física do seu aplicativo.

Colin 't Hart
fonte
1
Eu já vinculei esta resposta na minha pergunta. Também escrevi que estou ciente disso, mas isso não responde à pergunta. De qualquer maneira, obrigado #
187 Kiril Kirov
Eu acho que você precisa revisitar as premissas da pergunta, e essa (não) resposta aponta para o porquê. Memória virtual não é memória real. O tamanho da pilha pode ser de 800 MB e não afeta o uso real da memória, a menos que seu aplicativo tenha criado mais de 8 MB de quadros de pilha.
Kbolino #