mmap(2)返回的地址是否有可能与堆冲突?

时间:2015-08-06 17:39:17

标签: c linux memory-management mmap sbrk

如果我使用mmap(2)分配一些页面,而不提供地址提示,然后使用malloc(3) / calloc(3)分配一些内存,malloc是否有可能调用sbrk(2)并以一种重叠方式扩展堆,这种方式重叠在我之前调用mmap返回的地址上,或mmap始终保证返回远离堆或堆栈的地址?

2 个答案:

答案 0 :(得分:2)

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

修改rodrigo正确指出,<{1>}的请求仍然使用malloc()投放。因此,对于使用mmap()投放的小型请求,您不必期望太多许多网页故障。

答案 1 :(得分:1)

不,你不会有重叠。

这并不意味着他们会很远,他们可能只是在另一个旁边。但如果你尊重分配内存的限制,一切都会好的。

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