- 基本的な部分
- ヒープとして渡されるポインタはヘッダー情報を保持していない(ある意味当たり前)
- ファイナライザはオブジェクト(ここではポインタ)に持たせず別に管理している(finalizable_objectを格納するハッシュテーブル)
- ヒープ内部はOSのページブロック(基本4KB)ごとに分けられている(ちと不安)
- 曖昧な理解の部分
- GCのヒープはGC_arraysという構造体で一括管理してるっぽい。
- top_indexとかbottom_indexとか2KBくらいの配列を確保してるけど、この中に実際のヒープのヘッダーが入ってるっぽい。
あ、でも
struct hblkhdr { struct hblk *hb_next; struct hblk *hb_prev; struct hblk *hb_block; /* 以下略 */ }; struct hblk { char hb_body[HBLKSIZE]; }; /* HBLKSIZEは基本4KB */なんてなってるから、ヘッダーにメタ情報を持たせて(使える領域とか、どんなオブジェクト用かとか、残りブロックサイズとか)、ページブロック以下のサイズのオブジェクトに対してはhb_blockからみ使用部分を割り当てるなんて方法なのかも。
可変構造体にしないのは、最大限にヒープを使うためなのか、可搬性のためなのかどっちなんだろう?
No comments:
Post a Comment