內存管理基本技術之:塊頭

內存管理基本技術之:塊頭

版權聲明:
    本文章由vt.buxiu發佈在
www.vtzone.org

@內容摘要:塊頭指用來記錄內存管理相關信息的內存塊,通常位於普通內存塊的頭部和尾部。@
,版權歸vtzone研究小組所有,轉載請保持此聲明!!!

塊頭大多數分配器在每一塊頭保存一些有用信息,更準確的說是保存快的大小。因爲大多數標準分配器<比如CLib>釋放內存時並不要求應用傳遞一個大小信息。







上圖的塊頭的應用是一個最簡單而用常用的用法,假定內存分配器提供兩個函數mymallocmyfree,這兩個函數原形與C標準庫的mallocfree相同:
應用程序每次向分配器請求內存的時候,分配器將一塊內存block返回給應用程序,同時在其頭部維護一個header

 


由於當應用調用free(void* address)時候並未指定釋放的大小,分配器由free指定的地址向前偏移一個header大小就能夠獲取保存在header中的該內存塊的size信息。


 



其他一些信息,比如,塊是否被使用,與相鄰塊之間的關係等也可能保存在頭部。如下圖則是由Knuth提出的邊界標記算法中使用的,該內存塊保存了兩個信息:塊頭和塊尾,而頭合尾分別保存了內存塊的大小和是否被佔用標誌。保存這些塊頭信息是爲了快速的進行分配和釋放操作。







關於上圖的具體應用以及代碼示例請參考<邊界標記>
需要明確的是,頭塊很方便但浪費空間,當小對象請求時表現更加明顯。根據[WJNB95],應用程序請求內存的平均大小爲10Bytes,如果這個假設成立,每個塊頭如果佔用4Bytes,使用一個塊頭的內存管理則造成4/10的內存浪費。當然如果使用的塊頭不是4bytes或者更大浪費則更多。當然10bytes只是一個平均值,對於特定的應用程序,可以評估自己特定應用的平均請求的內存塊的大小而做出抉擇。


作者:[email protected] 

 

複製內容到剪貼板
代碼:

void myfree(void* p)
{
          void* pointer = (char*)p – sizeof(Header);
          return free(pointer);
}

 

複製內容到剪貼板
代碼:

typedef unsigned long Header;
void* mymalloc (size_t size)
{
          void* mem = malloc(size + sizeof(Header));
          *((Header*)mem) = size;
          return (char*)mem + sizeof(Header);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章