题目:
int cnt = 0;
while(1) {
++cnt;
ptr = (char *)malloc(1024*1024*128);
if(ptr == NULL) {
printf("%s\n", "is null");
break;
}
}
printf("%d\n", cnt);
这个程序会有怎样的输出呢?
结果在Linux32位机是
is null
3057
为嘛是3057??
因为用户态虚拟内存地址空间是3G。
3057M 大概就是 3G。
可见malloc时是在虚拟地址空间申请的。具体就是处理一下vm_area_struct。
由于代码里并没有对申请的地址进行访问,所以是不会分配物理内存的。
直到对地址进行访问,由于缺页中断才开始处理页表映射,然后分配物理内存。
那么可以分配多少物理内存呢?也就是如果程序是这样的:
int cnt