我正在linux中开发一个非抢占式多线程库(在C中)。要求是使用getcontext
setcontext
等来创建新线程并对其进行管理。图书馆正常工作正常情况。
我为每个线程对象(MyThread)使用malloc,如果malloc返回"malloc failed"
,则通过打印消息NULL
来优雅地退出。为了测试极端条件,我运行了一个递归的fibonacci函数,它创建了子线程计算子计算。我运行fib
的数字越来越多,达到fib 26
的限制。
但malloc并没有抱怨。这是linux系统到达OOM
并杀死进程。
问题:当系统发现自己没有空间时,为什么malloc
会返回成功(新指针)?
答案 0 :(得分:5)
引用can i rely on malloc returning null / linux manuals
默认情况下,Linux遵循乐观的内存分配策略。这意味着当malloc()返回非NULL时,无法保证内存确实可用。这是一个非常糟糕的错误。如果事实证明系统内存不足,臭名昭着的OOM杀手就会杀死一个或多个进程。如果在不太可能突然丢失一些随机选择的进程的情况下使用Linux,而且内核版本足够新,可以使用如下命令关闭这种过度使用的行为: echo 2>的/ proc / SYS / VM / overcommit_memory