> Linux教程 > Linux学习 >

linux中用户线程、内核线程、轻量级进程的区别

内核线程

内核线程就是内核的分身,一个分身可以处理一件特定事情。这在处理异步事件如异步IO时特别有用。内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间。支持多线程的内核叫做多线程内核(Multi-Threads kernel )。

轻量级进程(LWP)

轻量级线程(LWP)是一种由内核支持的用户线程。它是基于内核线程的高级抽象,因此只有先支持内核线程,才能有LWP。每一个进程有一个或多个LWP,每个LWP由一个内核线程支持(这种模型实际上就是一对一线程模型)。在这种实现的操作系统中,LWP就是用户线程。

由于每个LWP都与一个特定的内核线程关联,因此每个LWP都是一个独立的线程调度单元。即使有一个LWP在系统调用中阻塞,也不会影响整个进程的执行。

轻量级进程具有局限性。首先,大多数LWP的操作,如建立、析构以及同步,都需要进行系统调用。系统调用的代价相对较高:需要在用户态和内核态中切换。其次,每个LWP都需要有一个内核线程支持,因此LWP要消耗内核资源(内核线程的栈空间)。因此一个系统不能支持大量的LWP。

将之称为轻量级进程的原因可能是:在内核线程的支持下,LWP是独立的调度单元,就像普通的进程一样。所以LWP的最大特点还是每个LWP都有一个内核线程支持。

备注:
(1)K:kernel Thread,操作系统内核线程
(2)P:Process

用户级线程

LWP虽然本质上属于用户线程,但LWP线程库是建立在内核之上的,LWP的许多操作都要进行系统调用,因此效率不高。而这里的用户线程指的是完全建立在用户空间的线程库,用户线程的建立,同步,销毁,调度完全在用户空间完成,不需要内核的帮助。因此这种线程的操作是极其快速的且低消耗的。

不需要内核支持而在用户程序中实现的线程,不依赖于操作系统核心。应用进程利用线程库提供的创建、同步、调度和管理线程的函数控制用户线程。不需要用户态/内核态的切换,速度快,操作系统内核不知道多线程的存在,因此一个线程的阻塞将使得整个进程(包括它的所有线程)阻塞。由于这里的cpu时间片分配是以进程为基本单位的,所以每个线程执行的时间相对减少。

加强版的用户线程—用户线程+LWP

这种属于多对多模型。用户线程库还是完全建立在用户空间中,因此用户线程的操作还是很廉价,因此可以建立任意多个需要的用户线程。操作系统提供了LWP作为用户线程和内核线程之间的桥梁。LWP还是和前面提到的一样,具有内核线程支持,是内核的调度单元,并且用户线程的系统调用要通过LWP,因此进程中某个用户线程的阻塞不会影响整个进程的执行。用户线程库将建立的用户线程关联到LWP上,LWP与用户线程的数量不一定一致。当内核调度到某个LWP上时,此时与该LWP关联的用户线程就被执行。

很多文献中都认为轻量级进程就是线程,实际上这种说法并不完全正确,只有在用户线程完全由轻量级进程构成时,才可以说轻量级进程就是线程。

 

内核级线程和用户级线程的区别

1.内核支持的线程是内核可感知的,而用户级线程是内核无感知的。

2.用户级线程的创建、撤销、调度不需要内核支持,在语言层(如java)处理,而内核线程的创建、撤销、调度需要内核支持。

3.用户级线程的程序实体运行在用户态下的程序中,而内核级线程的程序实体可以运行在任何形态下的线程。

 


(责任编辑:IT)