c - pthread_create 在可用内存不足的情况下因 ENOMEM 而失败

标签 c linux pthreads

我有一 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/

相关文章:

c - 为函数参数指定寄存器?

c - 指针声明等效性

c - 带有 typedef 的结构

python - 从另一个程序中杀死后台程序

Linux 线程性能在 GDB 下非常快,但在其他情况下非常慢

c - linux - 文件系统是否允许产生黑洞?

c - poll() 不阻塞,立即返回

linux - 如何让top在后台运行?它需要运行并记录输出。不死或僵尸了

c - 如何在QNX中找到线程的当前优先级

c - 为什么多线程不能提高该程序中查找素数的性能?