編寫內存分配器
摘要用於C中的內存分配器
內存分配器101-寫一個簡單的內存分配器
void * malloc ( size_t size );
void free ( void * ptr );
Block * merge_blocks ( Block * block );
// the above three will be implemented first later calloc and realloc 定義數據結構:您需要一個數據結構來跟踪每個塊的大小和分配狀態。這可能是一個簡單的結構,具有大小和標誌,指示塊是否免費。
初始化堆:當您的程序啟動時,您需要擱置一大堆內存才能充當您的堆。可以使用mmap()系統調用來完成。
實施malloc() :此功能應找到一個足夠大以滿足請求的自由塊。如果不存在這樣的塊,則應增加堆的大小。一旦找到合適的塊,應將其標記為分配並返回其地址。
實現free() :此功能應將指針用於一個內存塊,將其標記為免費,並有可能減小堆的大小,如果釋放塊在末尾。
實現realloc() :此功能應調整分配的塊大小。這可能涉及找到一個新塊並複制舊數據。
處理碎片:隨著時間的流逝,堆可能會被散佈在整個過程中的自由塊變成碎片。您可能需要實施碎片堆積的策略,例如相鄰的自由區。
在堆分配器的上下文中,“塊”是指堆內的內存塊。這就是為什麼您需要它們以及它們如何工作:
為什麼要阻止? :當您管理內存時,將其分為可管理的塊或“塊”很有幫助。每個塊可以獨立分配和分配。這可以有效地使用內存,因為您可以根據需要分配盡可能多的內存,而無需再分配。
塊結構:每個塊通常包含有關塊的元數據(例如其大小以及它是免費的還是分配的)以及存儲在塊中的實際數據。分配器使用元數據來管理內存。
分配:當您致電malloc()時,分配器會尋找一個足夠大的自由塊,可以容納所需的數據量。如果找到一個,它將標記為分配的塊,並將指針返回到塊的數據部分。
DealLocation :當您致電free()時,分配器將塊標記為免費,使其可用於將來的分配。如果釋放塊位於堆的末端,則分配器還可以減小堆的大小以釋放內存。
分散:隨著時間的流逝,隨著塊的分配和劃分,堆可能會破碎。這意味著將自由記憶分為小的,無連接的塊。這可能使很難找到足夠大的malloc()調用,即使有足夠的總免費內存。為了處理這一點,分配者通常包括邏輯以碎片堆,例如相鄰的自由塊合併。