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 mémoire réservée représente l’allocation totale de pile en 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 la mémoire physique tant qu’elles ne sont pas référencées ; Toutefois, ils suppriment des pages de la limite de validation totale du système, qui est la taille du fichier de page ainsi que la taille de la mémoire physique. Le système valide les pages supplémentaires de la mémoire de la pile réservée, car elles sont nécessaires, jusqu’à ce que la pile atteigne la taille réservée moins une page (qui est utilisée comme page de garde 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 quitte. Elle n’est pas libérée si le thread est arrêté 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 s’il n’y a pas suffisamment de mémoire 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 autre taille de réservation de pile par défaut 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é, utilisez le paramètre dwStackSize de l'CreateThread, CreateRemoteThreadou fonction 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 appelant ou à la fibre qui sera disponible pendant les exceptions de dépassement de capacité de pile.