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


10

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

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


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

私はこれが本当に害を及ぼさないことも知っています、ここでよく説明されていますpthreadのデフォルトのスタックサイズ


32ビットCPUを使用していますか?X86_64 CPUは、最大128テラバイト(ユーザー空間)の仮想アドレス空間を提供します。これは、8 MBのスタックの多くに十分なはずです。
JohanMyréen18年

@JohanMyréen-いいえ、x64です。それは大したことではありません、私はただ疑問に思っていました、(現時点では)それをする本当の理由はありません。
キリルキーロフ

2019と8 MiBは大量のメモリですか?私はそうは思いません。デフォルトのスタックサイズが大きいと、再帰プログラムを非常に簡単に作成できます。Windowsのデフォルトのスタックサイズが1 MiBだけであることを知って驚いた。
oldherl

回答:


15

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

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

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

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

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


1
うわー、面白い。最近導入されたと思います。私には約200のスレッドがあり(これもまた長いトピックなので、今は無視しておきましょう)top、恐ろしいVIRT結果に表示されます。少し深く掘り下げますが、この仮想アドレス空間の大部分はスタックサイズではなくスレッドごとの(メモリ)アリーナから取得されるため、スタックサイズを小さくしても仮想メモリが大幅に減少することはありません。なぜ8MiBなのか、なぜそんなに多くなのかが気になっただけです。
キリルキーロフ

「8 MB」は、スレッドが使用することを決定した場合に、各スレッドのスタック 8 MBに増えることを意味します。ただし、物理メモリは、メモリが実際に使用されるまで割り当てられません。200スレッドがそれぞれ512 KBを使用する場合、1.6 GBではなく100 MBの物理RAMを使用します。
Guntram Blohmはモニカ

スワッピングを行わない場合、のRES列はtop、VIRTよりも「このプロセスが実際に使用しているメモリ」に対してはるかに優れた回答を提供します。
kbolino 2018年

1
OPの@Guntramはそれを十分に認識しています。質問のリンクを参照してください。
Stephen Kitt

1

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

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

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


1
私の質問では、この回答をすでにリンクしています。私もこれを知っていると書いたが、これは実際には質問に答えるものではない。とにかくありがとう
キリルキーロフ

私はあなたが質問の前提を再検討する必要があると思います、そしてこの(非)回答は理由を指摘します。仮想メモリは実メモリではありません。スタックサイズは800 MBで、アプリケーションが8 MBを超えるスタックフレームを作成しない限り、実際のメモリ使用量には影響しません。
kbolino 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.