加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:26:57 所属栏目:百科 来源:网络整理
导读:我尝试使用mmap()来操作虚拟内存.我想保留并提交一个内存区域.我测试了这段代码: const unsigned long gygabyte = 1024 * 1024 * 1024;const unsigned long gygabyteCount = 2;const unsigned long maxCapacity = gygabyteCount * gygabyte;int main(){ cha
我尝试使用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来调整它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读