嵌入式软件开发杂谈(1):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级别,太复杂,没做研究。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值