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


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.


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.


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 #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.