實現malloc-free,用來管理64k的記憶體。這是一道面試題,也是一道很好的設計題
1.malloc(size_t size), free(void *p)是使用者api, 釋放的時候需要知道釋放空間的大小,並且需要放入到乙個空閒鍊錶裡面去,可以這樣設計
typedef struct itemmn;
}__attribute__ ((packed)) item;
2.採用union,如果分配給使用者,則為可以使用記憶體,加入到空閒鍊錶,則為鍊錶指標。這裡的指標大小為4個位元組,因此分配給使用者的最小長度為4位元組,如果使用者申請的長度小於4個位元組,應該分配4個位元組。
如果為16位機器,則應該將聯合體改為union mn;
3.為了避免記憶體碎片,這裡需要將釋放的兩個相鄰的區域拼接成乙個較大的空間,設計乙個splice函式。
4.申請,首先找到第乙個比申請記憶體大的空間,然後劃分一部分分配給使用者,劃分函式為cut.
define item_size (sizeof(item) - sizeof(void *))
typedef struct itemmn;
}__attribute__ ((packed)) item;
static item *freelist=null;
void init(void *memory, uint16_t size)
static bool cut(item *it, uint16_t size, item **n)
注意item的定義採用的是聯合union,使用非常方便
static void splice(item *left, item *right)
分配演算法
首先檢視分配的空間是否小於4,如果小於,則修改為4,便利空閒鍊錶,找到地乙個大於申請空間的塊,如果可以cut,就cut一部分,不能cut,就分配當前塊
void * malloc(uint16_t size)
prev = cur;
cur = cur->mn.next;
}
return null;
}
釋放演算法,首先將釋放的位址左移兩個位元組,然後轉換為item結構,遍歷空閒鍊錶,找到地乙個item大於插入item的結構,插入item,並且splice
這裡需要注意的是當空閒隊列為空的情況,或者釋放item的位址最大的情況
void free(void *p)
else
splice(pit, cur);
splice(prev, pit);
return ;
}prev = cur;
cur = cur->mn.next;
}if(prev == null) else
splice(prev, pit);
}
#define k_1 1024
#define k_64 (k_1 * 20)
char memory[k_64];
intmain ( int argc, char *argv )
for(int i = 0; i < len; i++)
len = 0;
for(int i = 1; i < count; i++)
assert(freelist == null);
for(int i = 0; i < len; i = i + 2)
for(int i = 1; i < len; i = i + 2)
assert(freelist->size == k_64 - item_size);
assert(freelist->mn.next == null);
printf("sizeof(item):%d\n", sizeof(item));
return 0;
} /* ---------- end of function main ---------- */
有一種觀點認為:需要設計自己的記憶體分配器,比如stl中的記憶體分配,memcached中的slab分配,leveldb中memtable中記憶體分配
一種觀點認為作業系統中記憶體管理已經設計的夠好了,不需要設計自己的記憶體分配器
轉)90後絕對不是用來管的
其中不錯的段子 這種心態和抑鬱症關聯很深。美國心理學家馬丁 塞利格曼,早在1967年研究抑鬱症時,就創造出 習得性無助 這個術語。塞利格曼和其他一些研究人員發現,習得性無助和臨床抑鬱症之間有著很強的聯絡。其實,習得性無助和消極怠工之間也有著同樣強大的聯絡。這就是很多人都不再努力讓事情變得更好的原因。...
malloc free函式的簡單實現及思考
malloc free函式的簡單實現及思考 用於記憶體管理的malloc free這對函式,對於使用c語言的程式設計師應該很熟悉。前段時間聽說有的it公司以 實現乙個簡單功能的malloc 作為面試題,正好最近在複習k r,上面有所介紹,因此花了些時間仔細研究了一下。畢竟把題目做出來是次要的,了解實...
malloc free函式的簡單實現及思考
用於記憶體管理的malloc free這對函式,對於使用c語言的程式設計師應該很熟悉。前段時間聽說有的it公司以 實現乙個簡單功能的malloc 作為面試題,正好最近在複習k r,上面有所介紹,因此花了些時間仔細研究了一下。畢竟把題目做出來是次要的,了解實現思想 提公升技術才是主要的。本文主要是對m...