我尝试使用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来调整它.