当前位置: 首页 > news >正文

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

这个问题是基于Linux系统下的测试,它跟两个因素有关:进程的虚拟内存上限和系统参数限制。

1. 进程的虚拟内存上限:

创建线程需要分配栈空间,创建的越多,需要分配的栈空间越多,占用的虚拟内存就越多。

2. 系统参数限制:

会有系统级别的参数来控制整个系统的最大线程个数。

输入 ulimit -a 后:

如上图我们可以知道服务器默认分配给线程的栈空间大小为8M(倒数第五行)。

通过top -H 可以查看当前系统的线程数,如下图:


可以看到线程数为37405(第二行)。

再执行下列代码:

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>void *thread(void *arg)
{printf("hello\n");
}int main()
{int res=0;int count=0;pthread_t id;while(res==0){res=pthread_create(&id,NULL,thread,NULL);count++;printf("count=%d\n",count);}exit(0);
}

得到结果如下:

由上图可以看到创建了32755个线程,也就是说,不能再创建了。

因为其受上述两个因素的影响,故将栈空间大小该变一下,

默认情况下,线程栈的大小通常为8MB。在内存允许的前提下,可以通过减小线程栈的大小,来增加可以创建的线程数量。较小的栈将允许更多的线程同时存在。

如果减少到4MB(4096KB),每个线程的栈空间将占用更少的内存,这样可以创建更多线程。但要注意,栈空间过小可能导致某些操作(尤其是递归操作或需要较大栈空间的操作)出错。

将栈大小改为4MB,输入如下命令:

ulimit -s 4096

再次测试,得到还是32755。

然后将线程数设置为100000,在管理员的身份下,输入如下命令:

echo 100000 | sudo tee /proc/sys/kernel/threads-max

同上还是32755。造成这种情况的原因是因为它不只是跟上述两个因素有关,还会受到资源限制、系统配置、系统内存使用情况以及用户级进程数限制等等的影响。故可以继续检查会受到影响的因素,修改调整,可能会有所改变,并进一步分析。(这里就不进一步分析了)


http://www.mrgr.cn/news/52824.html

相关文章:

  • 基于Neo4j与Django的员工地址距离展示系统
  • 系统架构设计师教程 第18章 18.4 信息安全整体架构设计 笔记
  • MiGPT让你的小爱音响更聪明
  • C#第三讲:类、对象、类成员
  • 【AIGC】AI如何匹配RAG知识库: Embedding实践,语义搜索
  • 数智合同 | 业财一体与履约联动的数字化转型
  • 探讨Node.js生态中的npm与npx工具
  • 使用Vscode配置ftp连接远程服务器(上传本地文件)
  • 五大常用算法
  • 火语言RPA流程组件介绍--等待元素显示消失
  • SpringBoot技术在车辆管理系统中的应用
  • 探索C嘎嘎:内存管理
  • 会组装调试维修无人机去当兵有多吃香?
  • SpringBoot的Web项目Mybatis-plus多数据源
  • 录微课专用提词器,不会被录进视频中的提词器,还能显示PPT中备注的内容
  • 第一周-操作系统概述
  • 《向量数据库指南》揭秘:Agentic RAG如何重塑RAG系统未来?
  • 白平衡 之 Gray World 优化
  • flume 负载均衡 详解
  • 单片机外设配置及相关使用