【问题标题】:Is there any chance of an address returned by mmap(2) clashing with the heap?mmap(2) 返回的地址是否有可能与堆发生冲突?
【发布时间】:2015-08-06 17:39:17
【问题描述】:

如果我使用mmap(2) 分配一些页面,但没有提供地址提示,然后使用malloc(3) / calloc(3) 分配一些内存,那么malloc 是否有可能调用sbrk(2) 并在它与我之前对mmap 的调用返回的地址重叠,还是mmap 总是保证返回远离堆或堆栈的地址?

【问题讨论】:

    标签: c linux memory-management mmap sbrk


    【解决方案1】:

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

    edit 正如rodrigo 正确指出的那样,对malloc() 请求无论如何都是使用mmap() 提供的。因此,对于使用sbrk() 处理的小请求,您不必期望太多 出现很多页面错误。

    【讨论】:

      【解决方案2】:

      不,你不会有重叠。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 2014-04-21
        • 2019-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-21
        相关资源
        最近更新 更多