Inf*_*ite 4 linux memory-management linux-kernel
我mprotect
经常在我的程序中调用,一段时间后我发现程序失败了.我想这是由于mprotect
电话太多,所以我写了一个测试来验证:
#define pagesize 4096
int main(){
while(1){
buffer = memalign(pagesize, 4 * pagesize);// allocate some buffer
mprotect(buffer, pagesize, PROT_NONE)// make the first page inaccessible
}
}
Run Code Online (Sandbox Code Playgroud)
在大约3万次迭代之后,无论缓冲区的大小如何,mprotect都返回-1.
任何人都可以解释为什么以及如何解决它?我的猜测是mprogtect消耗内核资源,每个进程都有一些约束,但不确定.
显然,有一个内核参数控制一个进程可以拥有的不同映射的数量,可在以下位置获得/proc/sys/vm/max_map_count
.大多数发行版的典型默认映射数为64k - 与mprotect
大约30k次迭代失败一致(每次映射一次memalign
,每次mprotect
正常系统映射另一次映射).增加该限制将允许您分配和保护更多内存区域.
归档时间: |
|
查看次数: |
831 次 |
最近记录: |