- - PR -
LINUXのヒープ領域について
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-02-07 23:40
LINUX(Fedore core3)で、ヒープ領域の使用量を表示できるコマンドがあれば、教えてください。(free、vmstatとかで確認できる?)
よろしくお願いします。 [ メッセージ編集済み 編集者: アントニオ 編集日時 2006-02-07 23:42 ] |
|
投稿日時: 2006-02-08 00:15
# どうしてヒープ領域だけを知りたいのかわかりませんが。
無さそうな気がします。 brk()だけを追っかければいいのならともかく、Linuxではmalloc()の 実装にmmap()を使ってるし、結構ややこしいことになりそうな... |
|
投稿日時: 2006-02-08 00:33
実は、この質問のしたのは、OS起動して特に何も起動していない状態(自分が作成したプログラム、リソースを使用しそうなP.P等を起動していない状態)3秒おきに実行すると、freeの値がすこしずつ減っていっているのです。
topとかでメモリを使用していそうなプロセスを調べたのですが、なぜfreeが減っているのか分からない状況です。 こういうときはどうしたらいいですか?何か調査する手段はありますか? |
|
投稿日時: 2006-02-08 00:50
LinuxがJavaのようなメモリ管理をしているように想像していませんか?
OSのメモリ管理手法はJava VMのGC等とはまるで異なる方式を使っています。 そもそもヒープやスタック、テキスト(コード)の領域の区別すらありません。 もちろん使い方的な区別はありますが、仮想メモリのページ属性の違い程度で、 実行可能であるかの設定や、アドレスの予約のみ行って初回アクセス時の ページフォルトを利用して物理メモリを割り当てる設定、といった具合です。 #ローダー等では区別がありますが、それはちょっと別の話です。 Linuxでは大きく分けて、カーネル空間用、ユーザープロセス空間用、 バッファ/キャッシュの割り当てで区別されているくらいでしょうか? |
|
投稿日時: 2006-02-08 01:08
返信確認しないで送信しちゃいました。
free領域とは「全く利用されていない電気を食うだけ」なメモリです。 Linuxでは空き領域は積極的にバッファ/キャッシュに利用するので、 多くの場合はfreeが減ってbuffer/cacheが増えているはずです。 他にも、複数のプロセスから共有されていてどのプロセスのものと 考えてていいかわからないものもあります。psコマンドで表示される httpdプロセスの合計が物理メモリ量を超えたりしますよね。 また、明示的に共有メモリを使わなくても、Copy on Writeにより、 fork(2)直後の物理メモリの割り当てを共有してたりもします。 |
|
投稿日時: 2006-02-08 21:33
返信ありがとうございます。
ちなみに、free領域とは「全く利用されていない電気を食うだけ」なメモリとありますが、具体的な理由を教えてください。 よろしくお願いします。 |
|
投稿日時: 2006-02-08 22:29
mm_struct の中にユーザモードスタックのサイズの情報を抱えてるので、
スタックの大きさは分からないでもないです。 ってか、そーゆーことができないと、ulimitとか使えないので。 同様に、brkの初期値と現在値も管理されているので、古典的な ヒープなら分からんでもないですが、それを測る意義はかなり疑問。 > ちなみに、free領域とは「全く利用されていない電気を食うだけ」なメモリとありますが、具体的な理由を教えてください。 文字通り、freeだから使われてません。 OSが使っていようといまいと普通はハードウェアの知ったことでは ないので、DRAMならリフレッシュされるから電気を食うですな。 |
|
投稿日時: 2006-02-09 21:32
Linuxではfree領域、buffer/cache領域の合計を空きメモリと見ていいと思います。
swapもメモリ確保の状況によって多少(数MB程度)使われることもありますが、 居座るってことは使われていない領域なわけで、気にする必要はありません。 buffer/cache領域が確保できなければI/O性能が劣化するのでそれなりに 必要ではありますが、free/buffer/cacheの合計が十分あれば問題ないです。 |