如何在Linux上的C语言中区分内存不足和地址空间不足?

问题描述 投票:0回答:1

假设我正在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可以实现吗?

c memory-management dynamic-memory-allocation 32-bit virtual-address-space
1个回答
0
投票

并且一个进程使用mmap将总共2.8GB的文件映射到其地址空间。然后,该过程尝试使用malloc分配500MB内存。

不要一次mmap(2)整个文件。 mmap不得超过1 GB。

© www.soinside.com 2019 - 2024. All rights reserved.