實現malloc free用來管理64k記憶體

2021-06-11 23:17:59 字數 2223 閱讀 4970

實現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...