2

如果我使用 分配一些页面,而不提供mmap(2)地址提示,然后使用malloc(3)/分配一些内存calloc(3),是否有可能以重叠到我之前调用或返回的地址的方式malloc调用和增长堆返回一个远离堆或栈的地址?sbrk(2)mmapmmap

4

2 回答 2

2

不,没有发生冲突的风险,在中没有,也可能在任何使用分页的实现中都没有——而且我怀疑mmap()没有分页的系统会存在。我现在不能告诉你(因为我只是不知道)mmap()使用哪些虚拟地址:可能确实离堆足够远。对于物理内存:sbrk()迟早会引发页面错误,当然,您的操作系统会注意映射您使用的页面。mmap()无论如何都可以在整个页面上工作...

编辑正如罗德里戈正确指出的那样,无论如何都会使用请求。因此,对于使用 服务的小请求,您不必期待太多的页面错误。malloc()mmap()sbrk()

于 2015-08-06T17:47:01.247 回答
1

不,你不会有重叠。

这并不意味着它们会很远,它们可能就在彼此旁边。但是,如果您尊重分配内存的限制,一切都会好起来的。

请注意,glib 的实现malloc()将使用匿名mmap()调用来满足对大块内存的请求。

于 2015-08-06T17:45:15.483 回答