一、为什么要引入线程
进程是为了提高CPU的执行效率,减少因程序等待带来的CPU空转以及其他计算机软硬件资源而提出来的。进程是一个资源拥有者,因而在进程的创建、撤消和切换中,系统必须为之付出较大的时空开销。也正因为如此,在系统中所设置的进程数目不宜过多,进程切换的频率也不宜太高,但这也就限制了并发程度的进一步提高。如何能使多个程序更好地并发执行,同时又尽量减少系统的开销,已成为近年来设计操作系统时所追求的重要目标。于是,有不少操作系统的学者们想到,可否将进 程的上述属性分开,由操作系统分开来进行处理。即对作为调度和分派的基本单位,不同时作为独立分配资源的单位,以使之轻装运行;而对拥有资源的基本单位, 又不频繁地对之进行切换。正是在这种思想的指导下,产生了线程概念。即,为了减少进程切换和创建的开销,提高执行效率和节省资源,人们在开始操作系统中引入“线程”(thread)的概念。
二、线程
1、线程的基本概念
线程是进程的一部分,有时候也被称为轻量级进程(light weight process)。线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。如果把进程理解为在逻辑上操作系统所完成的任务,那么线程表示完成该任务的许多可能的子任务之一。
2、引入线程的好处
(1)易于调度。
(2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。
(3)开销少。创建线程比创建进程要快,所需开销很少。。
(4)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。
3、线程的适用范围
线程可以有效地提高系统的执行效率,但并不是在所有计算机系统中都是适用的,如某些很少做进程调度和切换的实时系统。使用线程的最大好处是有多个任务需要处理机处理时,可以减少处理机的切换时间;而且,线程的创建和结束所需要的系统开销也比进程的创建和结束要小得多。最适用使用线程的系统是多处理机系统、网络系统或分布式系统。
4、线程分类与执行
线程的两个基本类型是用户级线程和内核级线程(系统级线程)。
1、用户级线程
用户级线程的管理过程全部由用户程序完成,为了对用户级线程进行管理,操作系统提供一个在用户空间执行的线程库。该线程库提供创建、调度和撤销线程功能。同时,该线程库也提供线程见的通信、线程的执行以及存储线程上下文的功能。用户级线程只使用用户堆栈和分配给所属进程的用户寄存器。
(1)用户级线程的调度算法和调度过程全部由用户自行选择和确定,与操作系统内核无关。
(2)用户级线程的调度算法只进行线程上下文切换而不进行处理机切换。
(3)因,用户级线程的上下文切换和内核无关,所以可能出现,尽管相关进程的状态是阻塞的或等待的,但所属线程的状态却是执行的
2、内核级线程
由操作形同内核进行管理。操作系统内核给应用程序提供相应地系统调用和应用程序接口,以使用户可以创建、执行和撤销线程。操作系统内核既负责进程的调度,也负责进程内不同线程的调度,故,内核级线程不会出现进程出于阻塞或等待状态,而线程处于执行状态的情况。
系统开销:用户级线程<内核级进程<进程
3、执行
线程有3个基本状态:执行、就绪和阻塞。有五种基本操作:派生、阻塞、激活、调度和结束。
三、进程与线程
1、进程和线程的关系
(1)一个线程只能属于一个进程,而一个进程可以有多个线程。线程是操作系统可识别的最小执行和调度单位。一个没有线程的进程可以被看作是单线程。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
2、线程与进程的区别
(1)线程的改变只代表了CPU执行过程的改变,而进程所拥有的资源都没有发生改变。或者说,除了CPU之外,计算机内的软硬件资源的分配与线程无关,线程只能共享它所属进程的资源。
(2)与进程控制表和 PCB 相似,每个线程也有自己的线程控制表 TCB ,而这个 TCB 中所保存的线程状态信息则要比 PCB 表少得多,这些信息主要是相关指针用堆栈(系统栈和用户栈),寄存器中的状态数据。
(3)进程拥有一个完整的虚拟地址空间,不依赖于线程而独立存在;反之,线程是进程的一部分,没有自己的地址空间,与进程内的其他线程一起共享分配给该进程的所有资源。
3、线程与进程对比(来自L_free的博文进程与线程的区别和联系)
我们从调度、并发性、 系统开销、拥有资源等方面,来比较线程与进程。
1.调度
在传统的操作系统中,拥有资源的基本单位和独立调度、分派的基本单位都是进程。而在引入线程的操作系统中,则把线程作为调度和分派的基本单位。而把进程作 为资源拥有的基本单位,使传统进程的两个属性分开,线程便能轻装运行,从而可显著地提高系统的并发程度。在同一进程中,线程的切换不会引起进程的切换,在 由一个进程中的线程切换到另一个进程中的线程时,将会引起进程的切换。
2.并发性
在引入线程的操作系统中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间,亦可并发执行,因而使操作系统具有更好的并发性,从而能更有效地使 用系统资源和提高系统吞吐量。例如,在一个未引入线程的单CPU操作系统中,若仅设置一个文件服务进程,当它由于某种原因而被阻塞时,便没有其它的文件服 务进程来提供服务。在引入了线程的操作系统中,可以在一个文件服务进程中,设置多个服务线程,当第一个线程等待时,文件服务进程中的第二个线程可以继续运 行;当第二个线程阻塞时,第三个线程可以继续执行,从而显著地提高了文件服务的质量以及系统吞吐量。
3.拥有资源
不论是传统的操作系统,还是设有线程的操作系统,进程都是拥有资源的一个独立单位,它可以拥有自己的资源。一般地说,线程自己不拥有系统资源(也有一点必 不可少的资源),但它可以访问其隶属进程的资源。亦即,一个进程的代码段、数据段以及系统资源,如已打开的文件、I/O设备等,可供问一进程的其它所有线 程共享。
4.系统开销
由于在创建或撤消进程时,系统都要为之分配或回收资源,如内存空间、I/o设备等。因此,操作系统所付出的开销将显著地大于在创建或撤消线程时的开销。类 似地,在进行进程切换时,涉及到整个当前进程CPU环境的保存以及新被调度运行的进程的CPU环境的设置。而线程切换只须保存和设置少量寄存器的内容,并 不涉及存储器管理方面的操作。可见,进程切换的开销也远大于线程切换的开销。此外,由于同一进程中的多个线程具有相同的地址空间,致使它们之间的同步和通信的实现,也变得比较容易。在有的系统中,线程的切换、同步和通信都无须
另外,
Linux下,从函数调用上来说,进程创建使用fork()操作;线程创建使用clone()操作。
Ref:
张尧学老师编著《计算机操作系统教程(第4版)》