2012-04-04 92 views
0

我正在写我自己的内存分配器。如果我的概念是正确的,那么内核的地址空间从零到1 GB,用户空间从1到4,包含不同的部分,如代码,堆栈,数据,堆和其他部分。堆大小和位置

  1. 是不是在程序执行过程中堆段的大小和位置不能改变?
  2. 我该如何获得大小和位置?
  3. 在获得堆区域之后,我需要做的就是根据自己的判断分配内存,不是吗?
+0

您在什么级别分配内存?如果您正在编写自己的'malloc()'版本作为练习,那么当程序启动时,您可能需要调用“real”malloc()'来分配大量内存。这将是您通过分配部分数据并跟踪已使用或仍然可用的区域来管理的“堆”。 – 2012-04-04 23:31:01

回答

2

你为什么要担心这个?

如果您正在编写a-la libc分配器,请使用sbrk和/或mmap从内核中预留内存。无需担心这些系统调用中堆的位置。

如果你想仪器libc的malloc/calloc/realloc,事情更简单 - 只需将它们包装在您的分配器功能。

  1. 是的,分配器通过从内核请求内存来有效地管理堆。通常,与brk的情况一样,它的位置位于数据段结束之后,并且它在增加的地址处增长(或者以mmap等的页面大小的倍数分配)

  2. 分配器管理大小;就分配者而言,堆的位置并不相关,但它处于知道它的位置。

  3. 分配器从内核有效地请求内存。一旦它拥有了这种记忆,它就可以将它分发给它认为合适的节目。

1
  1. 它是限定了堆的分配器。如果你有一个自定义的分配器,并且它确定所有的内存客户都返回了所有的内存,那么删除它的堆或者创建一个新的来提供内存请求是完全有效的。

  2. 由于分配器本身定义堆,它应该知道它的大小和位置。如果你正在谈论的是用你自己的分配器篡夺OS分配器的责任,那么你应该只使用OS分配器来获得一块内存,然后用它作为你自己的分配器的堆。

  3. 同样,一旦你的分配器拥有内存块,它可以根据你的判断使用。你不能简单地把由另一个分配器管理的内存和它的空闲池中的内存使用并且没有严重的潜在后果。