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来调整它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |