嵌入式软件开发杂谈: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下最大能创建多少线程?的主要内容,如果未能解决你的问题,请参考以下文章