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
linux
osx
virtual-memory
multithreading
stack
Kiril Kirov
fonte
fonte
Respostas:
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:
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_create
aplica seus próprios limites às pilhas de novas threads - e na maioria das arquiteturas, isso é inferior a 8MiB.fonte
top
mostra 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.top
fornece uma resposta muito melhor para "que memória esse processo está realmente usando" do que o VIRT.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.
fonte