是这种线性始终保持,或者例如,一个mmap调用可以分配与数据段重叠的内存?
观察到的行为是brk区域总是线性的。实现细节:如果扩大brk区域是不可能的,例如由于阻塞映射,glibc将切换到mmap-only。小分配(< 128KB)似乎是由glibc的通过BRK如果有可能获得,所以阻断有:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
int main(void)
{
int i;
for (i = 0; i < 1024; ++i) {
malloc(2048);
if (i == 512) {
void *r, *end = sbrk(0);
r = mmap(end, 4096, PROT_NONE,
MAP_PRIVATE|MAP_ANONYMOUS, 0, 0);
}
}
}
straced时,收益率确实
[...]
brk(0x1e7d000) = 0x1e7d000
mmap(0x1e7d000, 4096, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, 0, 0) = 0x1e7d000
brk(0x1e9e000) = 0x1e7d000 <-- (!)
mmap(NULL, 1048576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbfd9bc9000
只是要清楚,当你说*线性*,你的意思是*连续性*? – NPE 2012-02-20 18:35:11
是的线性我的意思是连续性。 – MetallicPriest 2012-02-20 18:36:41