2009-10-27 31 views
1

我有一些麻煩,實現我自己的動態內存分配使用隱式列表來追蹤在C空閒塊。 ****特別是我在與實施realloc的改變從發現-FIT /最先匹配到下一個合適的代碼問題。最合適的將是理想的,但讓我們現在就說下一個適合。我已經得到的一切其他事情了,它只是對這兩個項目的具體...有問題,寫我自己的malloc,free和realloc

的詳細信息...

我試圖實現自己的動態內存分配的版本,用我自己的版本malloc,免費10 realloc ...有四種方法用於跟蹤動態內存分配器中的空閒塊,這裏第一個是隱式列表,它使用一個頭。對於隱式列表中找到一個空閒塊有可以在隱式列表中頒佈了若干放置策略。其中第一個稱爲第一個適合或找到適合,它位於下面的代碼中......它從頭搜索列表,並選擇適合的第一個空閒塊。接下來的方法被稱爲這我無法嘗試執行下一個合適的,而這種方法類似於首次適應,但不是開始在列表的開頭每個搜索,它開始每個在以前的搜索不放過搜索。最後是最佳擬合...這將是我理想的方法,但我知道這是相當複雜和相當困難的,所以我會就在旁邊配合,但是,如果有一個人在那裏誰知道如何實現最佳匹配在一個隱含的列表請隨時發佈。最適合檢查每個免費塊,並選擇適合的最小尺寸的免費塊...我知道,對於最佳擬合,可以消除分配塊中的頁腳...主要是因爲它們實際上不是必需的......我「M只是不完全知道如何做到這一點...

我明白這是一個很大的代碼,但我只想把一切都放在一下子所以沒有東西遺漏。

我留下空間,realloc的返回NULL,是在代碼的中間,find_適應,我想改變的next_fit放置策略的方法是朝下方某處...

任何幫助將是非常感謝...謝謝。

的代碼都在這個網站...對不起...我在這裏張貼的代碼中的許多問題......更是這樣,因爲它是如此之大......我只是用谷歌這樣看起來更真實...

DMA CODE

我已經清楚地標記的部分在網站上的代碼,所以應該沒有問題找到的realloc和找到合適的方法...

+2

這是作業,或者你不應該*寫*自己的malloc :-)你可能永遠不會匹配現有的表現。這是什麼? – paxdiablo 2009-10-27 08:22:12

+0

哈...沒有它的絕對不是功課...我已經完成了一個looong時間的學校...但感謝你的想法是...我現在感覺很多年輕:) – jingojango 2009-10-27 08:27:25

+1

@ paxdiablo:你如果出於好奇,做自我教育或作爲一種愛好而做類似的事情的人數會驚人。我寫了一個C庫。有很多喜歡它,但這是我的。 ;-) – DevSolar 2009-10-27 09:27:52

回答

1

的幼稚方式解決realloc將是有realloc調用你malloc函數,只是複製數據,但我想你正在尋找一個更復雜的解決方案?

+0

除了檢查當前內存節點是否已經足夠大以滿足請求之外,沒有什麼可做的「更復雜」了。如果realloc()調用* reduction *的大小(爲保存的複製操作交易內存浪費),您也可以選擇不釋放當前節點。 – DevSolar 2009-10-27 14:09:19

+0

只要將最右側分配的塊重新分配到更大的大小,您也可以始終擴展堆。您將在空間利用率上付出一些代價,但吞吐量會增加。 – 2011-04-13 06:31:20

1

own code其它方案相比,只是一個權宜實現ATM,效率不是很高(dlmalloc()等)。

這是一個精確擬合的第一個擬合算法,但它應該是微不足道的,以延長第63至71行中的「記住第一個適合的情況,以防止您沒有精確匹配」部分來處理最佳-fit:

檢查當前節點的大小,如果它小於目前記住的大小,但仍然足夠大以滿足請求,請記住當前節點而不是迄今爲止記住的節點。

該代碼是根據公共領域的許可證,即你可以使用它,但你喜歡。

+0

謝謝,我一定會看看它。 :) – jingojango 2009-10-27 14:26:07

1

最適合不是很適合很多目的,但如果你真的想要它,它很容易實現。當您將塊添加到您的空閒列表時,請按順序插入它們,按大小排序。然後,當試圖分配一個塊時,首次合適的搜索也會給出最佳擬合。

0

如果你不做功課,爲什麼不使用valgrind來調試內存問題?或者,如果您需要malloc的更特殊版本,爲什麼不以Dave Hanson's debugging version of malloc開頭?

如果你正在做功課,你爲什麼不告訴我們?

+0

哈哈...在網站上問了很多關於hw的問題嗎?...對不起,但我已經失學一段時間了......你其實是第二個讓我感覺更年輕的人​​......謝謝。 – jingojango 2009-10-28 06:12:22