詳細的題目要求和資源可以到 http://csapp.cs.cmu.edu/3e/labs.html 或者 http://www.cs.cmu.edu/~./213/schedule.html 擷取。
在這個實驗中我們需要實作自己的動态記憶體申請器(malloc、free、realloc)
完全閱讀書本第9章
<code>man 3 realloc</code>
1.先從小的測試檔案開始,例如short1-bal.rep
2.為了調試友善,在Makefile中将CFLAGS更改為:
這樣用GDB調試的時候就能看到源碼了
3.位址要對8位元組對齊。
4.注意<code>realloc</code>的實作要和libc一緻。
5.本實驗環境WORD=4=sizeof(void *),DWORD=8(gcc -m32)
對于速度(thru)而言,我們需要關注malloc、free、realloc每次操作的複雜度。對于記憶體使用率(util)而言,我們需要關注internal fragmentation (塊内損失)和 external fragmentation (塊是分散不連續的,無法整體利用),即我們free和malloc的時候要注意整體大塊利用(例如合并free塊、realloc的時候判斷下一個塊是否空閑)。
我這裡實作的是書上9.9.13和9.9.14提到的Explicit Free Lists + Segregated Free Lists + Segregated Fits ,詳細的介紹參考書上寫的。
塊的結構如下,其中低三位由于記憶體對齊的原因總會是0,A代表最低位為1,即該塊已經allocated:

堆的起始和結束結構如下:
Free list的結構如下,每條鍊上的塊按大小由小到大排列,這樣我們用“first hit”政策搜尋連結清單的時候就能獲得“best hit”的性能,例如第一條鍊,A是B的successor,B是A的predecessor,A的大小小于等于B;不同鍊以塊大小區分,依次為{1}{2}{34}{58}...{1025~2048}... :
更新:這裡的箭頭應該是雙向的,畫錯了。
下面是各個子產品的實作,**部分代碼改編自CS:APP3e官網的Code examples 的mm.c(完整代碼),如需使用請聯系Randy Bryant and Dave O'Hallaron ** 。這次注釋用中文寫的,就不另外解釋了。
常數及指針運算的宏定義
全局變量
Helper functions
Helper functions: extend_heap
Helper functions: insert_node
Helper functions: delete_node
Helper functions: coalesce
Helper functions: place
初始化堆 mm_init:
申請塊:mm_malloc:
釋放塊:mm_free:
調整塊:mm_realloc:
最終結果: