1.6 Linux操作系统对线程数的限制

2016-05-29 18:52:52 8,517 1

一个进程内可以创建多少个线程,受到操作系统使用的线程模型限制。本文以Linux操作系统为例进行讲解。

1、不同线程模型的限制

Linux操作系统中主要有两种线程模型LinuxThreads NPTL。不同的线程模型对于一个进程可以创建的线程数有着不一样的规定。要想查看你的Linux操作系统使用的是哪一种线程模型,使用"getconf GNU_LIBPTHREAD_VERSION"命令,这会产生类似于以下的输出结果:

NPTL 2.12

或者

linuxthreads-0.10

对于linuxthreads线程模型:一般情况下是限制一个进程最多可以创建1024线程,当然这是可以改变的,不过我们这里讨论的是默认的情况。

对于nptl模型:一个进程内可以创建的线程数量是不受限制的。

你可以通过查看/usr/include/bits/local_lim.h文件中的PTHREAD_THREADS_MAX配置项来查看当前你的操作系统是如何限制一个进程可以创建的线程数,以本人的机器为例:

QQ截图20160529181956.png

阅读蓝色部分的英文注释,可以看到对于一个进程可以创建的线程数量并没有任何限制。那么这是不是意味着可以在一个Java进程中创建无限多个线程呢?当然不是,因为线程的数量除了受到操作系统使用的线程模型的限制外,还要受到系统资源的限制

2、系统资源对线程数量的限制

我们前面提到,每个线程都会有自己的栈内存空间,而这都是系统内存中的一部分。因为系统的内存是有限的,因此不论使用的是哪种线程模型,你可以创建的线程数量实际上都是有限的。

通过ulimit -s命令,可以查看操作系统默认情况下的线程栈的大小。

[root@www work]# ulimit -s
10240

显示的结果是10240,这是以字节为单位的,因此就是10M。

对于JVM而言,默认情况下,一个线程的栈内存是1M。

因此,不论是哪种情况,你你可以创建的线程数量必然是要受到限制的。而且需要注意的是,通常情况下,操作系统中会有很多进程,因此内存是划分给多个进程,而不仅仅是java进程。

因此对于Java程序员而言,一个Java进程中可以创建的线程数主要是受到JVM可以使用的内存大小的影响,而不是操作系统的总内存。

3、Java线程与操作系统线程的一一对应关系

Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是由JVM的实现来确定的。Linux 2.6上的HotSpot使用了NPTL机制,JVM线程跟内核线程有一一对应的关系。这样做的好处是什么?线程的调度完全交给了操作系统内核,当然jvm还保留一些策略足以影响到其内部的线程调度。