2012-08-10 118 views
3

如何創建一個新的用C語言定義的malloc()函數?實現用戶定義的malloc()函數?

我甚至沒有像如何做到這一點的elflike暗示,如何映射虛擬空間地址與物理空間,遵循什麼算法?我知道malloc()不是很有效,因爲它可能導致碎片。因此可以創建高效的東西。即使效率不高,如何實現一個樸素的C malloc函數?

最近在採訪中被問到。

+0

您將需要操作系統特定的API。除了我想知道爲什麼malloc會效率低下。 – SuperSaiyan 2012-08-10 16:44:06

+0

在K&R的結尾附近有一個相當不錯的實現。 – cnicutar 2012-08-10 16:44:41

+1

我認爲這對於小型分配是低效的 – Gir 2012-08-10 16:44:48

回答

7

維基百科實際上提供的各種malloc實現,包括具體條件優化的人的一個很好的總結,與鏈接瞭解更多關於執行一起。

http://en.wikipedia.org/wiki/C_dynamic_memory_allocation

dlmalloc

通用分配器。 GNU C庫(glibc)使用基於dlmalloc的分配器。

jemalloc

爲了避免鎖爭用,,jemalloc使用爲每個CPU單獨的 「舞臺」。測量多線程應用程序中每秒分配次數的實驗表明,這使得它與線程數成線性關係,而phkmalloc和dlmalloc的性能與線程數成反比。

Hoard memory allocator

囤地使用mmap獨佔,但在64千字節稱爲超級塊的塊管理內存。 Hoard的堆在邏輯上分爲單個全局堆和每個處理器堆。此外,還有一個線程本地緩存,可以容納有限數量的超級塊。通過僅從本地每線程或每處理器堆上的超級塊中分配,並將大部分空的超級塊移動到全局堆以便其他處理器可以重用,Hoard保持低碎片化,同時通過線程數達到接近線性的可伸縮性。

tcmalloc

每個線程都有一個小分配本地存儲。對於大型分配,可以使用mmap或sbrk。 TCMalloc是由Google開發的一個malloc,它爲本地死區線程存儲垃圾回收。 TCMalloc被認爲是多線程程序glibc的ptmalloc的兩倍多。

dmalloc不屬於維基百科

調試內存分配或dmalloc庫已被設計成在更換下降爲系統的malloc,realloc的,釋放calloc,免費,而其他的內存管理同時提供在運行時可配置的強大調試工具。這些設施包括內存泄漏跟蹤,圍欄後寫入檢測,文件/行號報告以及統計信息的一般記錄等。

+0

+1。感謝大家的鏈接:) – SuperSaiyan 2012-08-10 17:00:31

+0

如何選擇適合特定應用程序的內存分配需求的malloc實現會影響性能,這一點令人驚訝。另外,在開發/測試時使用類似* dmalloc *的內容對於發現內存管理錯誤在變成隱患的錯誤之前至關重要。 – 2012-08-10 17:02:53