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

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

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

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

Заданный по умолчанию размер для переданной и зарезервированной памяти устанавливается в заголовке исполняемого файла. Заданная по умолчанию зарезервированная память равна одному мегабайту. Чтобы установить другой заданный по умолчанию размер стека, используйте инструкцию STACKSIZE в файле определения модуля (.DEF). Ваш компоновщик может также поддерживать параметр командной строки для установки размера стека. Для получения дополнительной информации, см. документацию, включенную в ваш компоновщик.

Потоки, которые вызывают библиотеки языка C периода исполнения или Windows API, должны обеспечит достаточное место в стеке для использования этих функций. Не уменьшайте зарезервированный размер стека ниже 64 килобайт.

Чтобы увеличить объем свободного пространства стека, которое должно передаваться вначале для потока, установите значение в параметре dwStackSize функции CreateThread или CreateRemoteThread . Это значение округляется до ближайшей страницы. Вызов, который создает поток, завершается ошибкой, если нет достаточно памяти, чтобы передать на хранение или зарезервировать количество требуемых байтов. Если параметр dwStackSize меньше чем заданный по умолчанию резервный размер, новый поток использует заданный по умолчанию резервный размер. Если параметр dwStackSize больше чем заданный по умолчанию резервный размер, резервный размер округляется до ближайшего числа кратного 1 Мбайту.

Windows XP: Если параметр dwCreationFlags функции CreateThread или CreateRemoteThreadSTACK_SIZE_PARAM_IS_A_RESERVATION , параметр dwStackSize устанавливает объем свободного пространства стека, которое должно быть вначале зарезервировано для потока.

Стек освобождается, когда завершается работа потока.

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

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

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

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

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

Читайте также:  Как настроить виртуал бокс для линукс

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

Чтобы изменить зарезервированный размер стека, установите параметр двкреатионфлагс для CreateThread или креатеремотесреад в качестве значения параметра размера стека _ _ _ — _ _ резервирование и используйте параметр двстакксизе . В этом случае исходный зафиксированный размер является размером по умолчанию, указанным в заголовке исполняемого файла. Для волокон используйте параметр двстаккресервесизе объекта креатефиберекс. Зафиксированный размер указывается в параметре двстакккоммитсизе .

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

Максимальный размер стека по умолчанию для потоков, созданных в процессе IIS, составляет 256 КБ

В этой статье вводится максимальный размер стека по умолчанию для потока, созданного в процессе Microsoft IIS IIS.

Исходная версия продукта: Службы Internet Information Services 8.0
Исходный номер КБ: 932909

Аннотация

По умолчанию максимальный размер стека потока, созданного процессом IIS, составляет 256 КБ до Windows Server 2008. Например, когда Inetinfo.exe, DLLHost.exe или W3wp.exe создает поток в IIS 5.0 или IIS 6.0, максимальный размер стека по умолчанию составляет 256 КБ. Вы также можете явным образом вызвать функцию CreateThread, чтобы указать размер стека потока. В Microsoft Windows 2000, если рабочий процесс Microsoft ASP.NET (ASPNet_wp.exe) создает поток, максимальный размер стека потока составляет 1 МБ. В Windows Server 2008 и более высоких версиях максимальный размер стека потока, запущенного в 32-битной версии IIS, составляет 256 КБ, а на сервере x64 — 512 КБ.

Службы Internet Information Services — это многопотоданная платформа веб-приложений, которая позволяет коду приложения, запущенным внутри каждого рабочего процесса, при необходимости использовать сотни или несколько потоков одновременно. Каждый поток привязан одним и тем же предельным размером стека, чтобы использование виртуальной памяти процесса было в пределах, управляемых.

Дополнительная информация

Максимальный размер стека потока не определяется отдельным компонентом ISAPI, DLL или ASP, работающим внутри процесса. Максимальный размер стека потока настраивается исполняемым файлом процесса. Если необходимо иметь большой размер стека, можно программным образом создать поток, а затем установить соответствующий размер стека. Кроме того, если поток не имеет максимального размера стека, необходимо изменить код в приложении, чтобы правильно использовать стек.

Аргументы и локальные переменные функции хранятся в стеке потока. Если вы объявляете локализованную переменную с большим значением, стек быстро исчерпается. Например, для функции в следующем примере кода требуется 400 000 в стеке для хранения массива.

Читайте также:  Центр обеспечения безопасности windows может регулярно проверять наличие

Эту функцию нельзя вызывать в IIS 4.0, IIS 5.0, IIS 5.1 или IIS 6.0.

Чтобы не использовать стек, динамически выделите память. Например, функция в следующем примере кода динамически выделяет память.

В этом примере кода память хранится в куче, а не в стеке. Поэтому для хранения массива функция не требует 400 000 в стеке.

Если функция называется рекурсивно, стек может быть быстро исчерпан. Например, для функции в стеке требуется 400 000 точек, если действуют следующие условия:

  • Для функции требуется 40 bytes для локальной переменной.
  • Функция рекурсивно называется 10 000 раз.

В приложении common Gateway Interface (CGI) поток не имеет максимального размера стека 256 КБ. При запуске приложения CGI создается новый процесс, а исполняемые файлы CGI настраивают размер стека. Вы также можете явным образом вызвать функцию CreateThread, чтобы указать размер стека потока.

/F (Задание размера стека) /F (Set Stack Size)

Задает размер стека программы в байтах. Sets the program stack size in bytes.

Синтаксис Syntax

Аргументы Arguments

number number
Размер стека в байтах. The stack size in bytes.

Комментарии Remarks

Без этого параметра размер стека по умолчанию равен 1 МБ. Without this option the stack size defaults to 1 MB. Аргумент Number может быть в десятичном формате или в нотации языка C. The number argument can be in decimal or C-language notation. Аргумент может находиться в диапазоне от 1 до максимального размера стека, принимаемого компоновщиком. The argument can range from 1 to the maximum stack size accepted by the linker. Компоновщик Округляет указанное значение до ближайших 4 байт. The linker rounds up the specified value to the nearest 4 bytes. Пробел между /f и Number является необязательным. The space between /F and number is optional.

Если программа получает сообщения переполнения стека, может потребоваться увеличить размер стека. You may need to increase the stack size if your program gets stack-overflow messages.

Размер стека также можно задать следующим образом: You can also set the stack size by:

Использование параметра компоновщика /Stack . Using the /STACK linker option. Дополнительные сведения см. в разделе /Stack. For more information, see /STACK.

Использование программы EDITBIN в файле exe. Using EDITBIN on the .exe file. Дополнительные сведения см. в разделе Справочник по EDITBIN. For more information, see EDITBIN Reference.

Установка данного параметра компилятора в среде разработки Visual Studio To set this compiler option in the Visual Studio development environment

Откройте диалоговое окно Страницы свойств проекта. Open the project’s Property Pages dialog box. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio. For details, see Set C++ compiler and build properties in Visual Studio.

Выберите страницу свойств Свойства конфигурации > C/C++ > Командная строка . Select the Configuration Properties > C/C++ > Command Line property page.

Введите параметр компилятора в поле Дополнительные параметры . Type the compiler option in the Additional Options box.

многопоточность — что определяет размер стека в потоке в C ++?

Я использую C ++ и Windows.h в моем исходном коде. Я читаю API CreateThread в MSDN , но я все еще не понимаю суть определения размера стека. По умолчанию это 1 МБ. Но что будет, если я укажу 32 байта?

Читайте также:  Создание задания windows 10

Что определяет размер стека в потоке?

Пожалуйста, предоставьте подробное объяснение, и я ценю это. Благодарю.

Решение

Стек используется для хранения локальных переменных, передачи параметров в вызовах функций, хранения адресов возврата. Стек потока имеет фиксированный размер, который определяется при создании потока. Это значение, на которое вы тоже ссылаетесь.

Размер стека определяется при создании потока, поскольку он должен занимать непрерывное адресное пространство. Это означает, что все адресное пространство для стека потока должно быть зарезервировано в точке создания потока.

Если стек слишком мал, он может переполниться. Это состояние ошибки, известное как переполнение стека, от которого этот сайт взял свое имя. Когда вы вызываете функцию, происходит некоторое или все из следующего:

  • Параметры помещаются в стек.
  • Адрес возврата помещается в стек.
  • Создается кадр стека, содержащий пространство для локальных переменных функции.

Все это занимает место в стеке. Когда функция в свою очередь вызывает другую функцию, используется больше места в стеке. Поскольку стек вызовов идет глубже, требуется больше места в стеке.

Следовательно, следствием слишком малого размера стека является то, что вы можете исчерпать стек и переполнить его. Это терминальное состояние, от которого вы не можете восстановиться. Конечно, 32 байта (округленные до одной страницы, что составляет 4096 байтов) слишком малы для почти всех потоков.

Если у вас есть программа с большим количеством потоков, и вы знаете, что потокам не нужно резервировать 1 МБ размера стека, тогда может быть полезным использование меньшего размера стека. Это может помочь избежать исчерпания доступного адресного пространства процесса.

С другой стороны, у вас может быть программа с одним потоком, имеющая глубокие стеки вызовов, которые занимают большое количество стекового пространства. В этом случае вы можете зарезервировать больше, чем 1 МБ по умолчанию.

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

Другие решения

Размер стека — это просто компромисс между способностью создавать множество потоков и возможностью переполнение стека в одном из них.

Чем больше размер стека, тем меньшее количество потоков вы можете создать и тем меньше вероятность переполнения стека. Вы должны беспокоиться о размере стека, только если вы собираетесь создать много потоков (вам придется уменьшить размер стека, но помните о переполнении стека). В противном случае достаточно значения по умолчанию.

Но что будет, если я укажу 32 байта?

Я не читал документацию по Windows, но если Windows позволяет это (указать только 32 байта), вы, скорее всего, получите переполнение стека. В соответствии с их документацией значение округляется до размера страницы в любом случае, поэтому на самом деле размер стопки будет равен как минимум размеру страницы. Созданный поток предполагает наличие достаточного «стекового пространства» для его использования (для выделения автоматических переменных, хранения адресов функций и т. Д.) И выделяет пространство в соответствии с его потребностями. Когда стекового пространства недостаточно, распределитель стека может использовать недопустимую память, переопределяя память, используемую в другом месте.

Что определяет размер стека в потоке?

Он определяет, сколько памяти будет выделено для использования стеком этого потока.

Есть хорошее описание того, что такое стек вызовов потоков Вот

Оцените статью