日期:2014-05-16 浏览次数:20715 次
int bufferlen = 10 << 20; char *buffer = (char*) mmap(NULL, bufferlen, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
mmap仅仅是分配了虚拟内存区域,而没有马上分配物理内存。在初次访问一个虚拟页面时,操作系统才会为其分配一个物理页面。下面代码是往每个虚拟页面写入1个字节,从而导致物理内存分配:
int pagesize = sysconf(_SC_PAGESIZE); for (i = 0; i < bufferlen; i += pagesize) buffer[i] = 1;此时增加了10MB的物理内存:
使用munmap可以解除内存映射从而释放内存,刚才我们分配了10MB虚拟内存,可以全部释放,也可以释放一部分,如下面的代码是释放其中5MB内存:
munmap(buffer, bufferlen / 2);
此时虚拟内存和物理内存都减少了5M:
VmSize: 9432 kBbuffer = (char*) mmap(buffer, bufferlen, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
前两个参数指定虚拟内存区域[buffer, buffer + bufferlen),但这个区域在前面已经分配了,而且没有完全释放(只释放了一半),怎么处理这种情况呢?
如果第4个参数没有MAP_FIXED标志,则mmap自动选择其他可用区域(返回的地址不等于指定的地址);