スタックメモリのサイズがなぜ制限されているのでしょうか? 質問する

スタックメモリのサイズがなぜ制限されているのでしょうか? 質問する

ヒープ上にメモリを割り当てる場合、唯一の制限は空き RAM (または仮想メモリ) です。GB 単位のメモリが作成されます。

では、スタック サイズがなぜこのように制限されているのでしょうか (約 1 MB)? スタック上に非常に大きなオブジェクトを作成できない技術的な理由は何ですか?

アップデート: 私の意図が明確でないかもしれませんが、ほしくないスタック上に巨大なオブジェクトを割り当てるために必要はありませんより大きなスタック。この質問は単なる好奇心です。

ベストアンサー1

私の直感は次のとおりです。スタックはヒープほど簡単に管理できません。スタックは連続したメモリ位置に格納する必要があります。つまり、必要に応じてスタックをランダムに割り当てることはできませんが、少なくともその目的のために仮想アドレスを予約する必要があります。予約された仮想アドレス空間のサイズが大きいほど、作成できるスレッドの数は少なくなります。

たとえば、32 ビット アプリケーションは一般に 2 GB の仮想アドレス空間を持ちます。つまり、スタック サイズが 2 MB (pthreads のデフォルト) の場合、最大 1024 個のスレッドを作成できます。これは、Web サーバーなどのアプリケーションにとっては小さいかもしれません。スタック サイズをたとえば 100 MB に増やすと (つまり、100 MB を予約しますが、必ずしも 100 MB をすぐにスタックに割り当てるわけではありません)、スレッドの数は 20 程度に制限され、単純な GUI アプリケーションでも制限される可能性があります。

興味深い疑問は、なぜ 64 ビット プラットフォームにまだこの制限があるのか​​ということです。その答えはわかりませんが、人々はすでにいくつかの「スタックのベスト プラクティス」に慣れているのではないかと思います。つまり、ヒープ上に巨大なオブジェクトを割り当てるように注意し、必要に応じて手動でスタック サイズを増やすということです。したがって、64 ビット プラットフォームに「巨大な」スタック サポートを追加することが有用であるとは誰も考えませんでした。

おすすめ記事