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

Met*_*est 5 c linux gcc

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

我在谈论在多核系统上运行的多线程程序.此博客谈到的一些严重缺陷sbrk的多线程程序,并指出有可能与分配的内存sbrk可以存储与alloacted间杂mmap(sbrk,因为堆可能变得不连续mmaped区域或一个共享对象阻碍堆的增长).

zwo*_*wol 12

那篇博文没有看到森林里的树木; 只malloc允许实现sbrk使用非零参数调用.更准确地说,malloc如果应用程序代码sbrk使用非零参数调用,那么Unix的大多数实现将停止正常运行(并且我的意思是"您的程序将崩溃").如果要直接从操作系统进行大量分配,则必须使用mmap它.

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

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

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