2013-04-02 52 views
1

我在寫內存管理器。我分配一大塊動態內存並將其分割成各種大小的內存池。大小範圍從8到256的8的倍數。當有內存請求時,根據大小,我從一個池中分配一個內存塊。我維護一個映射所需大小和內存池的散列表。
我不想在分配的內存中保留簿記信息,因此我使用每個池的單個鏈表來跟蹤空閒塊。 我的問題是 i)由於塊大小在內存池中的所有塊上是一致的,因此我決定不對塊進行排序。即當有內存請求時,我將分配內存池中的第一個塊,當它被釋放時,我會將它插入空閒列表的前面。這樣,內存分配和釋放都會更快。另外,由於池中的塊大小相同,因此不會發生碎片。你看到這個有什麼問題嗎?內存管理器的數據結構

+0

請問爲什麼它比OS提供的分配方案更好?看起來像一個完全浪費的內存預先分配內存塊,你不知道它們是否將被用於... –

+0

@RafaelDazcal一些應用程序只是做到這一點,因爲操作系統可能不可靠,例如Mozilla Firefox – Kupto

+0

@RafaelDazcal這將比malloc更快 – linuxfreak

回答

1

是的,有一個LIFO棧來容納所有相同大小的未使用的內存塊是最簡單的解決方案。我曾經做過這樣的事情...

我只會給你一個建議。在分配像這樣的內存時,不會發出指向分配區域開頭的指針。哦,另外一個堆棧在哪裏推分配塊是個好主意,所以你知道它們是哪個。

+0

我將存儲指向巨大塊的指針。但爲什麼我應該有另一個堆棧來存儲所有分配的塊?當程序關閉時,我將取消分配整個塊。 – linuxfreak

+0

首先你將有兩個堆棧交換元素(有關分配內存的信息),這比每次釋放一個內存塊時生成新元素要快得多。您也可以考慮使用已使用的元素堆棧。 – Kupto

+0

但是,首先爲使用過的元素建立堆棧有什麼意義? – linuxfreak