- Community Home
- >
- HPE Community, Japan
- >
- Legacy
- >
- Linux
- >
- return value of malloc()
カテゴリ
Company
Local Language
フォーラム
ディスカッションボード
フォーラム
- Data Protection and Retention
- Entry Storage Systems
- Legacy
- Midrange and Enterprise Storage
- Storage Networking
- HPE Nimble Storage
ディスカッションボード
フォーラム
ディスカッションボード
ディスカッションボード
ディスカッションボード
フォーラム
ディスカッションボード
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
- BladeSystem Infrastructure and Application Solutions
- Appliance Servers
- Alpha Servers
- BackOffice Products
- Internet Products
- HPE 9000 and HPE e3000 Servers
- Networking
- Netservers
- Secure OS Software for Linux
- Server Management (Insight Manager 7)
- Windows Server 2003
- Operating System - Tru64 Unix
- ProLiant Deployment and Provisioning
- Linux-Based Community / Regional
- Microsoft System Center Integration
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
フォーラム
ブログ
- RSS フィードを購読する
- トピックを新着としてマーク
- トピックを既読としてマーク
- このトピックを現在のユーザーにフロートします
- ブックマーク
- 購読
- 印刷用ページ
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
04-09-2005 07:11 AM
04-09-2005 07:11 AM
return value of 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です。これも何か関係ありますか?
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
04-09-2005 08:05 AM
04-09-2005 08:05 AM
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された場合は、
画面モードを戻す終了処理などもできないため
見た目には止まってしまったように見えることもあります。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
04-09-2005 12:11 PM
04-09-2005 12:11 PM
return value of malloc()
追試ありがとうございます。
"Linuxでは物理メモリ + swapが足りなくなると、ランダムにプロセスをkill してメモリを確保するので..." というのは、個人的にはかなり無茶な処理のように思います。
せっかく、アプリケーションで使うメモリリソースを見積もっても、メモリの突発的な使用で”どうなるか分からない" というのはとってもこわいです。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
04-09-2005 12:29 PM
04-09-2005 12:29 PM
return value of malloc()
思います。
>"Linuxでは物理メモリ + swapが足りなくなると、ランダムにプロセスをkill して
>メモリを確保するので..." というのは、個人的にはかなり無茶な処理のように思います。
同感です。
実メモリの少ない環境にさまざまな Linux Dest(RedHat, Fedra Core, Turbo,
Vine) をインストールしたことがありますが、Linux カーネルは少ない
実メモリの場合、それなりのメモリハンドリングで動こうとします。
これはスワップアウトしまくる Windows と比較して優秀だと思いますが、
この仕様(カーネルがユーザプロセスを kill する)は頂けませんね。
クリティカルな運用では致命的かも知れません。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
04-09-2005 12:53 PM
04-09-2005 12:53 PM
return value of malloc()
---
Linux は楽観的メモリ配置戦略を用いている。これは、 malloc() が NULL でない値を返したとき、メモリが実際に利用可能であることが保証されないことを意味している。システムがメモリ不足状態になったとき、悪名高いメモリ不足解決器 (OOM killer) によって一つまたは複数のプロセスが削除される。
----
と書いてありました。そうか、ようやく最初のプログラムの動作が理解できたような気がします。
プログラムを実行すると、malloc()でメモリを割り付けて行きます。
物理メモリ + swapが不足し始めます。
それでも、malloc()はメモリが利用可能でないかも知れないけれど、楽観的にnon-NULL のアドレスを返すのでプログラムはwhile loopを続けてしまう。
カーネルはメモリ不足を検出して、このプロセスをkill して、フリーメモリを確保しようとした。これが "強制終了" ですね。
うーん。皆さん困らないのだろうか。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
04-11-2005 12:50 PM
04-11-2005 12:50 PM
return value of malloc()
OOM Killer自身は disableする、とかは出来ないようなのですが、malloc()側の"楽観的"挙動を変えるのは出来そうです。Linuxのバージョンによっては、
# echo 2 > /proc/sys/vm/overcommit_memory
と設定するんだそうです。("2" が何の意味か、はわかりませんが。)