一个进程到底可以创建多少个线程

1 先测试一下

编写测试代码

#include <stdio.h>

#include <pthread.h>

#include <errno.h>

#include <string.h>





void *thread(void *arg) {
    while (1)
    {
       sleep(1);
    }
    
}

int main() {

    int err = 0,count = 0;
    pthread_t tid;
    while(err == 0) {


        err = pthread_create(&tid,NULL,thread,NULL);
        count++;
        printf("count = %d\n",count);
    }

    printf("create thread error:%s\n",strerror(errno));
    printf("maxNUM number of thread within a process is :%d\n",count);

    getchar();
    return 0;
}

在32位系统上测试

在这里插入图片描述

在64位系统上测试

在这里插入图片描述

2 原理

32系统测试

32 位系统的内核空间占用 1G ,位于最高处,剩下的 3G 是用户空间;
在这里插入图片描述
那么假设创建一个线程需要占用 10M 虚拟内存,总共有 3G 虚拟内存可以使用。于是我们可以算出,最多可以创建差不多 300 个(3G/10M)左右的线程

64位系统测试

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

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

事实上,肯定创建不了那么多线程,除了虚拟内存的限制,还有系统的限制。

  • /proc/sys/kernel/threads-max,表示系统支持的最大线程数,默认值是 14553;
  • /proc/sys/kernel/pid_max,表示系统全局的 PID 号数值的限制,每一个进程或线程都有 ID,ID 的值超过这个数,进程或线程就会创建失败,默认值是 32768;
  • /proc/sys/vm/max_map_count,表示限制一个进程可以拥有的VMA(虚拟内存区域)的数量,如果它的值很小,也会导致创建线程失败,默认值是 65530。

3 总结

  • 32 位系统,用户态的虚拟空间只有 3G,如果创建线程时分配的栈空间是 10M,那么一个进程最多只能创建 300 个左右的线程。
  • 64 位系统,用户态的虚拟空间大到有 128T,理论上不会受虚拟内存大小的限制,而会受系统的参数或性能限制。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值