Threadstapelgröße

Jeder neue Thread oder jede neue Faser erhält einen eigenen Stapelspeicher, der sowohl aus reserviertem als auch aus anfänglich zugesagtem Arbeitsspeicher besteht. Die größe des reservierten Arbeitsspeichers stellt die gesamtstapelbelegung im virtuellen Arbeitsspeicher dar. Daher ist die reservierte Größe auf den virtuellen Adressbereich beschränkt. Die anfänglich zugesagten Seiten nutzen erst dann den physischen Arbeitsspeicher, wenn auf sie verwiesen wird. Sie entfernen jedoch Seiten aus dem Gesamten Commitlimit des Systems, d. h. die Größe der Auslagerungsdatei und die Größe des physischen Arbeitsspeichers. Das System committet nach Bedarf zusätzliche Seiten aus dem reservierten Stapelspeicher, bis entweder der Stapel die reservierte Größe abzüglich einer Seite erreicht (die als Schutzseite verwendet wird, um Stapelüberlauf zu verhindern) oder das System so wenig Arbeitsspeicher hat, dass der Vorgang fehlschlägt.

Es ist am besten, eine möglichst kleine Stapelgröße zu wählen und den Stapel zu committen, der benötigt wird, damit der Thread oder die Faser zuverlässig ausgeführt werden kann. Jede Seite, die für den Stapel reserviert ist, kann nicht für andere Zwecke verwendet werden.

Ein Stapel wird freigegeben, wenn sein Thread beendet wird. Es wird nicht freigegeben, wenn der Thread von einem anderen Thread beendet wird.

Die Standardgröße für den reservierten und anfänglich zugesicherten Stapelspeicher wird im Header der ausführbaren Datei angegeben. Die Thread- oder Fibererstellung schlägt fehl, wenn nicht genügend Arbeitsspeicher vorhanden ist, um die Anzahl der angeforderten Bytes zu reservieren oder zu commiten. Die vom Linker verwendete Standardgröße der Stapelreservierung beträgt 1 MB. Um eine andere Standardstapelreservierungsgröße für alle Threads und Fasern anzugeben, verwenden Sie die STACKSIZE-Anweisung in der Moduldefinitionsdatei (DEF). Das Betriebssystem rundet die angegebene Größe auf das nächste Vielfache der Zuordnungsgranularität des Systems (in der Regel 64 KB) auf. Um die Zuordnungsgranularität des aktuellen Systems abzurufen, verwenden Sie die GetSystemInfo-Funktion .

Verwenden Sie den dwStackSize-Parameter der Funktion CreateThread, CreateRemoteThread oder CreateFiber , um den anfänglich zugesicherten Stapelbereich zu ändern. Dieser Wert wird auf die nächste Seite aufgerundet. Im Allgemeinen ist die Reservegröße die Standardreservegröße, die im ausführbaren Header angegeben ist. Wenn die anfänglich von dwStackSize angegebene Größe jedoch größer oder gleich der Standardreservegröße ist, ist die Reservegröße diese neue Commitgröße, die auf das nächste Vielfache von 1 MB aufgerundet wird.

Um die reservierte Stapelgröße zu ändern, legen Sie den dwCreationFlags-Parameter von CreateThread oder CreateRemoteThread auf STACK_SIZE_PARAM_IS_A_RESERVATION fest, und verwenden Sie den dwStackSize-Parameter . In diesem Fall ist die anfänglich zugesagte Größe die Standardgröße, die im ausführbaren Header angegeben ist. Verwenden Sie für Fasern den dwStackReserveSize-Parameter von CreateFiberEx. Die Commitgröße wird im dwStackCommitSize-Parameter angegeben.

Die SetThreadStackGuarantee-Funktion legt die Mindestgröße des Stapels fest, der dem aufrufenden Thread oder der aufrufenden Faser zugeordnet ist, die während aller Stapelüberlaufausnahmen verfügbar ist.