为什么我可以创建比“可用内存” /“线程堆栈大小”更多的线程?

时间:2019-04-10 17:16:53

标签: linux multithreading pthreads

在Linux中,最大线程数定义为max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);,可以通过调用cat /proc/sys/kernel/threads-max来获取最大线程数。对于树莓派3,这大约返回14,000。但是,当我仅使用pthread_create()(空)在循环中创建线程时,我只能创建250,然后再获得ENOMEM (Cannot allocate memory)。 >

现在,我查看了分配给进程或线程的默认堆栈,即8192k。因此,大约有250个线程时,我将使用2GB内存。但是,在我看来,这也不是总和,因为调用free -m显示我总共有1GB的内存。

由于我有1GB的内存,所以我希望最多只能创建125个线程,而不是250个线程,而不是14000个线程。

为什么要创建250个线程?

1 个答案:

答案 0 :(得分:2)

默认情况下,Linux执行内存过量使用。这意味着您可以分配比物理内存更多的匿名可写内存。

您可以使用以下方法关闭内存过量使用:

# sysctl vm.overcommit_memory=2

这将导致某些工作负载失败,这些工作负载在vm.overcommit_memory=0模式下可以正常工作。可以在overcommit accounting documentation中找到一些详细信息。