在低可用内存情况下,pthread_create因ENOMEM而失败

Eze*_*cia 3 c linux pthreads

我有一个SH4板,这是规格......

uname -a
Linux LINUX7109 2.6.23.17_stm23_A18B-HMP_7109-STSDK #1 PREEMPT Fri Aug 6 16:08:19 ART 2010
sh4 unknown
Run Code Online (Sandbox Code Playgroud)

并且假设我已经吃掉了几乎所有的内存,并且只剩下9 MB.

free
 total       used       free     shared    buffers     cached
Mem:         48072      42276       5796          0        172       3264
-/+ buffers/cache:      38840       9232
Swap:            0          0          0
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试使用默认堆栈大小(8 MB)启动单个线程时,pthread_create会因ENOMEM而失败.如果我测试代码,我可以看到失败的函数是mmap:

old_mmap(NULL, 8388608, PROT_READ|PROT_WRITE|PROT_EXEC,                       
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory)
Run Code Online (Sandbox Code Playgroud)

但是,当我使用ulimit -s将堆栈大小设置为较低值时:

ulimit -s 7500
Run Code Online (Sandbox Code Playgroud)

我现在可以启动10个线程.每个线程都没有分配任何东西,所以它只消耗最小的开销(aprox.每个线程8 kb,对吧?).

所以,我的问题是:

知道mmap实际上没有消耗内存,为什么pthread_create()(或mmap)在可用内存低于线程堆栈大小时失败?

Nem*_*emo 6

VM设置/proc/sys/vm/overcommit_memory(aka.sysctl vm.overcommit_memory)控制Linux是否愿意分发比机器的组合RAM +交换更多的地址空间.(当然,如果你真的尝试访问那么多内存,就会崩溃.尝试搜索"linux oom-killer"......)

此设置的默认值为0.我将推测有人将其设置为您系统上的其他内容.