我将要教授一门使用C语言的计算机科学导论课程,我想向学生展示为什么应该检查malloc()返回的值是否为NULL。我的计划是使用来限制可用内存量,以便我可以使用不同的限制条件测试不同的代码路径。我们规定的环境是CentOS 6.5。
我的第一次尝试失败了,命令行显示“Killed”。这使我发现了Linux OOM killer(内核调度器)。此后,我试图找出可以产生期望结果的一组神奇操作。显然,我需要处理以下内容:
/etc/sysctl.conf ulimit -m ulimit -v vm.overcommit_memory(根据Oracle文章,此值应设置为2)
到目前为止,我要么得到“Killed”,要么得到一个段错误,这两种情况都不是预期的结果。我的vm_overcommit_memory设置为2时会得到“Killed”,这意味着我肯定不理解发生了什么。
如果有人能找到一种人工且可靠地在CentOS上创建有限执行环境的方法,以便学生学习如何处理OOM和其他类型的错误,那么许多课程讲师将感激你。
我的第一次尝试失败了,命令行显示“Killed”。这使我发现了Linux OOM killer(内核调度器)。此后,我试图找出可以产生期望结果的一组神奇操作。显然,我需要处理以下内容:
/etc/sysctl.conf ulimit -m ulimit -v vm.overcommit_memory(根据Oracle文章,此值应设置为2)
到目前为止,我要么得到“Killed”,要么得到一个段错误,这两种情况都不是预期的结果。我的vm_overcommit_memory设置为2时会得到“Killed”,这意味着我肯定不理解发生了什么。
如果有人能找到一种人工且可靠地在CentOS上创建有限执行环境的方法,以便学生学习如何处理OOM和其他类型的错误,那么许多课程讲师将感激你。
void *mymalloc(size_t n) { return rand() % 3 ? malloc(n) : NULL; }
的意思是定义了一个名为mymalloc
的函数,它接受一个大小为n
的参数,并随机返回malloc(n)
或NULL
。而#define malloc mymalloc
的作用是将标准库函数malloc
替换成上述自定义的mymalloc
函数。 - user529758/etc/security/limits.conf
中设置hard
限制吗? - Elliott Frischmalloc()
几乎不会失败。几乎所有现代操作系统都会过度承诺内存,这意味着它们使malloc()
返回一个非空指针,即使没有足够的内存,并且只有在那个指针被解除引用时才实际分配基础内存块。如果在此时分配失败,则会收到段错误或类似的错误提示。) - user529758limits.conf
,但一些快速搜索似乎暗示它实际上是一个ulimit
,而这似乎并没有起作用。最理想的解决方案是我可以实时更改而不必以不同用户身份登录。 - Jason Foster