c - 管理私有(private)堆

标签 c linux heap-memory

<分区>

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

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

问题:

Q1:上述设计的私有(private)堆管理的优势。

问题 2:C 和 Linux API 中是否有任何内置函数提供接口(interface)以在先前分配的 block 中进行动态分配。我翻遍了,但无法掌握它

Q3:如果Q2提到的选项不可用。关于如何实现 Q2 中提到的目标的任何想法。

最佳答案

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

我认为这基本上是为了减少内存的可用性和正确使用而完成的。

如果您尝试了解 malloc() 或 calloc() 函数如何在 c 中用于动态内存分配,那么您肯定会得到答案。我可以稍微解释一下…… 它(malloc) 真正做的是维护一个空闲内存链表。但最初,空闲链表是空的。当调用第一个 malloc() 时,我们调用 sbrk() 为空闲列表获取新的内存块。这 block 内存被拆分,一部分归还给用户,剩下的又回到空闲链表中。会有一个全局变量malloc_head,它是空闲链表的头部。当调用 malloc() 时,它会在其列表中查找一 block 足够大的内存。如果它找到一个,那么它将从链表中删除该内存并将其返回给用户。当调用 free() 时,内存被放回链表中。现在,为了提高效率,如果空闲列表中有一 block 内存比请求的大得多,那么它将把该 block 分成两个 block ——一个是请求的大小(填充为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-> 现在对于您的第一个问题,优势可能是以更有效的方式节省内存和分配,这取决于正在实现他们的方式的项目。

问题 2-> 我还没有在 c 中看到任何内置库或 API 可以这样做。

问题 3-> 要实现您自己的 API,您需要引用给定的链接和 C 的 R&K 书。这本书解释得更详细。

关于c - 管理私有(private)堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13625474/

相关文章:

java - IBM JRE 1.5 无法使用请求的 1.5G 内存启动

编译器警告在 printf 中混合 long long int 和 int

c - 如何从用户那里获取两个二进制数和运算并给出答案

c - Clang 是否误解了 'const' 指针说明符?

java - "on-heap"和 "off-heap"之间的区别

java - Linux Java应用程序内存泄漏检测

C程序没有进入for循环,而是递增循环索引变量?

c - 编写 Linux shell 时管理标准输出/标准输入

linux - 使用 svn 在 linux 上进行入门实验

python - 如何使用python从远程终端获取结果