【发布时间】:2013-04-02 09:28:14
【问题描述】:
我正在编写一个内存管理器。我分配了一大块动态内存并将其拆分为各种大小的内存池。大小范围从 8 到 256,是 8 的倍数。当内存请求到来时,根据大小,我从其中一个池中分配一个内存块。我维护了一个映射所需大小和内存池的哈希表。
我不想在分配的内存中保留簿记信息,因此我对每个池使用一个单链表来跟踪空闲块。
我的问题是
i) 由于内存池中所有块的块大小是统一的,因此我决定不对这些块进行排序。即当内存请求到来时,我将分配内存池中的第一个块,当它被释放时,我会将它插入到空闲列表的前面。这样,内存分配和释放都会更快。此外,由于池中的块大小相同,因此不会发生碎片。你觉得这有什么问题吗?
【问题讨论】:
-
请问为什么比OS提供的分配方案好?预先分配你不知道它们是否会被使用的内存块似乎是一种严重的内存浪费......
-
@RafaelDazcal 一些应用程序只是这样做,因为操作系统可能不可靠,例如 Mozilla Firefox
-
@RafaelDazcal 这叫做后备列表,在某些情况下非常有用
-
@Kupto 操作系统不可靠?虽然操作系统错误并不少见(我已经看到并提交了一些),但发布的主要操作系统在内存管理器中存在严重错误更像是虚构的。如此广泛使用的组件中的错误通常会在发布前的测试中发现。
-
@AlexeyFrunze +1 是的。这样一个有缺陷的操作系统甚至可能在它启动之前就崩溃了。正如 OP 所建议的,缓冲区容器数组通常用于性能原因。我自己在服务器上也这样做。
标签: c algorithm memory-management data-structures