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

Is there any chance of an address returned by mmap(2) clashing with the heap?

如果我使用 mmap(2) 分配一些页面而不提供地址提示,然后使用 malloc(3) / calloc(3) 分配一些内存,是否有可能 malloc 调用 sbrk(2) 并以某种方式增大堆,使其与我之前调用 mmap 时重叠的地址 return 或者 mmap 始终保证 return 远离堆或栈的地址?

不,您不会有重叠。

那并不意味着他们会很远,他们可能只是挨着一个。但是,如果您遵守分配内存的限制,一切都会好起来的。

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

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

edit 正如 rodrigo 正确指出的那样,bigmalloc() 的请求使用 mmap() 无论如何。因此,对于使用 sbrk() 服务的小请求,您不必期望 太多 很多页面错误。