通过mmap分配的内存是否可以与数据段重叠

通过mmap分配的内存是否可以与数据段重叠,第1张

概述malloc函数使用sbrk和mmap函数.现在sbrk函数增加或减少数据段.所以它线性增长.现在我的问题是,是否始终保持线性,或者例如,mmap调用可以分配与数据段重叠内存?我在谈论在多核系统上运行的多线程程序. This blog讨论了多线程程序sbrk的一些严重缺陷,它指出用sbrk分配的内存可能与mmap同步的内存混合(sbrk堆可能会变得不连续,

malloc函数使用sbrk和mmap函数.现在sbrk函数增加或减少数据段.所以它线性增长.现在我的问题是,是否始终保持线性,或者例如,mmap调用可以分配与数据段重叠的内存?

我在谈论在多核系统上运行的多线程程序. This blog讨论了多线程程序sbrk的一些严重缺陷,它指出用sbrk分配的内存可能与mmap同步的内存混合(sbrk堆可能会变得不连续,因为mmaped区域或共享对象阻碍了堆的增长).最佳答案那篇博文没有看到森林里的树木;只允许malloc实现使用非零参数调用sbrk.更确切地说,如果应用程序代码使用非零参数调用sbrk,那么Unix的大多数malloc实现将停止正常运行(并且我的意思是“您的程序将崩溃”).如果要直接从OS进行大量分配,则必须使用mmap来执行此 *** 作.

(确实,在一个多线程程序中,malloc必须在内部包含一个互斥锁来调用sbrk,但这是一个实现细节.POSIX说malloc是线程安全的,这对应用程序程序员来说很重要.)

除非使用MAP_FIXED,否则mmap不会分配与brk区域重叠的内存.如果您使用MAP_FIXED并且程序爆炸,您可以保留所有部分.

内核试图避免这样做,但正常 *** 作中的mmap可以设想分配靠近brk区域顶部的内存.如果发生这种情况,随后将与mmap区域发生冲突的sbrk调用将失败.它不会分配不连续的内存. malloc的良好实现应该检测到这种情况并开始使用mmap来处理所有事情.我还没有尝试过,但测试程序很容易编写.

总结

以上是内存溢出为你收集整理的通过mmap分配的内存是否可以与数据段重叠全部内容,希望文章能够帮你解决通过mmap分配的内存是否可以与数据段重叠所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1047221.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存