关于linux进程、lwp、线程的理解

时间:2022-09-24 18:21:31

参考文章:1.http://wiki.directi.com/display/tu/Understanding+Processes+in+Linux;jsessionid=154FB21140221C2C72348C4E9B96249E

                    2.http://linux.chinaitlab.com/kernel/890395.html

首先摘抄部分重要的要点: 

内核线程

    内核线程就是内核的分身,一个分身可以处理一件特定事情。这在处理异步事件如异步IO时特别有用。内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间,没有分配地址空间。

    

轻量级进程

    轻量级线程(LWP)是一种由内核支持的用户线程。它是基于内核线程的高级抽象,因此只有先支持内核线程,才能有LWP。每一个进程有一个或多个LWPs,每个LWP由一个内核线程支持。

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

用户线程

    LWP虽然本质上属于用户线程,但LWP线程库是建立在内核之上的,LWP的许多操作都要进行系统调用,因此效率不高。

    而这里的用户线程指的是完全建立在用户空间的线程库,用户线程的建立,同步,销毁,调度完全在用户空间完成,不需要内核的帮助。因此这种线程的操作是极其快速的且低消耗的。linux的用户线程是建立在posix库上的。缺点是一个用户线程如果阻塞在系统调用中,则整个进程都将会阻塞。

    linux线程的实现:用户线程+LWP

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

关于linux进程、lwp、线程的理解

个人理解:

    传统的讲解linux内核进程和线程的书,比如《LINUX KERNEL DEVELOPMENT》所简单阐述的关于多线程和进程的关系,大致都为线程共享其所属进程代码数据堆栈等,其实现在理解来看,这只是一种片面的说法,因为省略了LWP这一环,真正实现代码数据和地址空间等共享的并不是用户线程,而是和用户线程对应,代替用户线程与内核交互的LWP,顾名思义,用户线程是完全工作在用户空间的,内核完全不知道用户线程的存在,因为用户线程是在用户态完全由进程所创建和管理的。

    “缺点是一个用户线程如果阻塞在系统调用中,则整个进程都将会阻塞。”这句话的理解是:当不存在LWP的时候,因为kernel并不知道用户线程的存在,而如果用户线程需要系统调用,比如read操作,但是由于内核由于某种原因暂时不能提供被读取的数据,那么该read系统调用的不能进行会导致阻塞,但是由于kernel只对进程作出响应,所以对内核而言,唯一能阻塞的对象只能是发出请求的进程,而请求的线程是通过进程向内核提出系统调用的,那么进程阻塞了,当然属于该进程的其他线程同时也会阻塞。