[FrontPage] 更新履歴 - サイトマップ - "MemoryAllocate" 配下のコンテンツ - 過去を発掘 | [Snap.Shot]

to FrontPage MemoryAllocate

(Sun, 05 Mar 2006 16:53:58 GMT+9)

いわゆるmallocの話

つい最近どこぞのMLの話題で読んだのだが(どこかは忘れてしまった)、mallocの実装というのはOSに委ねられているらしく、 多くのOSにおいて、freeされた動的メモリはOSに返される訳ではない のだそうだ。全然知らなかった。

私とおんなしように「えっ」と驚いた人は、ためしにmalloc - free - sleepさせた簡単なCプログラムを書いて実行させ、freeした後のメモリをアプリケーションが保持しているかどうか調べてみるといいらしい(自分はMLのやりとりだけで納得してしまったのでやっていないけど)。たぶん、そのアプリケーションが終了するまでそのメモリは解放されないだろう、とのことである。

んで、なんでOSがそんな「手抜き」をしているのかというと、これはひとえに「パフォーマンスの問題」なのだそうだ。ほとんどすべてのアプリケーションでは、(プログラマが意識しようとしまいとかかわらず)頻繁にmalloc - freeを繰り返している。で、これの使用状態をkernelがすべて面倒みようとすると、かなりのオーバーヘッドになってしまう、ということなのだそうな。うーん。

ちなみにうちの自宅環境で、メモリ喰いの王様といえば、VMware, mozilla, そしてX自身といったところか。VMwareはしょうがないとして(それでもなんとかして欲しいけど)Xをたびたび再起動するのもしゃくだし、mozillaに至っては「一生懸命窓閉じたのに100MB確保とは一体なんじゃ!」と釈然としない。うーん、部品として扱えるモノは、こまごまとプロセス単位でforkして、終わったら落とせということか。

そういう意味ではWindows APIはよく考えてあったと思う。たしかglobal_allocとかいうAPI functionがあって、そのメモリを確保する方法まで指定できたはずだ。オプションの中には「いつでも破棄可能」なステータスを持たせることもできて、ファイルからいつでも再読込可能なデータなんぞはこれをマークしておくと、勝手に破棄してくれるのだ。

もっとも↑の話は、古き良きWindows3.1(Win16)時代の話なので、今のWindowsもそうかどうかは知らないけど。知ってる人はコメントよろしく。

(このへんの知識は未だにあやふやだ。ひょっとすると、さらに恥の上塗りをしているやもしれぬ)

参考:

http://www.geocities.co.jp/SiliconValley-PaloAlto/7276/ITRON/ITRON5.html#20010204

http://member.nifty.ne.jp/maebashi/programmer/c_yota/malloc.html

  HelpPage メールでコメント

© 2000-2013 Yukimasa TAKANO, all RIGHTs reserved.