Partilhar via


Tamanho da pilha de threads

Cada nova rosca ou fibra recebe seu próprio espaço de pilha que consiste em memória reservada e inicialmente comprometida. O tamanho da memória reservada representa a alocação total da pilha na memória virtual. Como tal, o tamanho reservado é limitado ao intervalo de endereços virtuais. As páginas inicialmente confirmadas não utilizam memória física até que sejam referenciadas; no entanto, eles removem páginas do limite de confirmação total do sistema, que é o tamanho do arquivo de paginação 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 estouro de pilha) ou o sistema esteja tão pobre em memória que a operação falha.

É melhor escolher um tamanho de pilha tão pequeno quanto possível e comprometer a pilha que é necessária para que a rosca ou fibra funcione de forma confiável. Cada página reservada para a pilha não pode ser usada para qualquer outra finalidade.

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

O tamanho padrão para a 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 é 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 de 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çãoGetSystemInfo.

Para alterar o espaço de pilha inicialmente comprometido, use o parâmetro dwStackSize doCreateThread, CreateRemoteThread ou função CreateFiber. Este 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 comprometido 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 dwStackReserveSize parâmetro de CreateFiberEx. O tamanho confirmado é especificado no parâmetro dwStackCommitSize.

A funçãoSetThreadStackGuarantee 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.