Condividi tramite


Dimensioni dello stack di thread

Ogni nuovo thread o fibra riceve il proprio spazio stack costituito sia dalla memoria riservata che inizialmente sottoposta a 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 di cui è stato eseguito il commit inizialmente non utilizzano memoria fisica fino a quando non viene fatto riferimento; Tuttavia, rimuove le pagine dal limite totale di commit del sistema, ovvero le dimensioni del file di pagina più le dimensioni della memoria fisica. Il sistema esegue il commit di pagine aggiuntive dalla memoria dello stack riservato in base alle esigenze, fino a quando lo stack non raggiunge le dimensioni riservate meno una pagina (che viene usata come pagina di protezione per impedire l'overflow dello stack) o il sistema è così basso in memoria che l'operazione ha esito negativo.

È consigliabile scegliere il minor numero possibile di dimensioni dello stack ed eseguire il commit dello stack necessario per l'esecuzione affidabile del thread o della fibra. Ogni pagina riservata allo stack non può essere usata per altri scopi.

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 riservata e inizialmente di cui è stato eseguito il commit sono specificate nell'intestazione del file eseguibile. La creazione di thread o fibre non riesce 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 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à di allocazione del sistema (in genere 64 KB). Per recuperare la granularità di allocazione del sistema corrente, usare la funzioneGetSystemInfo.

Per modificare lo spazio dello stack di cui è stato eseguito il commit iniziale, usare il parametro dwStackSize del CreateThread, CreateRemoteThreado funzione 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 la dimensione di cui è stato eseguito il commit iniziale specificato da dwStackSize è maggiore o uguale alla dimensione di riserva predefinita, la dimensione della riserva è questa nuova dimensione del commit arrotondata per evitare il multiplo 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 cui è stato eseguito il commit sono le dimensioni predefinite specificate nell'intestazione eseguibile. Per le fibre, usare il parametro dwStackReserveSize di CreateFiberEx. Le dimensioni di cui è stato eseguito il commit sono specificate nel parametro dwStackCommitSize.

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