如果我使用mmap(2)
分配一些页面,而不提供地址提示,然后使用malloc(3)
/ calloc(3)
分配一些内存,malloc
是否有可能调用sbrk(2)
并以一种重叠方式扩展堆,这种方式重叠在我之前调用mmap
返回的地址上,或mmap
始终保证返回远离堆或堆栈的地址?
答案 0 :(得分:2)
不,没有冲突的风险,不在linux,也可能在使用分页的任何实现中都没有 - 我怀疑在没有分页的系统上会有mmap()
。我现在不能告诉你(因为我只是不知道)哪个虚拟地址mmap()
使用:可能确实离堆很远。对于物理内存:sbrk()
迟早会引发页面错误,当然,您的操作系统会为您映射一个不的页面正在使用。 mmap()
无论如何都适用于整页......
修改,rodrigo正确指出,<{1>}的大请求仍然使用malloc()
投放。因此,对于使用mmap()
投放的小型请求,您不必期望太多许多网页故障。
答案 1 :(得分:1)
不,你不会有重叠。
这并不意味着他们会很远,他们可能只是在另一个旁边。但如果你尊重分配内存的限制,一切都会好的。
请注意malloc()
的glib实现将使用匿名mmap()
调用来满足大块内存的请求。