Taille de la pile de threads

Chaque nouveau thread ou fibre reçoit son propre espace de pile composé de mémoire réservée et initialement validée. La taille de la mémoire réservée représente l’allocation totale de pile dans la mémoire virtuelle. Par conséquent, la taille réservée est limitée à la plage d’adresses virtuelles. Les pages initialement validées n’utilisent pas de mémoire physique tant qu’elles ne sont pas référencées ; toutefois, ils suppriment des pages de la limite de validation totale système, qui correspond à la taille du fichier de page plus la taille de la mémoire physique. Le système valide des pages supplémentaires à partir de la mémoire de la pile réservée en fonction des besoins, jusqu’à ce que la pile atteigne la taille réservée moins une page (qui est utilisée comme page de protection pour empêcher le dépassement de pile) ou que le système soit si faible en mémoire que l’opération échoue.

Il est préférable de choisir une taille de pile aussi petite que possible et de valider la pile nécessaire pour que le thread ou la fibre s’exécute de manière fiable. Chaque page réservée à la pile ne peut pas être utilisée à d’autres fins.

Une pile est libérée lorsque son thread se ferme. Il n’est pas libéré si le thread est terminé par un autre thread.

La taille par défaut de la mémoire de pile réservée et initialement validée est spécifiée dans l’en-tête du fichier exécutable. La création de threads ou de fibres échoue si la mémoire est insuffisante pour réserver ou valider le nombre d’octets demandés. La taille de réservation de pile par défaut utilisée par l’éditeur de liens est de 1 Mo. Pour spécifier une taille de réservation de pile par défaut différente pour tous les threads et fibres, utilisez l’instruction STACKSIZE dans le fichier de définition de module (.def). Le système d’exploitation arrondit la taille spécifiée au multiple le plus proche de la granularité d’allocation du système (généralement 64 Ko). Pour récupérer la granularité d’allocation du système actuel, utilisez la fonction GetSystemInfo .

Pour modifier l’espace de pile initialement validée, utilisez le paramètre dwStackSize de la fonction CreateThread, CreateRemoteThread ou CreateFiber . Cette valeur est arrondie à la page la plus proche. En règle générale, la taille de réserve est la taille de réserve par défaut spécifiée dans l’en-tête exécutable. Toutefois, si la taille initialement validée spécifiée par dwStackSize est supérieure ou égale à la taille de réserve par défaut, la taille de réserve est cette nouvelle taille de validation arrondie au multiple le plus proche de 1 Mo.

Pour modifier la taille de la pile réservée, définissez le paramètre dwCreationFlags de CreateThread ou CreateRemoteThread sur STACK_SIZE_PARAM_IS_A_RESERVATION et utilisez le paramètre dwStackSize . Dans ce cas, la taille initialement validée est la taille par défaut spécifiée dans l’en-tête exécutable. Pour les fibres, utilisez le paramètre dwStackReserveSize de CreateFiberEx. La taille validée est spécifiée dans le paramètre dwStackCommitSize .

La fonction SetThreadStackGuarantee définit la taille minimale de la pile associée au thread ou à la fibre appelante qui sera disponible pendant toutes les exceptions de dépassement de pile.