メモ:slabとslabtopとmallocとobstackと…

固定長データのalloc/freeを大量に行うことを考える。普通に考えるとmalloc/freeを使うことになるが、別の長さのmalloc/freeが頻繁に乱入してくると、穴がたくさんできてメモリの利用効率が徐々に下がっていく。2GB(あるいは3GBや4GB)の壁を感じるようになると、この効率悪化というのはけっこう大きくなってくる気がする。

Linuxのカーネルには固定長データを効率良くalloc/freeするためにslabというのがある。ちなみに最近はprocpsにslabtopというコマンドが入っていて、観察することができる。おれ的にはiotopが欲しい。できればプロセス毎に出しているI/Oを観察したい。しかしカーネルのバッファを使うI/Oを出す限りはそんな情報は取れないはずなんで、ないんだ。vmstatとiostatで我慢している。fstop(dfのtop)と思ったけど、そんなのだったらwatchコマンドで「watch df」で十分だったりするよなぁ。

…そんな余談は置いといて、このslabはユーザレベルのライブラリとかあると使う人がいるかもしれない。

似たような要求に答える可能性がないわけでもないのがobstackだ。これは効率良く、高速に固定長(とも限らないが)データのalloc/freeをするのだが、スタック形式になっており、最後にallocしたものからfreeする必要がある。飛び越えてfreeしようとすると、後ろにあるやつまでまとめてfreeされてしまったような気がする。これだと普通にスタック使ったほうがよくないか?? 処理の流れと独立してスタックにできるというのと、サイズの制限を受けないのがメリットとしてはあると思う。順番が保証されるので穴はできない*はず*だ。実際、スタックって形式はかなり効率が良いんだよね。

それから、知られているのか知られていないのかよくわからないが、gtk系の基本ライブラリ、glibにはgcacheというのがあって、これがけっこう便利そうだったりする。alloc/freeとはちょっと違うけれど。

で、唐突な結論としてはユーザは富豪的に書け、と。オレこれから大きめにmallocして、freeとかしないようにするから! ダメになったらGCのライブラリ使えばいいだけだから! 2GB(3GBや4GB)が壁になるようなら、すぐに64bitのマシンを使って下さい、と。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です