加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

导致malloc()在CentOS上返回NULL

发布时间:2020-12-16 07:07:06 所属栏目:百科 来源:网络整理
导读:我即将在C中教授计算机科学入门课程,我想向学生们展示他们为什么要检查malloc()是否返回NULL.我的计划是使用ulimit来限制可用内存量,以便我可以使用不同的限制执行不同的代码路径.我们规定的环境是CentOS 6.5. 我第一次试图让这件事发生失败,而且贝壳显示出
我即将在C中教授计算机科学入门课程,我想向学生们展示他们为什么要检查malloc()是否返回NULL.我的计划是使用ulimit来限制可用内存量,以便我可以使用不同的限制执行不同的代码路径.我们规定的环境是CentOS 6.5.

我第一次试图让这件事发生失败,而且贝壳显示出“杀死”.这导致我发现了Linux OOM杀手.从那时起我就试图找出一系列神奇的咒语,这些咒语将导致我正在寻找的结果.显然我需要搞砸:

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

到目前为止,我得到“被杀”或分段错误,这两者都不是预期的结果.我被vm_overcommit_memory = 2“杀”的事实意味着我肯定不明白发生了什么.

如果有人能找到一种人工可靠地在CentOS上创建约束执行环境的方法,以便学生学习如何处理OOM(以及其他?)类错误,那么很多课程教师都会感谢你.

解决方法

可以[有效]关闭来自内核> = 2.5.30的过度使用.

在Linux Kernel Memory之后:

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

# echo 2 > overcommit_memory
# echo 1 > overcommit_ratio

这会将VM_OVERCOMMIT_MEMORY设置为2,表示不会过度使用overcommit_ratio,设置为1(即不会过度使用)

Null 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 pagesn");
  }
  else
  {
    printf("memory failed at %dn",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,如上所述

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读