gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:54:18 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com