假设我正在32位CPU和足够的内存上运行一段代码。进程使用mmap
将总共2.8GB的文件映射到其地址空间。然后,该过程尝试使用malloc
分配500MB内存。由于没有足够的地址空间,分配必定会失败并返回NULL
。即使系统可能有足够的可分配内存。
代码看起来像这样:
int main()
{
int fd = open("some_2.8GB file",...);
void* file_ptr = mmap(..., fd, ...);
void* ptr = malloc(500*1024*1024);
// malloc will fail because on 32bit Linux, a process can only have 3GB of address space
assert(ptr == NULL);
if(out_of_address_space())
printf("You ran out of address space, but system still have free memory\n");
else
printf("Out of memory\n");
}
我如何检测到故障是由于地址空间不足而不是可分配内存造成的? out_of_address_space
可以实现吗?
并且一个进程使用mmap将总共2.8GB的文件映射到其地址空间。然后,该过程尝试使用malloc分配500MB内存。
不要一次mmap(2)整个文件。 mmap
不得超过1 GB。