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

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

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

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

  1. 系统参数限制:

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

输入 ulimit -a 后:

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

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

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

再执行下列代码:

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

相关推荐
紧跟先前的步伐25 分钟前
Go AI Agent 实战 03|Token、上下文窗口与模型调用成本
java·人工智能·golang
benchmark_cc38 分钟前
Python 量化系统如何设计统一的数据访问接口:从策略解耦到数据层架构
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
吹什么轩1 小时前
linux系统复习:僵尸进程与孤儿进程
linux·运维·php
const_qiu1 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog1 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友
Promising_GEO1 小时前
GEE实战02期:从卫星波段开始:利用 Sentinel-2 自己计算 NDVI
java·sentinel·遥感·空间分析
大文说跨境1 小时前
亚马逊多账号管理浏览器怎么选?云登/紫鸟/AdsPower 对比
java·前端·自动化
CoderYanger1 小时前
Java EE 进阶:4.Spring Web MVC 入门(第一弹)
java·开发语言·前端·spring·面试·java-ee·mvc
殷忆枫1 小时前
告别依赖地狱!在 Ubuntu 上用 Docker 极速部署 Home Assistant 与 MQTT,并接入 Siri 与嵌入式 C 终端
linux·ubuntu·docker
第404号工位1 小时前
手机到底有没有偷听我们?我抓包了 72 小时,抓到了真凶
linux·人工智能·架构