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

8

Por exemplo, no OSX, é 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 questão é muito ampla e depende muito do uso, mas ainda queria perguntar, como eu estava me perguntando se há algum escondido / interno / razão do sistema por trás deste grande número.

Eu estava 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 do que 8MiB - e levará a uma diminuição significativa da memória virtual do processo , como eu tenho um monte de threads (I / O).

Eu também sei que isso não faz mal, bem explicado aqui : Tamanho de pilha padrão para pthreads

    
por Kiril Kirov 05.10.2018 / 12:12

2 respostas

14

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

O Linux usou pilhas de 8 MiB por um longo tempo; a alteração foi introduzida em versão 1.3.7 do kernel, em julho de 1995. Naquela época, foi apresentado como introduzindo um limite, anteriormente não havia um:

Limit the stack by to some sane default: root can always increase this limit if needed.. 8MB seems reasonable.

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

Para encadeamentos, se o limite de pilha ( RLIMIT_STACK ) for ilimitado, pthread_create aplica seus próprios limites às pilhas de novos threads - e na maioria das arquiteturas, isso é menos que 8MiB.

    
por 05.10.2018 / 14:25
1

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

Veja link 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 aplicativo.

    
por 05.10.2018 / 14:00