Share via


Tamaño de pila de subprocesos

Cada nuevo subproceso o fibra recibe su propio espacio de pila que consta de memoria reservada e inicialmente confirmada. El tamaño de memoria reservada representa la asignación total de la pila en memoria virtual. Por lo tanto, el tamaño reservado se limita al intervalo de direcciones virtuales. Las páginas confirmadas inicialmente no utilizan memoria física hasta que se hace referencia a ellas; sin embargo, quitan páginas del límite de confirmación total del sistema, que es el tamaño del archivo de página más el tamaño de la memoria física. El sistema confirma páginas adicionales de la memoria de pila reservada según sea necesario, hasta que la pila alcanza el tamaño reservado menos una página (que se usa como página de protección para evitar el desbordamiento de la pila) o el sistema es tan bajo en la memoria en la que se produce un error en la operación.

Es mejor elegir lo más pequeño posible un tamaño de pila y confirmar la pila necesaria para que el subproceso o la fibra se ejecuten de forma confiable. Todas las páginas reservadas para la pila no se pueden usar para ningún otro propósito.

Se libera una pila cuando se cierra su subproceso. No se libera si otro subproceso finaliza el subproceso.

El tamaño predeterminado de la memoria reservada e inicialmente confirmada de la pila se especifica en el encabezado del archivo ejecutable. Se produce un error en la creación de subprocesos o fibra si no hay suficiente memoria para reservar o confirmar el número de bytes solicitados. El tamaño de reserva de pila predeterminado usado por el enlazador es de 1 MB. Para especificar un tamaño de reserva de pila predeterminado diferente para todos los subprocesos y fibras, use la instrucción STACKSIZE en el archivo de definición de módulo (.def). El sistema operativo redondea el tamaño especificado al múltiplo más cercano de la granularidad de asignación del sistema (normalmente 64 KB). Para recuperar la granularidad de asignación del sistema actual, use la función GetSystemInfo .

Para cambiar el espacio de pila confirmado inicialmente, use el parámetro dwStackSize de la función CreateThread, CreateRemoteThread o CreateFiber . Este valor se redondea hacia arriba a la página más cercana. Por lo general, el tamaño de reserva es el tamaño de reserva predeterminado especificado en el encabezado ejecutable. Sin embargo, si el tamaño confirmado inicialmente especificado por dwStackSize es mayor o igual que el tamaño de reserva predeterminado, el tamaño de la reserva es este nuevo tamaño de confirmación redondeado al múltiplo más cercano de 1 MB.

Para cambiar el tamaño de la pila reservada, establezca el parámetro dwCreationFlags de CreateThread o CreateRemoteThread en STACK_SIZE_PARAM_IS_A_RESERVATION y use el parámetro dwStackSize . En este caso, el tamaño confirmado inicialmente es el tamaño predeterminado especificado en el encabezado ejecutable. Para las fibras, use el parámetro dwStackReserveSize de CreateFiberEx. El tamaño confirmado se especifica en el parámetro dwStackCommitSize .

La función SetThreadStackGuarantee establece el tamaño mínimo de la pila asociada al subproceso de llamada o fibra que estará disponible durante las excepciones de desbordamiento de pila.