2013-04-02 36 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