我正在编写自己的内存分配器。如果我的想法是正确的,内核的地址空间从 0 到 1-GB,用户空间从 1 到 4,其中包含不同的部分,例如:代码、堆栈、数据、堆等。
- 对不对,在程序执行期间不能改变堆段的大小和位置?
- 我怎样才能得到大小和位置?
- 在获得堆区域后,我需要做的就是根据我的判断分配内存,不是吗?
我正在编写自己的内存分配器。如果我的想法是正确的,内核的地址空间从 0 到 1-GB,用户空间从 1 到 4,其中包含不同的部分,例如:代码、堆栈、数据、堆等。
你为什么担心这个?
如果您正在编写一个分配器 a-la libc,请使用sbrk
和/或mmap
从内核中保留内存。您无需担心没有这些系统调用的堆放置位置。
如果你想检测 libc 的malloc
// calloc
,realloc
事情就更简单了——只需将它们包装在你的分配器函数中。
是的,分配器通过向内核请求内存来有效地管理堆。通常,与 的情况一样brk
,它的位置位于数据段的末尾之后,并且它随着地址的增加而增长(或使用 mmap 以页面大小的倍数分配等)
分配器管理大小;就分配器而言,堆的位置无关紧要,但它处于知道它的位置。
分配器有效地从内核请求内存。一旦拥有该内存,它就可以将其分配给它认为合适的程序。
它是一个定义堆的分配器。如果您有一个自定义分配器,并且它确定所有内存客户端都返回了所有内存,那么删除它的堆或创建一个新的堆来提供内存请求是完全有效的。
由于分配器本身定义了堆,它应该知道它的大小和位置。如果您正在谈论的是用您自己的分配器篡夺操作系统分配器的责任,您应该只通过使用操作系统分配器来获取一块内存然后将其用作您自己的分配器的堆。
同样,一旦您的分配器拥有内存块,您就可以自行决定使用它。您不能简单地获取由另一个分配器管理的内存及其空闲池中的内存并在没有严重潜在后果的情况下使用它。