是這種線性始終保持,或者例如,一個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