Sdílet prostřednictvím


Velikost zásobníku vláken

Každé nové vlákno nebo vlákno obdrží svůj vlastní prostor zásobníku skládající se z rezervované i původně potvrzené paměti. Velikost rezervované paměti představuje celkové přidělení zásobníku ve virtuální paměti. Proto je rezervovaná velikost omezená na rozsah virtuálních adres. Zpočátku potvrzené stránky nevyužívají fyzickou paměť, dokud na tyto stránky neodkazují; Odeberou ale stránky z celkového limitu potvrzení systému, což je velikost stránkového souboru plus velikost fyzické paměti. Systém podle potřeby potvrdí další stránky z rezervované paměti zásobníku, dokud zásobník nedosáhne rezervované velikosti minus jednu stránku (která se používá jako strážná stránka, aby se zabránilo přetečení zásobníku), nebo je systém tak málo paměti, že operace selže.

Nejlepší je zvolit co nejmenší velikost zásobníku a potvrdit zásobník, který je potřebný pro spolehlivé spuštění vlákna nebo vlákna. Každou stránku vyhrazenou pro zásobník nelze použít k žádnému jinému účelu.

Zásobník se uvolní, když se jeho vlákno ukončí. Pokud je vlákno ukončeno jiným vláknem, není uvolněno.

Výchozí velikost rezervované a původně potvrzené paměti zásobníku je určena v hlavičce spustitelného souboru. Vytvoření vlákna nebo vlákna selže, pokud není dostatek paměti k rezervaci nebo potvrzení počtu požadovaných bajtů. Výchozí velikost rezervace zásobníku používaná linkerem je 1 MB. Pokud chcete zadat jinou výchozí velikost rezervace zásobníku pro všechna vlákna a vlákna, použijte příkaz STACKSIZE v souboru definice modulu (.def). Operační systém zaokrouhlí zadanou velikost na nejbližší násobek členitosti přidělení systému (obvykle 64 kB). Pokud chcete načíst členitost přidělení aktuálního systému, použijte funkci GetSystemInfo.

Pokud chcete změnit počáteční potvrzený prostor zásobníku, použijte parametr dwStackSize funkce CreateThread, CreateRemoteThreadnebo CreateFiber. Tato hodnota se zaokrouhlí nahoru na nejbližší stránku. Obecně platí, že velikost rezervy je výchozí velikost rezervy zadaná v hlavičce spustitelného souboru. Pokud je však počáteční potvrzená velikost určená dwStackSize větší než nebo rovna výchozí velikosti rezervy, velikost rezervy je tato nová velikost potvrzení zaokrouhlená nahoru na nejbližší násobek 1 MB.

Pokud chcete změnit velikost rezervovaného zásobníku, nastavte parametr dwCreationFlagsCreateThread nebo CreateRemoteThread na STACK_SIZE_PARAM_IS_A_RESERVATION a použijte parametr dwStackSize. V tomto případě je počáteční potvrzená velikost výchozí velikost určená v hlavičce spustitelného souboru. Pro vlákna použijte dwStackReserveSize parametr CreateFiberEx. Potvrzená velikost je zadána v parametru dwStackCommitSize.

Funkce SetThreadStackGuarantee nastaví minimální velikost zásobníku přidruženého k volajícímu vláknu nebo vláknu, které budou k dispozici při jakýchkoli výjimkách přetečení zásobníku.