在 Linux 中,最大线程数定义为 max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
,可通过调用 cat /proc/sys/kernel/threads-max
进行检索。对于我的树莓派 3,这会返回大约 14,000。但是,当我只是使用 pthread_create()
在循环中创建线程时,(都是空的),在得到 ENOMEM (Cannot allocate memory)
之前我只能创建 250 个.
现在我查看了分配给进程或线程的默认堆栈,即 8192k。因此,在大约 250 个线程时,我将使用 2GB 内存。然而,在我看来这也是不成立的,因为调用 free -m
显示我总共有 1GB 内存。
由于我有 1GB 内存,因此我预计最多只能创建 125 个线程,而不是 250 个,也不是 14000 个。
为什么我可以创建 250 个线程?
最佳答案
默认情况下,Linux 会执行内存过量使用。这意味着您可以分配比物理内存更多的匿名可写内存。
您可以使用以下方法关闭内存过量使用:
# sysctl vm.overcommit_memory=2
这将导致某些工作负载失败,而这些工作负载在 vm.overcommit_memory=0
模式下工作得很好。一些详细信息可以在overcommit accounting documentation中找到.
关于linux - 为什么我可以创建比 "free memory"/"thread stack size"更多的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55618096/