我有一 block 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
假设我已经吃光了几乎所有的内存,只剩下 9 MB。
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 而失败。如果我跟踪我的测试代码,我可以看到失败的函数是 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 个线程。每个线程不分配任何东西,所以它 仅消耗最少的开销(每个线程大约 8 kb,对吧?)。
所以,我的问题是:
知道 mmap 实际上并不消耗内存, 当可用内存低于时,为什么 pthread_create() (或 mmap)失败 线程堆栈大小?
最佳答案
VM 设置 /proc/sys/vm/overcommit_memory
(又名 sysctl vm.overcommit_memory
)控制 Linux 是否愿意分配比组合地址空间更多的地址空间机器的RAM +交换。 (当然,如果您真的尝试访问那么多内存,就会出现崩溃。尝试搜索“linux oom-killer”...)
此设置的默认值为 0。我推测有人将它设置为您系统上的其他设置。
关于c - pthread_create 在可用内存不足的情况下因 ENOMEM 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7167986/