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,理论上不会受虚拟内存大小的限制,而会受系统的参数或性能限制。