linux上可以运行多少进程 && 一个进程可以开辟多少线程?
这个问题我们被困扰了很久,只知道一个大致数字,而没有很准确的结果,今天我们就自己测试一下?
首先我们需要了解:
- 进程:是系统分配资源的单位,是运行中的程序,是程序+指令+资源的一组集合。
- 线程:是cpu调度执行的最小单位,可以看作轻量级进程,线程是进程中的一条执行序列,我们可以通过线程库创建线程
我们可以想到,进程既然是系统分配资源的单位,那么当然会有一个数量限制,系统的资源也不是无限的,那么线程同理,线程是进程的一条执行序列,那么当然也会有一个数量限制了。
我们直接进入正题,一个一个解决:
第一个问题:linux上可以运行多少进程?
①:我们可以通过特定命令在Linux上查看一下系统的进程限制
可以看到,我自己linux系统上上限设置的是1024个,也就是说我的计算机上最多可以有1024个进程,但是这是一个软限制,是可以进行修改的,比如我们可以通过ulimit -u 4096来设置为4096个:
②:我们也可以通过pid的大小限制来判断一个进程的数量范围
我们在上一篇博客中探讨过,pid是一个短整型short,这个值的大小为PID_MAX,也就是32767,其中0~299是为系统进程(包括内核线程)保留的。
我们可以通过命令进行查看:
当然,这里数字只是表示理论上的限制,但是由于现实中计算机内存等系统资源的限制,是根本不会有这么多的进程同时打开的。
第二个问题:linux上一个进程可以开辟多少线程?
①:我们知道线程除了调用栈是自己独有的,其他的资源全部共享进程,所以限制一个进程可以开辟线程的数量的关键点就在于这个调用栈上。
我们可以通过命令查看一下系统会为一个线程调用栈分配多少资源:
我们可以看到结果是10240,单位是kbytes,表示线程调用栈大小为10M,而我们知道32位操作系统4G虚拟内存空间中除了1G内核空间还有3G的用户空间,所以一个进程可以开辟的线程数目就是用3G/10M,结果大致是300左右,但是实际上会比这个数字小一些,因为不能用户空间全部分配给你,肯定还有其他进程需要资源。
当然,我们可以通过ulimit -s来设置stack size,将10M变小一些就可以开辟更多的线程了。
②:我们通过代码自己进行测试一番,看到底能开辟多少线程
代码如下:
#include <stdio.h>
#include <pthread.h>
#include <assert.h>
void* func(void *arg)
{
}
int main()
{
int i = 0;
pthread_t id;
while(1)
{
int res = pthread_create(&id, NULL, func, NULL);
if(res != 0)
{
break;
}
printf("已开辟线程数:%d\n", i++);
}
return 0;
}
我们可以看到测试结果为301个:
符合上述预估的值,我们计算机也就大致开辟300左右的线程。