Condividi tramite


Dimensioni dello stack di thread

Ogni nuovo thread o fibra riceve il proprio spazio stack costituito sia da memoria riservata che inizialmente con commit. Le dimensioni della memoria riservata rappresentano l'allocazione totale dello stack nella memoria virtuale. Di conseguenza, le dimensioni riservate sono limitate all'intervallo di indirizzi virtuali. Le pagine inizialmente sottoposte a commit non usano la memoria fisica fino a quando non vengono riferimenti; tuttavia, rimuove le pagine dal limite totale di commit del sistema, ovvero le dimensioni del file di pagina e le dimensioni della memoria fisica. Il sistema esegue il commit di pagine aggiuntive dalla memoria dello stack riservato quando sono necessarie, fino a quando lo stack raggiunge le dimensioni riservate meno una pagina (che viene utilizzata come pagina di protezione per impedire il overflow dello stack) o il sistema non è così basso sulla memoria che l'operazione ha esito negativo.

È consigliabile scegliere le dimensioni dello stack più piccole possibile e eseguire il commit dello stack necessario per il thread o la fibra in modo affidabile. Ogni pagina riservata per lo stack non può essere usata per qualsiasi altro scopo.

Uno stack viene liberato quando il thread viene chiuso. Non viene liberato se il thread viene terminato da un altro thread.

Le dimensioni predefinite per la memoria dello stack riservato e inizialmente eseguito il commit sono specificate nell'intestazione del file eseguibile. La creazione di thread o fibre ha esito negativo se non è disponibile memoria sufficiente per riservare o eseguire il commit del numero di byte richiesti. Le dimensioni predefinite della prenotazione dello stack usate dal linker sono 1 MB. Per specificare una dimensione di prenotazione dello stack predefinita diversa per tutti i thread e le fibre, usare l'istruzione STACKSIZE nel file di definizione del modulo (con estensione def). Il sistema operativo arrotonda le dimensioni specificate al multiplo più vicino della granularità dell'allocazione del sistema (in genere 64 KB). Per recuperare la granularità di allocazione del sistema corrente, usare la funzione GetSystemInfo .

Per modificare lo spazio dello stack di commit iniziale, usare il parametro dwStackSize della funzione CreateThread, CreateRemoteThread o CreateFiber . Questo valore viene arrotondato fino alla pagina più vicina. In genere, le dimensioni della riserva sono le dimensioni di riserva predefinite specificate nell'intestazione eseguibile. Tuttavia, se le dimensioni inizialmente di commit specificate da dwStackSize sono superiori o uguali alle dimensioni predefinite della riserva, le dimensioni della riserva sono queste nuove dimensioni di commit arrotondate fino al più vicino più vicino di 1 MB.

Per modificare le dimensioni dello stack riservato, impostare il parametro dwCreationFlags di CreateThread o CreateRemoteThread su STACK_SIZE_PARAM_IS_A_RESERVATION e usare il parametro dwStackSize . In questo caso, le dimensioni inizialmente di commit sono le dimensioni predefinite specificate nell'intestazione eseguibile. Per le fibre, usare il parametro dwStackReserveSize di CreateFiberEx. Le dimensioni del commit sono specificate nel parametro dwStackCommitSize .

La funzione SetThreadStackGuarantee imposta le dimensioni minime dello stack associato al thread chiamante o alla fibra che sarà disponibile durante qualsiasi eccezione di overflow dello stack.