天天看點

CS:APP3e 深入了解計算機系統_3e MallocLab實驗

詳細的題目要求和資源可以到 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:

CS:APP3e 深入了解計算機系統_3e MallocLab實驗

堆的起始和結束結構如下:

CS:APP3e 深入了解計算機系統_3e MallocLab實驗

Free list的結構如下,每條鍊上的塊按大小由小到大排列,這樣我們用“first hit”政策搜尋連結清單的時候就能獲得“best hit”的性能,例如第一條鍊,A是B的successor,B是A的predecessor,A的大小小于等于B;不同鍊以塊大小區分,依次為{1}{2}{34}{58}...{1025~2048}... :

CS:APP3e 深入了解計算機系統_3e MallocLab實驗

更新:這裡的箭頭應該是雙向的,畫錯了。

下面是各個子產品的實作,**部分代碼改編自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:

最終結果:

CS:APP3e 深入了解計算機系統_3e MallocLab實驗