-2

我要考试了,我们必须学习堆和堆栈。我理解堆栈部分,但堆给我带来了麻烦。

我们的书用 C 语言和汇编语言给了我们。但是我很难理解这两个概念。

我只是把这本书的截图放上去,这样看起来更好看。

问题:

  • Heap_Init 是如何工作的?

  • Heap_Allocate 是如何工作的?

  • Heap_Release 是如何工作的?

在此处输入图像描述

在此处输入图像描述

感谢大家的时间和精力。

4

1 回答 1

2

从这个词的意义上讲,堆是不在堆栈上的内存区域,程序可以使用它来存储大量数据。

但是,在程序的生命周期中,该程序必须跟踪自己的内存使用情况。具体来说,程序不能随心所欲地写入其整个虚拟地址空间;如果它尝试写入的地址未被操作系统映射,则会触发访问冲突,这将导致您的程序收到分段错误并被终止。

因此,正在运行的程序必须要求操作系统分配一些空间。如果可以,操作系统将执行此操作,并将该空间映射到虚拟地址空间。

但是,如果你需要释放一部分内存,你需要知道它在哪里以及你在用它做什么。此外,您需要知道,由于程序给定了特定大小的内存,将其存储在哪里。看,事情很快就变得复杂了——如果你从 C 中分配大量内存,然后频繁地再次释放,那么在分配和释放以及系统调用之间进行 1-1 映射是没有意义的同样的效果。相反,如果内存分配器只是从操作系统中提取一大块内存然后跟踪它会更好。

输入对存储结构的需求,以跟踪哪些分配的空间当前正在使用,以及虚拟地址空间中的哪些范围被标记为使用。

所以,

  • Heap_Init 设置了这个结构,并且可能在任何现代分配器中初始化一些内存。
  • Heap_Allocate 使用此结构并在给定请求时返回指向可用空间的指针。这可能会或可能不会要求程序从操作系统请求更多空间。
  • Heap_Free 使用该结构来释放先前分配的内存。

这就是这些函数将做什么的理论。如果您查看代码,您应该能够弄清楚您的具体实现在做什么。

于 2012-05-06T21:46:09.727 回答