我有一个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)在可用内存低于线程堆栈大小时失败?
VM设置/proc/sys/vm/overcommit_memory(aka.sysctl vm.overcommit_memory)控制Linux是否愿意分发比机器的组合RAM +交换更多的地址空间.(当然,如果你真的尝试访问那么多内存,就会崩溃.尝试搜索"linux oom-killer"......)
此设置的默认值为0.我将推测有人将其设置为您系统上的其他内容.
| 归档时间: |
|
| 查看次数: |
2135 次 |
| 最近记录: |