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

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

Оригинальная версия продукта:   службы IIS 8.0
Исходный номер КБ:   932909

Сводка

По умолчанию максимальный размер потока, созданного в процессе ИИС, составляет 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 КБ.

Примечание

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

Дополнительные сведения

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

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

void func(void)
{
    int i[100000];
    // Use 100,000 integers multiplied by 4 bytes per integer to store the array.
    return;
}

Примечание

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

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

void func(void)
{
    int *i
    
    i = new int[100000];
    // More code goes here.
    return;
}

Примечание

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

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

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

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

Дополнительные сведения см. в дополнительных сведениях о размере стека потоков.