malloc の旅 (glibc 編)
- http://www.youtube.com/watch?v=0-vWT-t0UHg
- http://www.slideshare.net/kosaki55tea/glibc-malloc
- http://togetter.com/li/574262
すごい分かりやすかった
K&R Malloc (First fit)
- 次の空き領域へのポインタを空き領域の先頭に置いておく
- freeしたあと,した場所へのポインタを先頭にしておくのが重要らしい
- 良い
- コードが簡単
- フラグメンテーションしなければ速い
- 悪い
- フラグメンテーションさえ解決すればよい?
Best fit アロケータ
- アドレス順じゃなくて,サイズ順でソートしてもっとく? → free で併合できない,フラグメンテーションが進む
- 仕方ないので構造体メンバを増やす:サイズを覚える(=今までと同じリスト),前のサイズも覚える(→前に戻れる),サイズ順リストも覚える
- free が O(1) になった(前がわかるから)
- malloc が O(n),ヘッダサイズ大
- ヘッダサイズ:細かいテクで改善してゆく
- アドレスの下3ビットが0になることを利用し,そこにつめる
- malloc:リストを,サイズごとに分けて作っておく
- 512 バイト以下まで全部作る,それから上は指数的にする
- それでも超でかいのは困る
バッファ遅延合体
マルチスレッド
- 簡単な解法:大域的な lock,スレッドごとのヒープ空間
- メインアリーナ:ロックがある
- 2つ目のスレッド,ずっとメインアリーナを使う,でもロック取得に失敗したら自分専用heapをmmapして新しいアリーナ.
- アリーナのリストというのもある.
- 3つ目のスレッド,失敗したらさっきの2つ目のアリーナに移動,それでもかぶったら3つ目に移動
- 必要な分だけアリーナが生成される.終了してしまったスレッドのアリーナを再利用できる.