- 基本的な部分
- ヒープとして渡されるポインタはヘッダー情報を保持していない(ある意味当たり前)
- ファイナライザはオブジェクト(ここではポインタ)に持たせず別に管理している(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