2012-12-25 78 views
3

因此,作爲操作系統課程的一部分,我實現了一個內存分配器(就像C中的malloc一樣)。可用空間存儲在鏈接列表中。內存碎片測試

我在接下來的問題:我將如何去測試各種分配策略(例如,首次擬合,最佳擬合和最差擬合)。現在我只是迭代預定義的次數,每次分配一個大小爲1-N字節的塊,其中N大約是20000.基本上,我分配了一些迭代,然後通過釋放一些分配來切換它塊。在退出之前,我檢查freelist並計算外部碎片。我不確定這是否是要走的路,或者是否有更好的應對措施?

爲每個策略選擇隨機塊大小的一個問題是,如果分配的塊大小不同,則無法真正地比較它們,對嗎?因此,替代方案將執行相同的測試,只是現在我使用相同的分配大小並在測試每個策略時釋放相同的塊。

希望這不是混亂的:)

+0

如果您的分配器的空閒()合併相鄰的塊,則碎片的數量將等於freelist(加號或減號) – wildplasser

+0

@wildplasser上的項目數。感謝您的回覆:)我知道這:)實際上我已經有一個計算外部碎片的工作實現。我更感興趣的是知道用於測試不同策略的應用是否足夠,或者有更好的方法來做到這一點? –

+0

也許最有用的測量方法是計算正在使用的實際頁面的數量,以及有效頁面的數量,以及它們的比例。另一種措施可能是虛擬地址的有效與實際範圍(最大(地址) - 最小(地址)),地址空間也是一種有價值的資源。 – wildplasser

回答

0

這裏只是一個想法:你可以從實際運行的系統中進行數據採樣,然後使用它作爲您的測試數據。然後您的測試人員只需要讀取記錄數據的日誌文件,然後向分配器重放相同的alloc(),free()調用。要在實踐中實現,這可能會非常棘手,但在Linux上用glibc,他們有一個正式的方式來定製掛鉤增加的malloc,realloc的和自由:

http://www.gnu.org/software/libc/manual/html_node/Hooks-for-Malloc.html

所以基本上我想你可以建立一個修改的glibc使用通過malloc(),realloc()和free()調用記錄每個分配請求的鉤子。使用啓用日誌的glibc運行一些典型的程序,並對這些程序做一些典型的事情。試着讓它具有代表性 - 比如運行Apache,如果你正在專門測試Web服務器的使用情況等。生成的日誌應該是對系統「真實」分配行爲的合理模擬。爲了使測試更準確,您應該重複與其他系統或其他場景等的日誌記錄過程,以使您的抽樣更具代表性,並且不易受到「漏洞」的影響。一個好的分配器應該在儘可能多的真實現場測試中最大限度地提高性能,而不是有時做得很好,而且在其他時候表現很糟糕。

對於像Glibc一樣從Linux重建軟件包,很好的資源是來自Scratch項目的Linux,http://www.linuxfromscratch.org/