嵌入式软件开发杂谈:Linux下最大能创建多少线程?

Posted Stoneshen1211

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式软件开发杂谈:Linux下最大能创建多少线程?相关的知识,希望对你有一定的参考价值。

文章目录


先上结论:
1 与系统堆栈的限制有关
2 与系统可生成的最大线程数有关
3 与系统进程数目有关
4与进程拥有VMA的数量有关
5 与操作系统有关

1 与系统堆栈的限制有关

在前面我们说过,linux系统为每个程序分配4GB的虚拟内存,其中用户空间的虚拟内存为3GB。

正常情况下,我们使用ulimit -s查看系统的栈限制,默认是8192即8M,那么当我们创建线程的时候,Linux系统会为每个线程分配独立的调用栈,也就是8MB。

由上可知,最大可使用虚拟内存是3GB左右,创建一个线程的虚拟内存消耗是8MB,那么最大可创建的线程数为 3GB / 8MB = 384, 也就是最大能创建384个线程。

但是实际上并不能创建这么多的线程:
1 是3GB的虚拟内存,分为不同的部分,比如0x00000000 ~ 0x08048000的地址为保留区;当程序运行时候,代码段、数据段、BSS段也会被加载进虚拟内存,也会占用一部分虚拟内存。实际上可供使用的堆栈空间远远小于3GB。
2 是我们在线程中的一些操作,比如malloc等,会消耗堆栈空间,导致一个线程的虚拟内存消耗大于创建时候的8MB。

在上面说,ulimit -s默认为8MB大约最大可创建384个线程,也可以修改对栈的限制,来增大或减小创建的线程数目。

2 与系统可生成的最大线程数有关

cat /proc/sys/kernel/threads-max                                             
977

如上,系统允许最大创建的线程数为977,并且977还不是进程能创建的最大值,系统也会创建一些线程,实际的创建数小于这个值。

使用指令

# echo 100 > /proc/sys/kernel/threads-max  

修改为100,实测在我的设备上最大能创建29个线程

使用指令

# echo 128 > /proc/sys/kernel/threads-max 

修改为128,实测在我的设备上最大能创建57个线程

3 与系统进程数目有关

线程ulimit 中的 processes,即使用指令ulimit -u显示的数据为限制的用户最大进程数。

实测,修改后,并没有限制,可能是哪里还没有理通,待修改。。。

4 与进程拥有VMA的数量有关

VMA(虚拟内存区域)是一个连续的虚拟地址空间区域,每当进程分配堆空间或者在内存中映射文件等其它操作时,这个区域就会被创建。

#cat /proc/sys/vm/max_map_count                                                   
65530

在我的设备中,默认是65530。

使用指令:

# echo 100 > /proc/sys/vm/max_map_count

修改为100,实测在我的设备上最大能创建38个线程

使用指令

# echo 120 > /proc/sys/vm/max_map_count

修改为100,实测在我的设备上最大能创建48个线程

5 与操作系统有关

上面我们说的4GB虚拟空间是基于32位操作系统来说的。至于64位操作系统,理论上都是TB级别,太复杂,没做研究。

以上是关于嵌入式软件开发杂谈:Linux下最大能创建多少线程?的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式软件开发杂谈:Linux最大能创建多少文件?

嵌入式软件开发杂谈:Linux最大能创建多少文件?

嵌入式软件开发杂谈:Linux最大能创建多少文件?

Linux性能学习(2.2):内存_进程线程内存分配机制探究

嵌入式软件开发杂谈:Linux下内存与虚拟内存

嵌入式软件开发杂谈:Linux下内存与虚拟内存