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所有东西.我还没有尝试过,但测试程序很容易编写.