【问题标题】:Data structures for memory manager内存管理器的数据结构
【发布时间】: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


【解决方案1】:

是的,拥有一个 LIFO 堆栈来保存大小相同的未使用内存块是最简单的解决方案。我自己曾经做过一次这样的事情......

我只会给你一个建议。在像这样分配内存时,不要给出指向分配区域开头的指针。哦,最好有另一个堆栈来推送分配的块,这样你就知道它们是什么了。

【讨论】:

  • 我将存储指向大块的指针。但是为什么我应该有另一个堆栈来存储所有分配的块?当程序关闭时,我将取消分配整个块。
  • 首先你将有两个堆栈,它们只是交换元素(包含有关已分配内存的信息),这比每次释放一个内存块时生成新元素要快得多。您还可以考虑将使用的元素堆栈排序。
  • 但是首先为使用过的元素建立一个堆栈有什么意义呢?
  • 好吧,我想它们会被返回一次......所以你知道在哪里可以找到保存它们的数据结构。如果您不打算归还内存,则只需一个变量即可完成所有操作...您还可以保存一些其他信息,例如谁借用了该块等。
  • 哦..那个。我有一种机制可以找到释放的内存应该返回到的数据结构。我会照顾它的。谢谢你的回答。
猜你喜欢
  • 2012-04-22
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多