【投稿】スタックスペースの大きさをテスト
4344 ワード
スタックスペースのサイズをテスト
たとえば、ローカル変数はスタック空間に保存されていますが、今日突然スタックの上限がどれくらいなのか、スタックがオーバーフローするのはいつですか?
ulimitコマンドlinuxの下でulimitコマンドを使用すると、システムの多くの上限値を表示できます.
ulimit-aすべてを表示
ulimit-sスタックスペースのサイズを表示
システム設定スタックの上限は8 Mであることがわかります
テスト今プログラムを書いてテストします
2つの方法:
1、第1の方法:最も簡単なのは、関数またはmain()関数に複数の局所変数を直接定義することです.
ローカル変数は初期化する必要があります.そうしないと、メモリが割り当てられない可能性があります.
2、第2の方法:再帰申請スタック空間を使用するのがより適切で、テストが便利である.
全部で7 M申請しましたが、8回目の申請に失敗しました.スタックにはmain関数のパラメータなどの他のデータが保存されているので、8回目の申請は1 M未満で、運行結果がulimitが見た情報と一致していることを示しています.
3、物理メモリは4 Gがあって、あのスタックの空間は4 Gを申請することができますか?
スタックの上限を4 Gに設定
プログラムの再実行:
本当に4 Gを申請したとは、仮想メモリメカニズムとlinux交換空間を思い浮かべた.明らかに、この4 Gは本当に物理メモリを提供するのに十分ではありません.私たちが申請した4 Gのほかに、カーネルもメモリ空間が必要なので、必ず交換空間を使用しています.物理メモリが足りないときは、一時的に使わないメモリデータを交換空間に一時的に保存します.私の交換空間には2 Gが割り当てられています.申請は成功しましたが、明らかにシステムカートンを感じました.3 Gに近い申請をしたときにカードを押すことがあります.この時、物理メモリの圧力が大きすぎて、交換空間にデータを交換しているのではないでしょうか.それから1 Gの申請が残っています.
4、衝動的!今回はスタックの上限を7 G>4 G物理メモリ+2 G swapに設定します
実行:
成功した.スペシャルカード、初めて直接システムがハングアップしました.
しかし、物理メモリ+スワップスペース=6 G、なぜ7 Gを申請できるのか、少し理解できません.しかし、途中で失敗することもあり、7 Gは割り当てられません.
5、アドレス空間
申請メモリが多すぎることを心配する必要はありません.例えば、上で再帰的に複数の文字列を定義したように、アドレスは十分ですか.変数が多すぎて、最初のアドレスが重複しませんか.
これは心配する必要はないが,64ビットシステムCPUのアドレス空間は2^64であり,0〜0 xffffffffffffffffシステムではこのような大きなアドレス空間はまったく使いきれない.まして私たちのパソコンの物理メモリはわずか4 Gです.
したがって、64ビットシステムはアドレス範囲の大部分が使えなくなり、これをAMD 64空洞と呼ぶそうです.
6、申請スタックスペース
ここで問題があります.複数回のテストを経て、mallocダイナミック申請のメモリが特に大きい場合、上記の図のように、順次割り当てられたメモリアドレスは減少し、スタックのアップグレードの特徴に合わないようです.
7、32ビット環境テスト
上のコードはgcc-m 32でコンパイルして実行します
ここにも質問があります.
ヒープメモリアドレスが減少し始めました:
十分な時間に減らして増大し始めます.
スタックの後ろに使用されるアドレス空間は、前に動的に申請された(解放されていない)8であり、ulimit-sの設定値が大きすぎると失敗し、その後の設定値が成功しない場合があります.ログアウトして再設定すればいい
————————————————著作権声明:本文はCSDNブロガー「lwoyvye」のオリジナル文章であり、CC 4.0 BY-SA著作権協定に従い、原文の出典リンクと本声明を転載してください.テキストリンク:https://blog.csdn.net/lyh__521/article/details/50115943
https://blog.csdn.net/lyh__521/article/details/50115943
たとえば、ローカル変数はスタック空間に保存されていますが、今日突然スタックの上限がどれくらいなのか、スタックがオーバーフローするのはいつですか?
ulimitコマンドlinuxの下でulimitコマンドを使用すると、システムの多くの上限値を表示できます.
ulimit-aすべてを表示
ulimit-sスタックスペースのサイズを表示
システム設定スタックの上限は8 Mであることがわかります
テスト今プログラムを書いてテストします
2つの方法:
1、第1の方法:最も簡単なのは、関数またはmain()関数に複数の局所変数を直接定義することです.
ローカル変数は初期化する必要があります.そうしないと、メモリが割り当てられない可能性があります.
2、第2の方法:再帰申請スタック空間を使用するのがより適切で、テストが便利である.
#include
#include
int i = 1; //
void func()
{
char a[1048576]; // 1 M
printf("NO.%d %ld %p
",i,sizeof(a),a);
i++;
func();
}
main()
{
func();
}
全部で7 M申請しましたが、8回目の申請に失敗しました.スタックにはmain関数のパラメータなどの他のデータが保存されているので、8回目の申請は1 M未満で、運行結果がulimitが見た情報と一致していることを示しています.
3、物理メモリは4 Gがあって、あのスタックの空間は4 Gを申請することができますか?
スタックの上限を4 Gに設定
プログラムの再実行:
本当に4 Gを申請したとは、仮想メモリメカニズムとlinux交換空間を思い浮かべた.明らかに、この4 Gは本当に物理メモリを提供するのに十分ではありません.私たちが申請した4 Gのほかに、カーネルもメモリ空間が必要なので、必ず交換空間を使用しています.物理メモリが足りないときは、一時的に使わないメモリデータを交換空間に一時的に保存します.私の交換空間には2 Gが割り当てられています.申請は成功しましたが、明らかにシステムカートンを感じました.3 Gに近い申請をしたときにカードを押すことがあります.この時、物理メモリの圧力が大きすぎて、交換空間にデータを交換しているのではないでしょうか.それから1 Gの申請が残っています.
4、衝動的!今回はスタックの上限を7 G>4 G物理メモリ+2 G swapに設定します
実行:
成功した.スペシャルカード、初めて直接システムがハングアップしました.
しかし、物理メモリ+スワップスペース=6 G、なぜ7 Gを申請できるのか、少し理解できません.しかし、途中で失敗することもあり、7 Gは割り当てられません.
5、アドレス空間
申請メモリが多すぎることを心配する必要はありません.例えば、上で再帰的に複数の文字列を定義したように、アドレスは十分ですか.変数が多すぎて、最初のアドレスが重複しませんか.
これは心配する必要はないが,64ビットシステムCPUのアドレス空間は2^64であり,0〜0 xffffffffffffffffシステムではこのような大きなアドレス空間はまったく使いきれない.まして私たちのパソコンの物理メモリはわずか4 Gです.
したがって、64ビットシステムはアドレス範囲の大部分が使えなくなり、これをAMD 64空洞と呼ぶそうです.
6、申請スタックスペース
#include
#include
int i = 1; //
void func()
{
char a[1048576] = {'1'}; // 1 M
char *p = NULL;
p = (char*)malloc(1048576);
printf("NO.%d %ld %p -->",i,sizeof(a),a,p);
i++;
func();
}
main()
{
func();
}
ここで問題があります.複数回のテストを経て、mallocダイナミック申請のメモリが特に大きい場合、上記の図のように、順次割り当てられたメモリアドレスは減少し、スタックのアップグレードの特徴に合わないようです.
7、32ビット環境テスト
上のコードはgcc-m 32でコンパイルして実行します
ここにも質問があります.
ヒープメモリアドレスが減少し始めました:
十分な時間に減らして増大し始めます.
スタックの後ろに使用されるアドレス空間は、前に動的に申請された(解放されていない)8であり、ulimit-sの設定値が大きすぎると失敗し、その後の設定値が成功しない場合があります.ログアウトして再設定すればいい
————————————————著作権声明:本文はCSDNブロガー「lwoyvye」のオリジナル文章であり、CC 4.0 BY-SA著作権協定に従い、原文の出典リンクと本声明を転載してください.テキストリンク:https://blog.csdn.net/lyh__521/article/details/50115943