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

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

Оригинальная версия продукта: службы IIS 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 байт в стеке для хранения массива.

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 байт в стеке.

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

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

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

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