线程
概念
线程是比进程更轻量级的调度单位,是JAVA里面进行处理器资源调度的最基本单位,实现线程主要有三种方式:使用内核线程实现(1:1实现)、使用用户线程实现(1:N实现)、使用用户线程加轻量级进程混合实现(N:M实现)。
一、线程实现:
1.1 内核线程实现
内核线程(Kernel-Level Thread,KLT)就是直接由操作系统内核支持的线程,这种线程由 内核来完成线程切换 ,内核通过操纵 调度器 对线程进行调度,并负责将线程的任务映射到各个处理器上。每个内核线程可以视为内核的一个分身,这种操作系统就有能力同时处理多件事情,支持多线程的内核就叫做多线程内核。
程序一般不会直接去使用内核线程,而是去使用内核线程的一种高级接口:轻量级进程(Light Weight Process ,LWP),轻量级进程就是我们通常意义上所讲的线程,由于每个轻量级进程都由一个内核线程支持,因此只有先支持内核线程,才能有轻量级进程。这种轻量级进程与内核线程之间1:1的关系成为一对一的线程模型。
由于内核线程的支持,每个轻量级进程都成为一个独立的调度单元,即使有一个轻量级进程在系统调用中阻塞了,也不会影响整个进程继续工作,但是轻量级进程具有它的局限性:
-
首先,由于是基于内核线程实现的,所以各种线程操作,如创建,析构和同步,都需要进行系统调用。而系统调用的代价相对较高,需要在用户态和内核态中来回切换。
-
其次,每个轻量级进程都需要有一个内核线程的支持,因此轻量级进程要消耗一定的内核资源(如内核线程的栈空间),因此一个系统支持轻量级进程的数量是有限的。
##### 1.2 用户线程实现
从广义上讲,一个线程只要不是内核线程,就可以认为是用户线程(User Thread,UT),因此,从这个定义上来讲, **轻量级进程也属于用户线程** ,但轻量级进程的实现始终是建立在内核之上的,许多操作都要进行系统调用,效率会受到限制。
而狭义上的 **用户线程指的是完全建立在用户空间的线程库上,系统内核不能感知线程存在的实现。用户线程的建立、同步、销毁和调度完全在用户态中完成,不需要内核的帮助。** 如果程序实现得当,这种线程不需要切换到内核态,因此操作可以是非常快速且低消耗的,也可以支持规模更大的线程数量,部分高性能数据库中的多线程就是由用户线程实现的。这种进程与用户线程之间1:N的关系称为一对多的线程模型。
##### 1.3 混合实现
##### 二、JAVA线程实现:
##### 2.1 实现
//TODO
##### 2.2 调度
//TODO