linux - 为什么我可以创建比 "free memory"/"thread stack size"更多的线程?

标签 linux multithreading pthreads

在 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/

相关文章:

java - 同时从集合中查找并删除元素或等待

java - 如何知道其他线程是否已经完成?

c - 在C程序中跨套接字实现多线程的问题

c - pthread 无法使用 pthread_cond_signal() 和 pthread_cond_wait() 工作

c - 编译相同的源代码如何生成不同的目标文件?

linux - 递归覆盖bash中的rc文件

php - Kubuntu 16.04 - PHP 5.6 - mssql 驱动程序

linux - Bash 用另一个字符串替换空格和字符串结尾

java - 如何杀死当前类创建的所有线程

multithreading - 裸机嵌入式设备上的线程