[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[plamo:21938] Re: 物理メモリサイズを取得する方法を教えて下さい
-
From:Iwasa Dai
-
Date:Thu, 5 Feb 2004 19:04:10 +0900 (JST)
- Subject: [plamo:21938] Re: 物理メモリサイズを取得する方法を教えて下さい
- From: Iwasa Dai <iwasad@xxxxxxxxxxx>
- Date: Thu, 05 Feb 2004 19:05:17 +0900 (JST)
- Organization: ALPHASYSTEMS INC.
岩佐です。
Shun-ichi TAHARA (田原 俊一) <jado@flowernet.gr.jp> wrote:
> # 仕事では、4GB のマシンで malloc() failed を出したりします :-)。
ぼくは最近、AMD64マシンがとっても欲しいです(^_^;
> > そもそも、「実際に取ってみる」ってどうなのでしょう?
>
> というわけで、裏でカーネルがこれだけの仕事をやっている以上、「実際に取っ
> てみる」というのは、「とりあえず実メモリをかき集めてきて mmap か heap
> に貼り付ける」というだけの話なので、何ら意味はないことになりますよね。
>
> もっとも、経験上、malloc() 1回で取れるメモリブロックは、とりあえず全部
> 実メモリに載っていて、かつ、物理アドレスとして連続しているんじゃないか、
> と思っています(嘘かも)。
あれれ? そんなことは無いような気が。
の前に、まず、ぼくが書いた「実際に取ってみる」は、「取って
みることによって実メモリの利用可能量を調べる」こと(が出来る
こと)が前提ですから、mlockall()したような場合についてです。
仮にmlockallしたとしても... ということを先に書いたのですが、
わかりづらかったかもしれません。ごめんなさい。
なので、噛みあっていないだけかもしれません...
で、linuxのmallocは、実メモリより大きなサイズがalloc出来ま
すよ。
# overcommit_memory == 0でも、です。
例えば、実memory 1G, swap 2Gのホストで、
| void * k;
|
| k = malloc(1024 * 1024 * 1500);
| if(k == NULL)
| {
| printf("error");
| }
| else
| {
| printf("success");
| }
なんて書くと、ちゃんとsuccessします。
# と言うのがなぜか、というのが、元質問者の方の
# 疑問だと思います。
ぼくはBSD方面の古い理解しかないのでアレですが、別段、物理
メモリ的に全体が連続である必要はないのでありません?
pageレベルでは連続でしょうけど。
> あー、これはいいですね。あいかわらずスワップはメモリを圧迫してくれます
> けど。あと、malloc するのであれば、128KB 以上のブロックでとってあげた
> 方がいいです。このへんは、mmap と heap の使い方の癖に関わってくるんで
> すが。
> これも、1GB の壁に当たってるように見えるので、その問題に関係してるんじゃ
> ないかなぁ。ようするに、text+heap はメモリマップ上で 1G 分に制限されて
> て、128KB 未満の malloc() はこちらからしか取らないのです。
>
> 大きいブロックは、その上の mmap + スタックの領域(2G)から取ってきます。
> これが溢れると heap も使いますので、「取れるだけ取る」のであれば、
> 128KB でぎっていくのが正解。
テストコードは、1M mallocして、freeして、2M mallocしてfree
して... をずっと続けるコードでした。それが、mlockall(FUTURE)
をかけたまま973Mを一気にmallocしようとしたところで、各process
がkernelにKILLされた、という話です。
起きたのは、
- 物理メモリのほとんどを(mlockallによって)テストプロ
グラムに占有されたがために、各processがどんどんswapout
した。
- swapoutしたprocessが動こうとして、__alloc_pagesしよう
としたが、それも出来なかった。
- なので、そのprocessにSIGKILLが与えられた。
ということだと思います。
ですから、落ちたのはメールに書いた通り、
| をいれて、RAM 1024M, SWAP 2GのPCで実行してみたところ、973Mま
| で行ったところで、daemonやらktermやらが落ちまくってしまい、
^^^^^^^^^^^^^^^^^
無実のprocessです。
# terminalが落ちたので、SIGPIPEを頂いたかも。
# > テストプログラム
--- Think Diffident ----------------------------------------
uaitne.
- Follow-Ups
-
- [plamo:22012] Re: 物理メモリサイズを取得する方法を教えて下さい, H.Shiozaki
- References
-
- [plamo:21933] 物理メモリサイズを取得する方法を教えて下さい, H.Shiozaki
- [plamo:21934] Re: 物理メモリサイズを取得する方法を教えて下さい, Iwasa Dai
- [plamo:21935] Re: 物理メモリサイズを取得する方法を教えて下さい, Shun-ichi TAHARA (田原 俊一)
[検索ページ]
[メール一覧]
Plamo ML 公開システム