[FrontPage] | 更新履歴 - サイトマップ - "MemoryAllocate" 配下のコンテンツ - 過去を発掘 | [Snap.Shot] |
MemoryAllocate |
つい最近どこぞの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