我有一块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
假设我已经使用了几乎所有的内存,只剩下9MB。
free
total used free shared buffers cached
Mem: 48072 42276 5796 0 172 3264
-/+ buffers/cache: 38840 9232
Swap: 0 0 0
现在,当我尝试以默认堆栈大小(8 MB)启动单个线程时,pthread_create会因为ENOMEM失败。如果我使用strace对我的测试代码进行跟踪,我可以看到失败的函数是mmap:
old_mmap(NULL, 8388608, PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory)
然而,当我使用ulimit -s将堆栈大小设置为较低的值时:
ulimit -s 7500
我现在可以启动10个线程。每个线程都不分配任何内容,因此仅消耗最小的开销(大约每个线程8kb,对吗?)。
所以,我的问题是:
已知mmap实际上不会占用内存,为什么当可用内存低于线程堆栈大小时pthread_create()(或mmap)会失败?
vm/overcommit
的值为零,但我认为它与此有些相关。 - Ezequiel Garcia