web-dev-qa-db-ja.com

なぜ最近のLinuxでは、デフォルトのスタックサイズが非常に大きい-8MB(一部のディストリビューションでは10)

たとえば、OSXでは、512k未満です。

アプリが再帰を使用せず、多くのスタック変数を割り当てないことを念頭に置いて、推奨サイズはありますか
質問が広すぎて、使用法に大きく依存することを知っていますが、いくつかの非表示/内部/システムの理由があるかどうか疑問に思っていたので、それでも質問しましたこの膨大な数の背後にあります。


アプリでスタックサイズを512 KiBに変更するつもりなので、私は不思議に思っていました-これはまだ巨大な数のように聞こえますが、8MiBよりはるかに小さく、プロセスの仮想メモリが大幅に減少します。スレッド(I/O)が多い。

私はこれも知っています本当に害はありません、ここで詳しく説明されていますpthreadのデフォルトのスタックサイズ

10
Kiril Kirov

他の人が言ったように、そしてあなたの質問であなたが提供するリンクで述べられているように、8MiBスタックがあっても何も害を与えません(アドレス空間の消費は別として、重要ではない64ビットシステム上で)。

Linuxは非常に長い間8MiBスタックを使用しています。この変更は、1995年7月にカーネルの version 1.3.7 で導入されました。当時は制限の導入として提示されていましたが、以前は制限がありませんでした。

スタックを適切なデフォルトに制限します。rootは必要に応じてこの制限を常に増やすことができます。8MBが妥当と思われます。

Linuxでは、スタック制限はプログラム引数のサイズと環境にも影響します。これらは スタック制限の4分の1 ;に制限されています。カーネルは、引数と環境に最低32ページを強制します。

スレッドの場合、スタック制限(RLIMIT_STACK)は無制限です pthread_create は、新しいスレッドのスタックに独自の制限を適用します。ほとんどのアーキテクチャでは、8MiB未満です。

15
Stephen Kitt

8MBは、スタックのvirtualサイズです。アプリケーションが現在物理的に割り当てられているよりも多くのスタックを使用しようとすると、ページ違反が発生します。カーネルのページフォールトハンドラーはphysicalページを割り当て、アプリケーションは続行されます。

完全な説明については https://unix.stackexchange.com/a/280865/21212 を参照してください。

したがって、スタックサイズを減らしても、アプリケーションの物理メモリ使用量を減らす効果はありません

1
Colin 't Hart