Поделиться через


Размер стека потока

Каждый новый поток или волокно получает собственное пространство стека, состоящее как из зарезервированной, так и первоначально зафиксированной памяти. Зарезервированный размер памяти представляет общее выделение стека в виртуальной памяти. Таким образом, зарезервированный размер ограничен диапазоном виртуальных адресов. Изначально зафиксированные страницы не используют физическую память до тех пор, пока на них не будет указана ссылка; однако они удаляют страницы из системного ограничения общей фиксации, который представляет собой размер файла подкачки плюс размер физической памяти. Система фиксирует дополнительные страницы из зарезервированной памяти стека по мере необходимости, пока стек не достигнет зарезервированного размера минус одна страница (которая используется в качестве страницы защиты для предотвращения переполнения стека) или система не будет настолько мало памяти, что операция завершается сбоем.

Лучше выбрать как можно меньший размер стека и зафиксировать стек, необходимый для надежной работы потока или волокна. Каждая страница, зарезервированная для стека, не может использоваться для каких-либо других целей.

Стек освобождается при выходе из потока. Он не освобождается, если поток завершается другим потоком.

Размер зарезервированной и первоначально зафиксированной памяти стека по умолчанию указывается в заголовке исполняемого файла. Создание потока или волокна завершается сбоем, если недостаточно памяти для резервирования или фиксации запрошенного количества байтов. Размер резервирования стека по умолчанию, используемый компоновщиком, составляет 1 МБ. Чтобы указать другой размер резервирования стека по умолчанию для всех потоков и волокон, используйте инструкцию STACKSIZE в файле определения модуля (DEF). Операционная система округляет указанный размер до ближайшего значения, кратного степени детализации распределения в системе (обычно 64 КБ). Чтобы получить степень детализации выделения текущей системы, используйте функцию GetSystemInfo .

Чтобы изменить изначально зафиксированное пространство стека, используйте параметр dwStackSize функции CreateThread, CreateRemoteThread или CreateFiber . Это значение округляется до ближайшей страницы. Как правило, резервный размер — это размер резерва по умолчанию, указанный в заголовке исполняемого файла. Однако если изначально зафиксированный размер, заданный dwStackSize , больше или равен размеру резерва по умолчанию, размер резерва — это новый размер фиксации, округленный до ближайшего, кратного 1 МБ.

Чтобы изменить размер зарезервированного стека, задайте параметру dwCreationFlagscreateThread или CreateRemoteThread значение STACK_SIZE_PARAM_IS_A_RESERVATION и используйте параметр dwStackSize . В этом случае изначально зафиксированный размер является размером по умолчанию, указанным в заголовке исполняемого файла. Для волокон используйте параметр dwStackReserveSizeэлемента CreateFiberEx. Зафиксированный размер указывается в параметре dwStackCommitSize .

Функция SetThreadStackGuarantee задает минимальный размер стека, связанного с вызывающим потоком или волокном, который будет доступен во время любых исключений переполнения стека.