管理私人堆

时间:2012-11-29 12:06:02

标签: c linux heap heap-memory

我在某些项目中看到(基本上是C / C ++中的许多嵌入式应用程序),它们管理动态分配如下

  • 在初始化期间(根据需要)获取大量内存。此区域被指定为该应用程序的堆。
  • 跨不同例程的所有动态分配都是通过专为分配和维护(跟踪和调试分配)而设计的包装器在此内存中进行的。

问题:

Q1:上述具有私有堆管理设计的优点。

Q2:C,Linux API中是否有内置函数提供接口以在先前分配的块中进行动态分配。我搜遍了它,但无法抓住它

问题3:如果Q2中提到的选项不可用。关于第二季度提到的目标如何实现的任何想法。

2 个答案:

答案 0 :(得分:2)

Q1:

  1. 性能 - 在分配堆之后(通常在初始化期间完成),所有未来的分配都非常快,它主要只是堆内的一些指针算法。
  2. 碎片 - 单个大内存块分配可防止因多个allocs / dealloc而导致的内存碎片。
  3. 控制 - 拥有所有可用内存使系统更加健壮。这在分配失败不可接受的情况下非常重要。
  4. 预分配内存与后备列表的概念密切相关。

    Q2:

    我不知道C中的这种API,但在C ++中,实际上有内置的运算符可以帮助实现 - 请参阅Placement new。 这样的实用程序也应该很容易在C中实现。

    Q3:

    例如(非常高级):

    1. 分配内存。
    2. 在内存中创建一个可用空间块的堆结构(最初它将包含一个代表整个内存的块)。
    3. 创建占用内存块的堆结构(最初它将为空)。
    4. 在分配时 - 遍历堆并找到适当大小的块;将其从堆中删除并使用新数据填充。计算块中的剩余内存并将其重新插入堆中。被占用的块插入到被占用的块堆中。
    5. 在释放时 - 从占用的块堆中删除块并将其插入到空闲内存堆中。

答案 1 :(得分:1)

正如您所说基本上C / C ++中的许多嵌入式应用程序使用不同的方法来获取您定义的动态内存。

我认为基本上可以获得更少的内存和为了正确使用。

如果您试图了解malloc()或calloc()函数如何在c中运行以进行动态内存分配,那么您肯定会得到答案。我可以解释一下...  它(malloc)真正做的是维护一个可用内存的链表。但最初,空闲列表是空的。当调用第一个malloc()时,我们调用sbrk()来获取空闲列表的新内存块。这个内存被拆分,以便一些返回给用户,其余的返回到空闲列表。将有一个全局变量malloc_head,它是空闲列表的头部。当调用malloc()时,它会在其列表中查找足够大的内存。如果找到一个,则从链表中删除该内存并将其返回给用户。调用free()时,内存将放回链接列表中。现在,为了提高效率,如果空闲列表中有大量内存比请求的大得多,那么它会将该块分成两个块 - 一个是请求的大小(填充为多个8),其余部分。剩余部分放在空闲列表中,请求的大小返回给用户。

有关详细信息,请尝试参考http://web.eecs.utk.edu/~huangj/cs360/360/notes/Malloc2/lecture.html http://web.eecs.utk.edu/~huangj/cs360/360/notes/Malloc1/lecture.html

问题1 - > 现在,对于您的第一个问题,优势可能是节省内存和以更有效的方式分配,这取决于正在实施其方式的项目。

question2-> 我没有在c中看到任何内置库或API。

question3-> 用于自己的API的实现你需要参考给定的链接& R& K本书为C.本书详细解释了这一点。