【发布时间】:2011-02-16 12:45:05
【问题描述】:
linux下:
#free -m 缓存的已用空闲共享缓冲区总数 内存:1995 1460 534 0 68 432 -/+ 缓冲区/缓存:959 1035 交换:2055 743 1311 # cat /proc/sys/vm/overcommit_memory 0 #cat /proc/sys/vm/overcommit_ratio 50测试代码1:
#define PER_PAGE_SIZE 4096
#define MMAP(fd,offset) mmap (NULL,PER_PAGE_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_NORESERVE,fd,offset)
int main(){
int j = 0;
int fd = open("dat.tmp",O_RDWR);
for(int i = 131071 ; i >= 0; i--){
++j;
void* r = MMAP(fd,i*4096);
if(r == MAP_FAILED){
printf("%d,%m\n",j);
break;
}
}
cout << "done " << j << endl;
sleep(5);
}
##############
错误信息 :
# ./a.out
65513,无法分配内存
完成 65513
...
#################
测试代码2:
#define PER_PAGE_SIZE 4096
#define MMAP(fd,offset) mmap (NULL,PER_PAGE_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_NORESERVE,fd,offset)
int main(){
int j = 0;
int fd = open("dat.tmp",O_RDWR);
for(int i = 0 ; i <= 131071; i++){
++j;
void* r = MMAP(fd,i*4096);
if(r == MAP_FAILED){
printf("%d,%m\n",j);
break;
}
}
cout << "done " << j << endl;
sleep(5);
}
这行得通,那么,为什么??????????
【问题讨论】:
-
如果你用“
-
对不起,代码已重新格式化。
-
在两种情况下:循环变量从大到小变化,和从小到大变化,mmap的行为是不同的。当循环变量由大变小并且计数器“j”达到65513时,“mmap”调用失败(不能分配内存),相反它确实有效。
-
我无法重现该问题。
uname -a在您的系统上的输出是什么?