実際には、スタックを増やすことは困難です(時には不可能です)。理由を理解するには、仮想メモリをある程度理解する必要があります。
シングルスレッドアプリケーションと連続メモリのYe Olde Daysでは、3つがプロセスアドレススペースの3つのコンポーネントでした。コード、ヒープ、スタックです。これら3つのレイアウト方法はOSによって異なりますが、一般的にはメモリの一番下からコードが最初に来て、次にヒープが上に上がり、スタックがメモリの一番上から始まり、下に向かって成長しました。オペレーティングシステム用に予約されたメモリもありましたが、無視できます。当時のプログラムでは、スタックがかなり劇的にオーバーフローしていました。スタックがヒープにクラッシュし、最初に更新されたものに応じて、不良データを処理するか、サブルーチンからメモリの任意の部分に戻ります。
メモリ管理はこのモデルを多少変更しました。プログラムの観点からは、プロセスメモリマップの3つのコンポーネントがまだあり、一般的に同じ方法で編成されていましたが、各コンポーネントは独立したセグメントとして管理され、MMUはプログラムがセグメント外のメモリにアクセスしようとした場合のOS。仮想メモリを取得すると、プログラムにそのアドレス空間全体へのアクセスを許可する必要も希望もありませんでした。そのため、セグメントには固定境界が割り当てられました。
それでは、なぜプログラムにその完全なアドレス空間へのアクセスを許可することが望ましくないのでしょうか?そのメモリはスワップに対する「コミットチャージ」を構成するためです。いつでも、あるプログラムのメモリの一部またはすべてを、別のプログラムのメモリ用のスペースを確保するためにスワップに書き込む必要があります。すべてのプログラムが潜在的に2GBのスワップを消費する可能性がある場合、すべてのプログラムに十分なスワップを提供するか、2つのプログラムが必要以上にスワップを必要とする可能性があります。
この時点で、十分な仮想アドレス空間を想定して、必要に応じてこれらのセグメントを拡張できます。実際、データセグメント(ヒープ)は時間とともに成長します。小さなデータセグメントから始め、それが必要です。この時点で、単一のスタックで、スタックセグメントを拡張することは物理的に可能でした。OSは、セグメントの外に何かをプッシュしてメモリを追加しようとする試みをトラップできます。しかし、これも特に望ましくありません。
マルチスレッドを入力します。この場合、各スレッドには、固定サイズの独立したスタックセグメントがあります。しかし、今では仮想アドレス空間にセグメントが次々とレイアウトされているため、別のセグメントを移動せずにセグメントを拡張する方法はありません-プログラムには潜在的にスタックにあるメモリへのポインタがあるため、これはできません。あるいは、セグメント間にいくつかのスペースを残すこともできますが、ほとんどの場合、そのスペースは無駄になります。より良いアプローチは、アプリケーション開発者に負担をかけることでした。本当に深いスタックが必要な場合は、スレッドの作成時にそれを指定できます。
現在、64ビットの仮想アドレス空間を使用して、事実上無限の数のスレッドに対して事実上無限のスタックを作成できました。ただし、これも特に望ましいことではありません。ほとんどすべての場合、スタックが低すぎるということは、コードのバグを示しています。1 GBのスタックを提供すると、そのバグの発見が延期されます。