在原生 IIS 進程中建立的執行緒的預設堆疊大小上限為 256 KB

本文說明由原生 Microsoft Internet Information Services 建立的執行緒的預設最大堆疊大小 (IIS) 處理常式。

原始產品版本:   網際網路資訊服務8。0
原始 KB 編號:   932909

摘要

根據預設,原生 IIS 進程所建立之執行緒的堆疊大小上限為 Windows Server 2008 之前的 256 KB。 例如,當 Inetinfo.exe、DLLHost.exe 或 W3wp.exe 在 IIS 5.0 或 IIS 6.0 中建立執行緒時,執行緒的最大堆疊大小預設為 256 KB。 您也可以明確呼叫 CreateThread 函數,以指定執行緒的堆疊大小。 在 Microsoft Windows 2000 中,如果 Microsoft ASP.NET Worker 進程 ( # A0) 建立執行緒,則該執行緒的堆疊大小上限為 1 MB。 在 Windows Server 2008 和更高版本中,以32位版本的 IIS 執行的執行緒最大堆疊大小是 256 KB,而在 x64 伺服器上則是 512 KB。

注意

Internet Information Services 是一種多執行緒的 web 應用程式平臺,可讓執行于每個工作者進程內部的應用程式程式碼,在必要時使用成百上千的執行緒。 每個執行緒都是以相同的堆疊大小限制來系結,以便在可管理的限制內保持處理常式的虛擬記憶體使用量。

其他相關資訊

執行緒的堆疊大小上限不是由處理常式內執行的個別 ISAPI、DLL 或 ASP 元件所決定。 執行緒的最大堆疊大小是由處理常式的可執行檔所設定。 如果您必須有大型堆疊大小,可以以程式設計方式建立執行緒,然後設定適當的堆疊大小。 或者,如果執行緒已耗盡堆疊大小上限,您必須變更應用程式中的程式碼,才能正確使用堆疊。

函數的引數及區域變數是儲存線上程的堆疊中。 如果您宣告的是具有大量值的本機變數,則堆疊很快就會耗盡。 例如,下列程式碼範例中的函數需要堆疊中的400000個位元組,以儲存陣列。

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;
}

注意

在此程式碼範例中,記憶體會儲存在堆中,而不是堆疊。 因此,此函數不需要堆疊中的400000位元組來儲存陣列。

如果以遞迴方式呼叫函數,堆疊可能很快就會耗盡。 例如,如果下列條件成立,則函數需要堆疊中的400000位元組:

  • 函數需要40個位元組的本機變數。
  • 函數會遞迴地稱為10000次。

在通用閘道介面 (CGI) 應用程式中,執行緒的堆疊大小上限為 256 KB。 當您啟動 CGI 應用程式時,就會建立新的程式,而 CGI 可執行檔會設定堆疊大小。 您也可以明確呼叫 CreateThread 函數,以指定執行緒的堆疊大小。

如需詳細資訊,請參閱 執行緒堆疊大小