我即将在C中教授计算机科学入门课程,我想向学生们展示他们为什么要检查malloc()是否返回NULL。我的计划是使用ulimit
限制可用内存量,以便我可以使用不同的限制执行不同的代码路径。我们规定的环境是CentOS 6.5。
我的第一次尝试使这件事发生失败,并且外壳显示“被杀”。这导致我发现了Linux OOM杀手。从那时起我就试图找出一系列神奇的咒语,这些咒语将导致我正在寻找的结果。显然我需要捣乱:
/etc/sysctl.conf
ulimit -m
ulimit -v
vm.overcommit_memory
(根据Oracle文章显然应该设置为2)到目前为止,我得到“被杀”或分段错误,这两者都不是预期的结果。我被vm_overcommit_memory = 2“杀死”的事实意味着我肯定不明白发生了什么。
如果有人能找到一种人工可靠地在CentOS上创建约束执行环境的方法,以便学生学习如何处理OOM(和其他?)类错误,那么很多课程教师会感谢你。
答案 0 :(得分:1)
可以[有效]关闭来自内核> = 2.5.30的过度使用。
//在此处保存您的工作并记下您当前的overcommit_ratio值
# echo 2 > overcommit_memory
# echo 1 > overcommit_ratio
这会将VM_OVERCOMMIT_MEMORY
设置为2,表示不会过度使用overcommit_ratio,设置为1(即不会过度使用)
Null malloc demo
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
void *page = 0; int index;
void *pages[256];
index = 0;
while(1)
{
page = malloc(1073741824); //1GB
if(!page)break;
pages[index] = page;
++index;
if(index >= 256)break;
}
if(index >= 256)
{
printf("allocated 256 pages\n");
}
else
{
printf("memory failed at %d\n",index);
}
while(index > 0)
{
--index;
free(pages[index]);
}
return 0;
}
<强>输出强>
$ cat /proc/sys/vm/overcommit_memory
0
$ cat /proc/sys/vm/overcommit_ratio
50
$ ./code/stackoverflow/test-memory
allocated 256 pages
$ su
# echo 2 > /proc/sys/vm/overcommit_memory
# echo 1 > /proc/sys/vm/overcommit_ratio
# exit
exit
$ cat /proc/sys/vm/overcommit_memory
2
$ cat /proc/sys/vm/overcommit_ratio
1
$ ./code/stackoverflow/test-memory
memory failed at 0
请记住将overcommit_memory恢复为0,并将overcommit_ratio恢复为