最新のLinuxでは、デフォルトのスタックサイズが8MB(一部のディストリビューションでは10MB)と大きすぎるのはなぜですか?

最新のLinuxでは、デフォルトのスタックサイズが8MB(一部のディストリビューションでは10MB)と大きすぎるのはなぜですか?

たとえば、OSXでは512kよりはるかに小さいです。

推奨サイズはありますか?このアプリケーションは再帰を使用せず、大規模なスタック変数を割り当てないことに注意してください。
この質問が広すぎて使い方によって大きく異なることはわかっていますが、いくつかの質問があるかどうかを知りたかったので、まだ尋ねたいと思いました。隠された/内部/システム理由この途方もない数字の後ろに。


私のアプリケーションのスタックサイズを512KiBに変更する予定なので気になります。これはまだ大きな数字のように聞こえますが、8MiBよりはるかに小さく、プロセスの仮想メモリが大幅に削減されます。 、スレッド(I/O)が多いからです。

私もこれを知っていますあまり病気ではありません。ここに良い説明があります。:pthreadのデフォルトスタックサイズ

答え1

他の人が言ったように、そして質問に提供されたリンクで述べたように、8MiBスタックを使用することは有害ではありません(アドレス空間を消費する以外は64ビットシステムでは重要ではありません)。

Linuxは長い間8MiBスタックを使用してきました。バージョン 1.3.71995年7月、カーネルがこれをリリースしました。当時、以前は制限がなかった場所に制限を導入したと考えられていました。

スタックを合理的なデフォルト値に制限します。必要に応じて、ルートは常にこの制限を増やすことができます。 8MBが適しているようです。

Linuxでは、スタック制限はプログラムパラメータと環境サイズにも影響します。これは次のように制限されます。スタック制限の1/4;カーネルは、パラメータと環境が少なくとも32ページを持つように強制します。

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

答え2

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

バラよりhttps://unix.stackexchange.com/a/280865/21212完全な説明のために。

したがって、スタックサイズを小さくしてくださいしなければならないアプリケーションの物理メモリ使用量の削減には影響はありません。

関連情報