精华内容
下载资源
问答
  • 一个进程可以有多少个线程
    千次阅读
    2021-04-10 10:26:02

    理论上,一个进程可用虚拟空间是2G,默认情况下,线程的栈的大小是1MB,所以理论上一个进程可以创建2048个线程,当然更改编译器的设置可以创建多余2048个线程

    因此,一个进程可以创建的线程数由可用虚拟空间和线程的栈的大小共同决定,只要虚拟空间足够,那么新线程的建立就会成功。如果需要创建超过2K以上的线程,减小你线程栈的大小就可以实现了,虽然在一般情况下,你不需要那么多的线程。过多的线程将会导致大量的时间浪费在线程切换上,给程序运行效率带来负面影响。

    更多相关内容
  • 一个进程最多可以创建多少线程

    万次阅读 多人点赞 2021-07-15 09:19:09
    大致意思就是,他看了一个面经,说虚拟内存是 2G 大小,然后他看了我的图解系统 PDF 里说虚拟内存是 4G,然后他就懵逼了。 其实他看这个面经很问题,没有说明是什么操作系统,以及是多少位操作系统。 因为不同的...

    大家好,我是小林。

    昨天有位读者问了我这么个问题:


    大致意思就是,他看了一个面经,说虚拟内存是 2G 大小,然后他看了我的图解系统 PDF 里说虚拟内存是 4G,然后他就懵逼了。

    其实他看这个面经很有问题,没有说明是什么操作系统,以及是多少位操作系统。

    因为不同的操作系统和不同位数的操作系统,虚拟内存可能是不一样多。

    Windows 系统我不了解,我就说说 Linux 系统。

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

    通过这里可以看出:

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

    接着,来看看读者那个面经题目:一个进程最多可以创建多少个线程?

    这个问题跟两个东西有关系:

    • 进程的虚拟内存空间上限,因为创建一个线程,操作系统需要为其分配一个栈空间,如果线程数量越多,所需的栈空间就要越大,那么虚拟内存就会占用的越多。
    • 系统参数限制,虽然 Linux 并没有内核参数来控制单个进程创建的最大线程个数,但是有系统级别的参数来控制整个系统的最大线程个数。

    我们先看看,在进程里创建一个线程需要消耗多少虚拟内存大小?

    我们可以执行 ulimit -a 这条命令,查看进程创建线程时默认分配的栈空间大小,比如我这台服务器默认分配给线程的栈空间大小为 8M。

    在前面我们知道,在 32 位 Linux 系统里,一个进程的虚拟空间是 4G,内核分走了1G,留给用户用的只有 3G

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

    如果你想自己做个实验,你可以找台 32 位的 Linux 系统运行下面这个代码:

    由于我手上没有 32 位的系统,我这里贴一个网上别人做的测试结果:

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

    $ ulimit -s 512
    

    说完 32 位系统的情况,我们来看看 64 位系统里,一个进程能创建多少线程呢?

    我的测试服务器的配置:

    • 64 位系统;
    • 2G 物理内存;
    • 单核 CPU。

    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

    那接下针对我的测试服务器的配置,看下一个进程最多能创建多少个线程呢?

    我在这台服务器跑了前面的程序,其结果如下:

    可以看到,创建了 14374 个线程后,就无法在创建了,而且报错是因为资源的限制。

    前面我提到的 threads-max 内核参数,它是限制系统里最大线程数,默认值是 14553。

    我们可以运行那个测试线程数的程序后,看下当前系统的线程数是多少,可以通过 top -H 查看。

    左上角的 Threads 的数量显示是 14553,与 threads-max 内核参数的值相同,所以我们可以认为是因为这个参数导致无法继续创建线程。

    那么,我们可以把 threads-max 参数设置成 99999:

    echo 99999 > /proc/sys/kernel/threads-max
    

    设置完 threads-max 参数后,我们重新跑测试线程数的程序,运行后结果如下图:

    可以看到,当进程创建了 32326 个线程后,就无法继续创建里,且报错是无法继续申请内存。

    此时的上限个数很接近 pid_max 内核参数的默认值(32768),那么我们可以尝试将这个参数设置为 99999:

    echo 99999 > /proc/sys/kernel/pid_max
    

    设置完 pid_max 参数后,继续跑测试线程数的程序,运行后结果创建线程的个数还是一样卡在了 32768 了。

    当时我也挺疑惑的,明明 pid_max 已经调整大后,为什么线程个数还是上不去呢?

    后面经过查阅资料发现,max_map_count 这个内核参数也是需要调大的,但是它的数值与最大线程数之间有什么关系,我也不太明白,只是知道它的值是会限制创建线程个数的上限。

    然后,我把 max_map_count 内核参数也设置成后 99999:

    echo 99999 > /proc/sys/kernel/max_map_count 
    

    继续跑测试线程数的程序,结果如下图:

    当创建差不多 5 万个线程后,我的服务器就卡住不动了,CPU 都已经被占满了,毕竟这个是单核 CPU,所以现在是 CPU 的瓶颈了。

    我只有这台服务器,如果你们有性能更强的服务器来测试的话,有兴趣的小伙伴可以去测试下。

    接下来,我们换个思路测试下,把创建线程时分配的栈空间调大,比如调大为 100M,在大就会创建线程失败。

    ulimit -s 1024000
    

    设置完后,跑测试线程的程序,其结果如下:

    总共创建了 26390 个线程,然后就无法继续创建了,而且该进程的虚拟内存空间已经高达 25T,要知道这台服务器的物理内存才 2G。

    为什么物理内存只有 2G,进程的虚拟内存却可以使用 25T 呢?

    因为虚拟内存并不是全部都映射到物理内存的,程序是有局部性的特性,也就是某一个时间只会执行部分代码,所以只需要映射这部分程序就好。

    你可以从上面那个 top 的截图看到,虽然进程虚拟空间很大,但是物理内存(RES)只有使用了 400 多M。

    好了,简单总结下:

    • 32 位系统,用户态的虚拟空间只有 3G,如果创建线程时分配的栈空间是 10M,那么一个进程最多只能创建 300 个左右的线程。
    • 64 位系统,用户态的虚拟空间大到有 128T,理论上不会受虚拟内存大小的限制,而会受系统的参数或性能限制。

    絮叨絮叨

    小林在 CSDN 写了很多图解网络和操作系统的系列文章,很高兴收获到很朋友的认可和支持,正好最近图解网络和操作系统的文章连载的有 20+ 篇了,也算有个体系了。

    在这里插入图片描述

    所以为了方便大家阅读,小林把自己原创的图解网络和图解操作系统整理成了 PDF,一整理后,没想到每个图解都输出了 15 万字 + 500 张图,质量也是杠杠的,有很多朋友特地私信我,看了我的图解拿到了大厂的offer。

    图解系统 PDF 开源下载:图解系统 PDF 下载地址(点击)

    图解网络 PDF 开源下载:图解网络 PDF 下载地址(点击)


    我是小林,今天的你,比昨天更博学了吗?

    展开全文
  • 一个进程能运行多少线程

    千次阅读 2019-04-11 15:22:41
    也知道线程的概念,它是程序执行的最小单元,是进程中的一个实体用来执行程序,一个进程多个线程。(一个cpu内核只能运行一个进程/线程,一台8核cpu的服务器只能同时运行8个进程/线程。只是每个进...

    转载:https://www.cnblogs.com/wozijisun/p/10370897.html

     

    对于Linux来说:

    我们都知道进程的概念,它是CPU分配资源的载体,是程序运行的实例;也知道线程的概念,它是程序执行的最小单元,是进程中的一个实体用来执行程序,一个进程中有多个线程。(一个cpu内核只能运行一个进程/线程,一台8核cpu的服务器只能同时运行8个进程/线程。只是每个进程/线程都会得到一个cpu运行时间,只要cpu速度快,给人的感觉就是服务器在运行成千上万个进程/线程

    既然如此,我们可以想象,一个系统中的进程数量肯定是有上限的,不然系统资源就会不够用了,同样的道理,一个进程中的线程资源也是有上限的。那进程和线程的上限到底是多大呢?

    Linux中最多可以有多少个进程?
    一.Linux中有一个命令可以帮助我们查看系统中的进程上限

    [pigff@izbp13yd4r85qvk53t04mbz ~]$ ulimit -u
    4096

    这属于软限制,是可以改变的。也就是说在我的机器上最多可以有4096个进程,但是我可以通过改变这个参数的值来修改对于进程数量的软限制,比如说用下面的命令将软限制改到5120。

     ulimit -u 5120

     二.我们用pid_t来表示一个进程的pid,因此能表示的进程的范围一定不会超过pid_t类型的大小

    [pigff@izbp13yd4r85qvk53t04mbz ~]$ cat /proc/sys/kernel/pid_max
    32768

    pid_t实际上就是一个short类型变量,当然这里能表示的范围只是进程id最多表示到这么多,这只是一个理论值,实际上,由于内存等系统资源的限制,根本不会同时有这么多的进程存在。

    一个进程中最多可以有多少个线程?
    在上一篇文章Linux中线程占用内存中,我们知道了创建一个线程会占用多少内存,这取决于分配给线程的调用栈大小,可以用ulimit -s命令来查看大小(一般常见的有10M或者是8M)。我们还知道,一个进程的虚拟内存是4G,在Linux32位平台下,内核分走了1G,留给用户用的只有3G,于是我们可以想到,创建一个线程占有了10M内存,总共有3G内存可以使用。于是可想而知,最多可以创建差不多300个左右的线程。

    因此,进程最多可以创建的线程数是根据分配给调用栈的大小,以及操作系统(32位和64位不同)共同决定的。
    --------------------- 
    原文:https://blog.csdn.net/lvyibin890/article/details/82255047 
     

    对于Windows来说:

    默认情况下,一个线程的栈要预留1M的内存空间 
    而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 
    但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。 
    你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。 
    如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。 

    即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制。 
    比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB。


    如果是同一台机器内的话,能起多少线程也是受内存限制的。每个线程对象都要站用非页面内存,而非页面内存也是有限的,当非页面内存被耗尽时,也就无法创建线程了。 

    如果物理内存非常大,同一台机器内可以跑的线程数目的限制值会越来越大。  

    在Windows下写个程序,一个进程Fork出2000个左右线程就会异常退出了,为什么?

    这个问题的产生是因为windows32位系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),这样当线程数量逼近2000时,2000*1024K=2G(大约),内存资源就相当于耗尽。

    如果你的服务器端程序设计成:来一个client连接请求则创建一个线程,那么就会存在2000个限制(在硬件内存和CPU个数一定的情况下)

    展开全文
  • 一个进程可以创建多少线程

    千次阅读 2018-07-18 23:10:23
    理论上,一个进程可用虚拟空间是2G,默认情况下,线程的栈的大小是1MB,所以理论上最多只能创建2048个线程。如果要创建多于2048的话,必须修改编译器的设置。 #include<windows.h> #include<...

    https://www.cnblogs.com/Leo_wl/p/5969621.html

    理论上,一个进程可用虚拟空间是2G,默认情况下,线程的栈的大小是1MB,所以理论上最多只能创建2048个线程。如果要创建多于2048的话,必须修改编译器的设置。

    #include<windows.h>
    #include<process.h>
    #include<stdio.h>
    HANDLE hProcess;
    HANDLE hThread;
    
    DWORD WINAPI athread(void)    //线程函数
    {
    	WaitForSingleObject(hProcess, INFINITE);
    	return 0;
    }
    bool createThread(int threadNum)    //参数表示创建的线程数
    {
    	int i;
    	hProcess = GetCurrentProcess();
    	for(i = 0; i < threadNum; i++)
    	{
    		hThread = NULL;
    		hThread = (HANDLE)_beginthreadex(NULL, 0, (unsigned int(__stdcall *)(void *))athread, NULL, NULL, NULL);
    		if(hThread != NULL)
    		{
    			printf("\nThe Number of Thread : %d ", i + 1);
    		}
    		else{
    			printf("\nError : Create Thread Fail.\n");
    			return false;
    		}
    	}
    	return true;
    }
    int main()
    {
    	printf("Test : How much thread a process can create.\n");
    	createThread(4500);
    	getchar();
    	return 0;
    }

    结论:

    一个进程可以创建的线程数由可用虚拟空间和线程的栈的大小共同决定,只要虚拟空间足够,那么新线程的建立就会成功。如果需要创建超过2K以上的线程,减小你线程栈的大小就可以实现了。

    展开全文
  • 进程线程的关系 简单复习一下:一个进程“代表中计算机中实际跑起来的一个程序,在现代操作...因此一个进程至少得有一个线程,我们把这个线程称之为”主线程“,也就是说,一个进程至少要有一个主线程。 ......
  • 既然如此,我们可以想象,一个系统中的进程数量肯定是上限的,不然系统资源就会不够用了,同样的道理,一个进程中的线程资源也是上限的。 Linux中最多可以有多少进程? 一.Linux中有一个命令可以帮助...
  • 一个进程最多创建多少线程

    千次阅读 2018-10-10 23:02:38
    最近,在做一个关于聊天服务器的项目,其中遇到了一个问题,那就是一个进程可以产生多少线程呢? 开始各种想象,会和不同平台,不同系统相关,网上很多大佬说是1024个,也256个。 与其无端猜测,不如动手测试...
  • 查询一个进程有多少线程

    千次阅读 2018-06-04 19:33:54
    个人觉得最简单就是pstack。或者通过 cat /proc/pid/status .还有一个是ps hH p pid | wc -l
  • 一个电脑最多能开启多少线程?

    千次阅读 2021-07-31 00:24:10
    —-一个进程可以开启的线程受可用内存限制,如果是32位的机器,那么默认一个进程有2G的可用内存,而每个线程默认分析1M的栈空间,所以这种情况下理论最线程数在2000多个。一个解决办法是创建线程时减少线程栈的大小...
  • 一个进程最多能包含多少线程

    万次阅读 2012-10-20 16:22:34
    实验蛮简单的,但是,我不由想到了,一个进程最多能包含多少线程。 在网上查了查,貌似也没找到多少这方面的资料。大部分都是关于服务器多线程链接sever的,关于本机可执行exe的进程数倒是没有什么涉及。 我觉得...
  • 进程 vs 线程一个进程可以包含多个线程

    万次阅读 多人点赞 2016-09-18 21:15:50
    进程(process)和线程(thread)是操作系统的基本概念,但是...vs 线程 :一个进程可以包含多个线程" title="进程 vs 线程 :一个进程可以包含多个线程" style="border:0px; max-width:602px; height:auto; ma
  • 既然如此,我们可以想象,一个系统中的进程数量肯定是上限的,不然系统资源就会不够用了,同样的道理,一个进程中的线程资源也是上限的。那进程线程的上限到底是多大呢? Linux中最多可以有多少进程? 一....
  • 进程线程的区别(超详细)

    万次阅读 多人点赞 2019-10-03 21:57:46
    每个进程自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程线程 进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程...
  • windows下如何查看某个进程有多少个线程,及各个线程的CPU、名称等详细信息
  • Linux下一个进程究竟会有多少线程

    千次阅读 2017-10-10 14:53:46
    进程可以启动最大线程个
  • python爬虫可以多少线程

    千次阅读 2021-01-14 03:20:29
    其实关于爬虫并没有明确多少数量开线程,因为这个是无穷的,随着...一起来看下吧~1、爬虫环境Pycharm python3.7.02、进程线程的关系:一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。资...
  • 关于进程线程and协程

    千次阅读 多人点赞 2021-07-02 00:49:08
    在当代面向线程设计的计算机结构中,进程线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。 定义:(分为狭义定义和广义定义!) (1)狭义定义:进程是正在运行的程序的实例(an instance ...
  • 线程是程序执行的最小单元,是进程中的一个实体用来执行程序,一个进程多个线程一个系统中的进程数量肯定是上限的,不然系统资源就会不够用了,同样的道理,一个进程中的线程资源也是上限的。那进程和...
  • 进程线程

    千次阅读 2021-05-08 15:49:53
    一、进程线程 进程是程序执行时的一个实例,即它是程序已经执行到何种程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。...进程有独立的地址空间,一个进程崩溃
  • 如何查看进程开启了多少线程

    千次阅读 2020-11-04 18:06:25
    为什么要知道某个进程开启了多少线程? 好奇,这很重要 性能调优 概念澄清 这里所说的线程指的是内核级别的线程,不是用户态线程,所谓用户态线程是指不依赖操作系统而是在用户态下实现的执行流调度。 这里的线程...
  • 默认情况下linux环境下一个进程最多能有多少线程?: 主线程+自己的线程382 = 383 这我自己已经验证过,测试程序在后面。
  • 在平时工作中,经常会听到应用程序的进程线程的... 线程是指进程内的一个执行单元,也是进程内的可调度实体. 线程是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位线程自己基本上不拥有系统资源...
  • 一个进程最多可以创建线程的数目

    千次阅读 2017-10-02 22:13:47
    如果使用VS,链接程序开关/SACK 或者/F可以设置线程堆栈大小,默认分配一个线程的堆栈大小是1MB,当CreateThread参数的StackSize大小与链接程序设置的不一致时,采用的方法是谁大用谁的,所以用4K
  • 【操作系统】第六话·线程进程的(宝ᴗ宝)嘛?

    千次阅读 多人点赞 2022-03-12 15:23:07
    从今天开始,我们将要开启一个新的系列【闪耀计划】,没错!这是今年上半年的一整个系列计划!本专题目的是通过百天刷题计划,通过题目和知识点串联的方式,完成对计算机操作系统的复习和巩固;同时还配专门的笔记...
  • 进程线程、协程

    千次阅读 2021-08-28 23:44:33
    进程线程、协程 一、概念与区分 1、进程 进程是程序一次动态执行的过程,是程序运行的基本...一个进程至少包含一个主线程,也可以有更多的子线程。 多个线程共享所属进程的资源,同时线程也拥有自己的专属资源。
  • 后来出现了多核CPU,假如现在有一个双核CPU,那这个CPU就能同时运行两个线程,但仍然只能同时运行一个进程,因为这个双核CPU仍然只有一个MMU。 再后来,CPU厂商为每个CPU核心配置了MMU,这个时候的CPU就能同时运行多...
  • 进程线程

    万次阅读 多人点赞 2021-03-17 22:50:20
    进程是系统中独立存在的实体,它可以拥有自己独立的资源,每个进程都拥有自己私有的地址空间,在没有经过进程本身允许的情况下,一个用户进程可以直接访问其他进程的地址空间 动态性 进程与程序的区别在于,程序只是...
  • 1. 什么是进程线程 现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统。 1.1 百科解释 进程(Process)是计算机中的程序关于某数据集合上的次运行活动,是系统进行资源分配和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 976,642
精华内容 390,656
热门标签
关键字:

一个进程可以有多少个线程