ネイティブ IIS プロセスで作成されるスレッドの既定の最大スタック サイズは 256 KB です

この記事では、ネイティブ Microsoft インターネット インフォメーション サービス (IIS) プロセスによって作成されるスレッドの既定の最大スタック サイズについて説明します。

元の製品バージョン: インターネット インフォメーション サービス 8.0
元の KB 番号: 932909

概要

既定では、ネイティブ IIS プロセスによって作成されるスレッドの最大スタック サイズは、Windows Server 2008 より前の 256 KB です。 たとえば、IIS 5.0 または IIS 6.0 でスレッドを作成 Inetinfo.exe、DLLHost.exe、または W3wp.exe する場合、スレッドの最大スタック サイズは既定で 256 KB です。 CreateThread 関数を明示的に呼び出して、スレッドのスタック サイズを指定することもできます。 Microsoft Windows 2000 では、Microsoft ASP.NET Worker プロセス (ASPNet_wp.exe) によってスレッドが作成された場合、スレッドの最大スタック サイズは 1 MB です。 Windows Server 2008 以降では、32 ビット バージョンの IIS で実行されているスレッドの最大スタック サイズは 256 KB で、x64 サーバーでは 512 KB です。

注:

インターネット インフォメーション サービスは、各ワーカー プロセス内で実行されているアプリケーション コードが必要に応じて数百以上のスレッドを一度に利用できるようにするマルチスレッド Web アプリケーション プラットフォームです。 各スレッドは、プロセスの仮想メモリ使用量を管理可能な制限内に維持するために、同じスタック サイズ制限によってバインドされます。

詳細

スレッドの最大スタック サイズは、プロセス内で実行されている個々の 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 回呼び出されます。

Common Gateway Interface (CGI) アプリケーションでは、スレッドの最大スタック サイズは 256 KB ではありません。 CGI アプリケーションを起動すると、新しいプロセスが作成され、CGI 実行可能ファイルによってスタック サイズが構成されます。 CreateThread 関数を明示的に呼び出して、スレッドのスタック サイズを指定することもできます。

詳細については、「 スレッド スタック サイズ」を参照してください。