Compartilhar via


Tamanho da pilha de threads

Cada novo thread ou fibra recebe seu próprio espaço de pilha que consiste em memória reservada e inicialmente confirmada. O tamanho da memória reservada representa a alocação total da pilha na memória virtual. Dessa forma, o tamanho reservado é limitado ao intervalo de endereços virtuais. As páginas inicialmente confirmadas não utilizam memória física até serem referenciadas; no entanto, eles removem páginas do limite de confirmação total do sistema, que é o tamanho do arquivo de página mais o tamanho da memória física. O sistema confirma páginas adicionais da memória de pilha reservada conforme necessário, até que a pilha atinja o tamanho reservado menos uma página (que é usada como uma página de proteção para evitar o estouro da pilha) ou o sistema fique tão baixo na memória que a operação falha.

É melhor escolher o tamanho da pilha o menor possível e confirmar a pilha necessária para que o thread ou fibra seja executado de forma confiável. Todas as páginas reservadas para a pilha não podem ser usadas para qualquer outra finalidade.

Uma pilha é liberada quando seu thread é encerrado. Ele não será liberado se o thread for encerrado por outro thread.

O tamanho padrão da memória de pilha reservada e inicialmente confirmada é especificado no cabeçalho do arquivo executável. A criação de threads ou fibras falhará se não houver memória suficiente para reservar ou confirmar o número de bytes solicitados. O tamanho de reserva de pilha padrão usado pelo vinculador é de 1 MB. Para especificar um tamanho de reserva de pilha padrão diferente para todos os threads e fibras, use a instrução STACKSIZE no arquivo de definição do módulo (.def). O sistema operacional arredonda o tamanho especificado para o múltiplo mais próximo da granularidade de alocação do sistema (normalmente 64 KB). Para recuperar a granularidade de alocação do sistema atual, use a função GetSystemInfo.

Para alterar o espaço de pilha inicialmente confirmado, use o parâmetro dwStackSize da função CreateThread, CreateRemoteThreadou CreateFiber. Esse valor é arredondado para a página mais próxima. Geralmente, o tamanho da reserva é o tamanho de reserva padrão especificado no cabeçalho executável. No entanto, se o tamanho inicialmente confirmado especificado por dwStackSize for maior ou igual ao tamanho de reserva padrão, o tamanho da reserva será esse novo tamanho de confirmação arredondado para o múltiplo mais próximo de 1 MB.

Para alterar o tamanho da pilha reservada, defina o parâmetro dwCreationFlags de CreateThread ou CreateRemoteThread para STACK_SIZE_PARAM_IS_A_RESERVATION e use o parâmetro dwStackSize. Nesse caso, o tamanho inicialmente confirmado é o tamanho padrão especificado no cabeçalho executável. Para fibras, use o parâmetro dwStackReserveSize de CreateFiberEx. O tamanho confirmado é especificado no parâmetro dwStackCommitSize.

A função SetThreadStackGuarantee define o tamanho mínimo da pilha associada ao thread de chamada ou à fibra que estará disponível durante quaisquer exceções de estouro de pilha.