Freigeben über


Threadstapelgröße

Jeder neue Thread oder jede Faser erhält einen eigenen Stapelspeicher, der aus reservierten und anfänglich zugesicherten Speicher besteht. Die reservierte Speichergröße stellt die Gesamtstapelzuweisung im virtuellen Speicher dar. Daher ist die reservierte Größe auf den virtuellen Adressbereich beschränkt. Die anfänglich zugesicherten Seiten verwenden erst dann physischen Arbeitsspeicher, wenn auf sie verwiesen wird. Sie entfernen jedoch Seiten aus dem Gesamt-Commit-Limit des Systems, was die Größe der Seitendatei plus die Größe des physischen Speichers ist. Das System übernimmt zusätzliche Seiten aus dem reservierten Stapelspeicher bei Bedarf, bis entweder der Stapel die reservierte Größe minus eine Seite erreicht (die als Schutzseite verwendet wird, um Stapelüberlauf zu verhindern) oder das System ist so niedrig beim Speicher, dass der Vorgang fehlschlägt.

Es empfiehlt sich, so klein wie möglich eine Stapelgröße auszuwählen und den Stapel zu übernehmen, der für die zuverlässige Ausführung des Threads oder der Faser benötigt wird. Jede Seite, die für den Stapel reserviert ist, kann nicht für andere Zwecke verwendet werden.

Ein Stapel wird beim Beenden des Threads freigegeben. Er 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. Thread- oder Fasererstellung schlägt fehl, wenn nicht genügend Arbeitsspeicher vorhanden ist, um die Anzahl der angeforderten Bytes zu reservieren oder zu übernehmen. Die standardmäßige Stapelreservierungsgröße, die vom Linker verwendet wird, 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 Zuordnungs granularität des Systems auf (in der Regel 64 KB). Um die Zuordnungs granularität des aktuellen Systems abzurufen, verwenden Sie die GetSystemInfo-Funktion.

Verwenden Sie zum Ändern des anfangs zugesicherten Stapelbereichs den dwStackSize-Parameter des CreateThread-, CreateRemoteThread-oder CreateFiber--Funktion. 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 jedoch die anfänglich zugesicherte Größe, die durch dwStackSize angegeben wird, größer oder gleich der Standardreservegröße ist, ist die Reservegröße diese neue Commit-Größe auf das nächste Vielfache von 1 MB aufgerundet.

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 zugesicherte Größe die Standardgröße, die im ausführbaren Header angegeben ist. Verwenden Sie für Fasern den dwStackReserveSize Parameter von CreateFiberEx. Die zugesicherte Größe wird im dwStackCommitSize Parameter angegeben.

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