Redian新闻
>
一个进程最多可以创建多少个线程?

一个进程最多可以创建多少个线程?

公众号新闻

转自:网络

前言

话不多说,先来张脑图~


linux 虚拟内存知识回顾

虚拟内存空间长啥样

在 Linux 操作系统中,虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同位数的系统,地址空间的范围也不同。比如最常见的 32 位和 64 位系统,如下所示:


通过这里可以看出:

  • 32 位系统的内核空间占用 1G,位于最高处,剩下的 3G 是用户空间;

  • 64 位系统的内核空间和用户空间都是 128T,分别占据整个内存空间的最高和最低处,剩下的中间部分是未定义的。

32 位虚拟内存空间


通过这张图你可以看到,用户空间内存,从低到高分别是 6 种不同的内存段:

  • 0x0000 0000 到 0x0804 8000 这段虚拟内存地址是一段不可访问的保留区,因为在大多数操作系统中,数值比较小的地址通常被认为不是一个合法的地址,这块小地址是不允许访问的。比如在 C 语言中我们通常会将一些无效的指针设置为 NULL,指向这块不允许访问的地址。

  • 代码段,包括二进制可执行代码;

  • 数据段,包括已初始化的静态常量和全局变量;

  • BSS 段,包括未初始化的静态变量和全局变量;

  • 堆段,包括动态分配的内存,从低地址开始向上增长;

  • 堆空间的上边是一段待分配区域,用于扩展堆空间的使用

  • 文件映射段,包括动态库、共享内存等,从低地址开始向上增长

  • 栈段,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8 MB。当然系统也提供了参数,以便我们自定义大小;

在上面的内存段中,堆和文件映射段的内存是动态分配的。比如说,使用 C 标准库的 malloc() 或者 mmap() ,就可以分别在堆和文件映射段动态分配内存。

64 位虚拟内存空间

我们知道在 32 位机器上,指针的寻址范围为 2^32,所能表达的虚拟内存空间为 4 GB。

那么我们可能会认为在 64 位机器上,指针的寻址范围为 2^64,所能表达的虚拟内存空间为 16 EB 。虚拟内存地址范围为:0x0000 0000 0000 0000 0000 - 0xFFFF FFFF FFFF FFFF 。

事实上在目前的 64 位系统下只使用了 48 位来描述虚拟内存空间,寻址范围为 2^48 ,所能表达的虚拟内存空间为 256TB。


从上图中我们可以看出 64 位系统中的虚拟内存布局和 32 位系统中的虚拟内存布局大体上是差不多的。

创建一个线程需要消耗多大虚拟内存

前面我们也介绍了栈段,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8 MB。当然系统也提供了参数,以便我们自定义大小;

现在我们来验证一下,执行 ulimit -a 这条命令,查看进程创建线程时默认分配的栈空间大小


影响一个进程可创建多少线程的条件

  • 进程的虚拟内存空间上限,因为创建一个线程,操作系统需要为其分配一个栈空间,如果线程数量越多,所需的栈空间就要越大,那么虚拟内存就会占用的越多。

  • 系统参数限制,虽然 Linux 并没有内核参数来控制单个进程创建的最大线程个数,但是有系统级别的参数来控制整个系统的最大线程个数。

虚拟内存空间上限

32位系统

在 32 位 Linux 系统里,一个进程的虚拟空间是 4G,内核分走了1G,用户能用的只有 3G

创建一个线程需要占用 8M 虚拟内存,总共有 3G 虚拟内存可以使用。于是我们可以算出,最多可以创建差不多 380个(3G/8M)左右的线程。

如果想使得进程创建上千个线程,那么我们可以调整创建线程时分配的栈空间大小,比如调整为 512k:

[ecs-user@iZ2ze923utbhhwxwgc0pd9Z ~]$ ulimit -s 512

64位系统

64 位系统意味着用户空间的虚拟内存最大值是 128T,这个数值是很大的,一个线程需占用 8M 栈空间的情况来算,那么理论上可以创建 128T/8M 个线程,也就是 1000多万个线程,有点魔幻!

所以按 64 位系统的虚拟内存大小,理论上可以创建无数个线程。

系统参数限制

前面学习我们了解到了64 位系统的虚拟内存大小,理论上可以创建无数个线程。不过事实上,肯定创建不了那么多线程,除了虚拟内存的限制,还有系统的限制。

比如下面这三个内核参数的大小,都会影响创建线程的上限:

  • /proc/sys/kernel/threads-max,表示系统支持的最大线程数,默认值是 14553;

  • /proc/sys/kernel/pid_max,表示系统全局的 PID 号数值的限制,每一个进程或线程都有 ID,ID 的值超过这个数,进程或线程就会创建失败,默认值是 32768;

  • /proc/sys/vm/max_map_count,表示限制一个进程可以拥有的VMA(虚拟内存区域)的数量,具体什么意思我也没搞清楚,反正如果它的值很小,也会导致创建线程失败,默认值是 65530。

总结

最后简单总结下:

  • 32 位系统,用户态的虚拟空间只有 3G,默认创建线程时分配的栈空间是 8M,那么一个进程最多只能创建 380 个左右的线程。

  • 64 位系统,用户态的虚拟空间大到有 128T,理论上不会受虚拟内存大小的限制,而会受系统的参数或性能限制。

推荐阅读  点击标题可跳转

1、epoll 使用详解(精髓)

2、火遍童年的 FC 游戏是使用什么语言编写的

3、大神用Scratch手搓RISC-V模拟器,成功运行Linux内核

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
芙蓉蛋PARTY:中国怎么会舍得让你们离开马斯克和女高管的私生子曝光了,他到底有多少个孩子?茅台酒心巧克力开售,多个线上平台1分钟内售罄;李子柒官司风波后首露面;软银考虑对OpenAI进行投资丨邦早报陈楚生16年后再夺冠,《披荆斩棘3》又创造了多少个不可能?|现场抓紧, 即将截止!德州补助计划;最多可得$250,000!另:ERC补助也在火热申请中!中澳又增新航班! 最新直飞机票价格公布: 单程最低不到1200!你的微信好友有多少个?硬核实力!一批重大工程最新进展来了送免费流量还不算完!客户最多可向Optus索赔$10万国粹太极拳在大国政治上的娴熟应用!大学申请困惑?!预测2024年大学申请情况?准备多少AP课程?中文AP课程要不要参加?中华文明探源工程最新成果发布!印象伦敦饮食和饭店的人质现在没有哪个进名校的学生是孤军奋战,背后都有一个团队!早规划非常重要!读书就能免费得汉堡,最多可领3个!In n Out 儿童读书计划来啦……重大利好!德州TTIR 补助计划;最多可得$250,000!即将截止;另:ERC补助也在火热申请中!中国有多少个“盐都”?搭建数据指标体系,掌握这三个流程最管用!中澳航班9月全公布!更多航班复航!澳洲回国单程最低$389!发钱!纽约人最多可获高达8000美元补助!什么是虚拟线程?一次启1000万个会OOM吗?加州房主可申请补助,最多可获8万房贷减免许可:平台企业可以创造一个“创新的市场”交多少个朋友,才能带火京东直播?【双十一】购课限时大促,全科辅导类线上线下课程最高省700刀!抢盐 瓦格纳的普二 中国那儿百度何俊杰:用大模型构建多元AI原生应用生态,推动产业升级与经济增长|WISE2023商业之王大会莫斯科果断出手,表态愿帮蒙古国修建多座核电站“我,28岁,居然因为这个进了ICU”好消息!多伦多将新增7条直飞美国航班!单程最低不到100马斯克和女高管的私生子曝光3天后,最抓马的一幕来了:他到底有多少个孩子?!那个进过娱乐圈,搭档过杨紫,后来又去卖臭豆腐的“北大校花”,现在怎么样了?点击领取 IEEE Xplore MOOC 2023 秋季课程最新课表啦!《思念成风》&《黑月光》突发!特鲁多宣布4大福利,完全取消这项碳税3年!最多可领$15,250补贴
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。