c – 为什么调用大尺寸的mmap()不会失败?

前端之家收集整理的这篇文章主要介绍了c – 为什么调用大尺寸的mmap()不会失败?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我尝试使用mmap()来操作虚拟内存.我想保留并提交一个内存区域.我测试了这段代码
const unsigned long gygabyte = 1024 * 1024 * 1024;
const unsigned long gygabyteCount = 2;
const unsigned long maxCapacity = gygabyteCount * gygabyte;

int main()
{
    char* pMemory;

    pMemory = (char*)mmap(NULL,maxCapacity,PROT_NONE,MAP_PRIVATE | MAP_ANONYMOUS,-1,0);
    if ( mprotect(pMemory,PROT_READ | PROT_WRITE) != 0 )
    {
        cout << "Memory Allocation has Failed" << endl;
    }
    usleep(-1);

    return 0;
}

我从一个终端运行了我的程序的几个副本(比如说6个).我没有看到任何一个“内存分配失败”.我正在运行64位Ubuntu,内存为4GB.谁能跟我说点什么呢?

解决方法

mmap保留进程虚拟地址空间的一个区域,但不会立即为其分配物理RAM.因此,在64位平台上,您可以保留大量而不会失败(尽管您仍需要检查失败;您的示例代码没有). RAM的物理页面稍后在访问存储器时分配.

mprotect只是改变了保留存储器的读/写访问权限;它也不会使它驻留在RAM中.通过传递PROT_READ |可以获得相同的效果PROT_WRITE而不是PROT_NONE到mmap,并删除对mprotect的调用.

如果您需要将内存直接驻留在RAM中,那么请使用mlock.如果没有足够的RAM,它将失败.在许多Linux平台(包括Ubuntu)上,有一个资源限制(RLIMIT_MEMLOCK),它限制了任何进程可以锁定的内存量;你可以用ulimit -l来调整它.

猜你在找的C&C++相关文章