《深入理解Linux内核3rd》学习笔记——进程线程概念
本人比较熟悉Windows下的系统级和NT内核程序的开发,这里结合Windows中进程线程的概念与Linux中的进程线程作一个比较。
进程
在Linux和Windows中,对于进程这个概念基本一致,即程序运行的一个实例,代表了一组资源。
在Linux中,还有一个“轻量级进程”(LWP)的概念,引入这个概念是为了对多线程程序提供更好的支持(下文会讨论)。
用户线程
对于用户线程(简称线程。注,这里仅仅指的是多线程应用程序中的线程,不是内核线程),Linux和Windows表现的就不一致了。在Windows中,线程都是由内核实现的,即线程的创建、执行、调度、销毁都需要内核的参与;在传早期的Linux中,线程的所有行为在OS内核看来都是由在用户态实现的,即内核不参与这些过程。在Windows中,内核自动地对线程进行调度;在早期Linux中,线程的调度必须在用户模式下实现,这点类似于Windows中的纤程。因此,早期的Linux系统中的多线程程序中,只要有一个线程阻塞,那么整个进程也就阻塞了,多个线程之间无法并发。
Linux中的用户线程不需要内核的支持,其创建、执行、调度和销毁仅工作在用户模式,这种工作是非常高效且低消耗的。但其缺点是各线程之间无法并发。
内核线程
Windows和现代的Linux操作系统的内核都是多线程内核(即支持多线程的内核)。内核线程在Windows和Linux系统中表现的也基本一致,由内核参与线程的创建、执行、调度、销毁等工作,多个内核线程之间能够并发,相当于内核的多个影子,每个影子可以完成不同的事情。内核线程的使用是廉价的。
轻量级进程(LWP)
这是Linux中特有的概念。Linux为了对多线程程序提供更好地支持,现代的Linux系统中引入了“轻量级进程”(LWP)的概念,它是基于内核线程的高度抽象。实际上每个LWP都需要内核线程的支持。因此,每个LWP可以被内核独立调度,多个LWP之间能够并发。
LWP有局限性。大多数LWP的创建、执行、调度和销毁,都需要进行系统调用,系统调用需要在用户模式和内核模式中切换,代价高。另外,每个LWP都需要有一个内核线程支持,因此LWP要消耗内核资源(如内核线程的栈空间)。
用户线程和LWP的结合
引入LWP之后,就可以对用户线程进行优化,让一个或多个用户线程与一个LWP关联,这样一来,LWP就为用户线程和内核线程架起了一座桥梁,用户线程就可以借助于LWP之间的并发来间接地实现用户线程之间的并发。
要注意的是,用户线程与LWP关联可以是一对一,也可以是多对一的。