4

我即将教授一门 C 语言计算机科学入门课程,我想向学生展示为什么他们应该检查 malloc() 是否返回 NULL。我的计划是用来ulimit限制可用内存的数量,以便我可以使用不同的限制来执行不同的代码路径。我们规定的环境是 CentOS 6.5。

我的第一次尝试失败了,外壳显示“Killed”。这让我发现了 Linux OOM 杀手。从那以后,我一直试图找出会导致我正在寻找的结果的魔法咒语。显然我需要搞砸:

  • /etc/sysctl.conf
  • ulimit -m
  • ulimit -v
  • vm.overcommit_memory(根据 Oracle 文章,显然应该设置为 2)

到目前为止,我要么被“杀死”,要么出现分段错误,这两者都不是预期的结果。我被 vm_overcommit_memory=2 “杀死”的事实意味着我绝对不明白发生了什么。

如果有人能找到一种方法,在 CentOS 上人为且可靠地创建一个受约束的执行环境,以便学生学习如何处理 OOM(和其他?)类型的错误,许多课程讲师会感谢你。

4

1 回答 1

1

可以 [有效地] 从内核 >= 2.5.30 关闭过度使用。

以下Linux 内核内存

// 在此处保存您的工作并记下您当前的 overcommit_ratio 值

# echo 2 > overcommit_memory
# echo 1 > overcommit_ratio

这将 设置VM_OVERCOMMIT_MEMORY为 2 表示不过度提交超过 overcommit_ratio,设置为 1(即没有过度提交)

空 malloc 演示

#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 如所述

于 2013-12-22T03:54:37.100 回答