1844208 メンバー
2266 オンライン
110229 解決策
新規ポスト

return value of malloc()

 
nadachi
レギュラーアドバイザー

return value of malloc()

Linux初心者です。お知恵と経験をを拝借したく。malloc()の戻り値に関してです。

$ uname -a

Linux jrs02 2.4.21-27.EL #1 SMP Wed Dec 1 21:53:39 EST 2004 x86_64 x86_64 x86

_64 GNU/Linux

の環境で、malloc()がどれくらい出来るか、を知るために、以下のようなプログラムを試みました。

#include

#include

main()

{

unsigned char *ptr;

long i;

i = 0;

while (1) {

ptr = (unsigned char *)malloc(4096);

if (ptr == (unsigned char *)NULL) break;

++i;

}

printf("%d pages allocated.\n", i);

exit(0);

}

$ cc m.c

でコンパイルして、実行すると、しばらくして、

$ ./a.out

強制終了

 となりました。 man mallocによると、メモリ割付が失敗するとmalloc()には NULL が返るから、それをifで捕まえられるはず。そこで i の値を見れば、何ページ割り付けられたか分かるはず、と考えたのですが、Linuxでは何か、さらに細工がいるのでしょうか?

login shell は /bin/bashです。これも何か関係ありますか?
5件の返信5
テレコム担当者
尊敬されているコントリビューター

return value of malloc()

同じ結果になりました。

# uname -a

Linux xxxx 2.4.2-2 #1 Sun Apr 8 20:41:30 EDT 2001 i686 unknown

Linux のカーネルの作りこみになると思います。

http://www.python.jp/pipermail/python-ml-jp/2003-July/002432.html

Linuxでは物理メモリ+swapが足りなくなると、ランダムにプロセスを

killしてメモリを確保するので、Xなどがkillされた場合は、

画面モードを戻す終了処理などもできないため

見た目には止まってしまったように見えることもあります。

nadachi
レギュラーアドバイザー

return value of malloc()

テレコム担当者様、

追試ありがとうございます。

"Linuxでは物理メモリ + swapが足りなくなると、ランダムにプロセスをkill してメモリを確保するので..." というのは、個人的にはかなり無茶な処理のように思います。

 せっかく、アプリケーションで使うメモリリソースを見積もっても、メモリの突発的な使用で”どうなるか分からない" というのはとってもこわいです。
テレコム担当者
尊敬されているコントリビューター

return value of malloc()

Linux の生い立ちが商用を意識したものでないことだと

思います。

>"Linuxでは物理メモリ + swapが足りなくなると、ランダムにプロセスをkill して

>メモリを確保するので..." というのは、個人的にはかなり無茶な処理のように思います。

同感です。

実メモリの少ない環境にさまざまな Linux Dest(RedHat, Fedra Core, Turbo,

Vine) をインストールしたことがありますが、Linux カーネルは少ない

実メモリの場合、それなりのメモリハンドリングで動こうとします。

これはスワップアウトしまくる Windows と比較して優秀だと思いますが、

この仕様(カーネルがユーザプロセスを kill する)は頂けませんね。

クリティカルな運用では致命的かも知れません。

nadachi
レギュラーアドバイザー

return value of malloc()

man malloc(3)に、

---

Linux は楽観的メモリ配置戦略を用いている。これは、 malloc() が NULL でない値を返したとき、メモリが実際に利用可能であることが保証されないことを意味している。システムがメモリ不足状態になったとき、悪名高いメモリ不足解決器 (OOM killer) によって一つまたは複数のプロセスが削除される。

----

と書いてありました。そうか、ようやく最初のプログラムの動作が理解できたような気がします。

 プログラムを実行すると、malloc()でメモリを割り付けて行きます。

 物理メモリ + swapが不足し始めます。

 それでも、malloc()はメモリが利用可能でないかも知れないけれど、楽観的にnon-NULL のアドレスを返すのでプログラムはwhile loopを続けてしまう。

 カーネルはメモリ不足を検出して、このプロセスをkill して、フリーメモリを確保しようとした。これが "強制終了" ですね。

うーん。皆さん困らないのだろうか。
nadachi
レギュラーアドバイザー

return value of malloc()

自己follow upです。

 OOM Killer自身は disableする、とかは出来ないようなのですが、malloc()側の"楽観的"挙動を変えるのは出来そうです。Linuxのバージョンによっては、

# echo 2 > /proc/sys/vm/overcommit_memory

と設定するんだそうです。("2" が何の意味か、はわかりませんが。)