首页 理论教育 计算机操作系统中的线程基本概念与进程的比较

计算机操作系统中的线程基本概念与进程的比较

时间:2023-11-06 理论教育 版权反馈
【摘要】:3.7.2 线程的基本概念1.线程与进程的比较线程具有许多传统进程所具有的特征,所以又称为轻型进程或进程元,相应地把传统进程称为重型进程,传统进程相当于只有一个线程的任务。

计算机操作系统中的线程基本概念与进程的比较

在OS中一直都是以进程作为能拥有资源和独立运行的基本单位的。直到20世纪80年代中期,人们提出了比进程更小的能独立运行的基本单位——线程(threads),试图用它来提高系统内程序并发执行的程度,从而可进一步提高系统的吞吐量

3.7.1 线程的引入

在传统的操作系统中,进程是系统进行资源分配的基本单位,按进程为单位分给存放其映像所需要的虚地址空间、执行所需要的主存空间、完成任务需要的其他各类外围设备资源和文件。同时,进程也是处理器调度的基本单位,进程在任一时刻只有一个执行控制流,通常将这种结构的进程称单线程(结构)进程(single threaded process)。

首先来考察一个文件服务器的例子,当它接收一个文件服务请求后,由于等待磁盘传输而经常被阻塞,假如不阻塞可继续接收新的文件服务请求并进行处理,则文件服务器的性能和效率便可以提高,由于处理这些请求时要共享一个磁盘缓冲区,程序和数据要在同一个地址空间中操作。这一类应用非常多,例如,航空售票系统需要处理多个购票和查询请求,这些信息都与同一个数据库相关;而操作系统在同时处理许多用户进程的查询请求时,都要去访问数据库所在的同一个磁盘。对于上述这类基于同数据区的同时多请求应用,用单线程结构的进程难以达到这一目标,即使能解决问题代价也非常高,需要寻求新概念、提出新机制。随着并行技术、网络技术和软件设计技术的发展,给并发程序设计效率带来了一系列新的问题,主要表现在:

(1)进程时空的开销大,频繁的进程调度将耗费大量处理器时间,要为每个进程分配存储空间限制了操作系统中进程的总数。

(2)进程通信的代价大,每次通信均要涉及通信进程之间或通信进程与操作系统之间的信息传递。

(3)进程之间的并发性粒度较粗,并发度不高,过多的进程切换和通信延迟使得细粒度的并发得不偿失。

(4)不适合并行计算和分布并行计算的要求,对于多处理器和分布式的计算环境来说,进程之间大量频繁的通信和切换,会大大降低并行度。

(5)不适合客户/服务器计算的要求。对于客户/服务器结构来说,那些需要频繁输入输出并同时大量计算的服务器进程(如数据库服务器、事务监督程序)很难体现效率。

这就迫切要求操作系统改进进程结构,提供新的机制,使得应用能够按照需求在同一进程中设计出多条控制流,多控制流之间可以并行执行,多控制流切换不需通过进程调度;多控制流之间还可以通过内存区直接通信,降低通信开销。这就是近年来流行的多线程(结构)进程(multiple threaded process)。如果说操作系统中引入进程的目的是使多个程序能并发执行,以改善资源使用率和提高系统效率,那么在操作系统中再引入线程,则是为了减少程序并发执行时所付出的时空开销,使得并发性粒度更细、并发性更好。这里解决问题的基本思路是:把进程的两项功能——“独立分配资源”与“被调度分派执行”分离开来,前一项任务仍由进程完成,它作为系统资源分配和保护的独立单位,不需要频繁地切换;后一项任务交给称为线程的实体来完成,它作为系统调度和分派的基本单位,会被频繁地调度和切换,在这种指导思想下,产生了线程的概念。

3.7.2 线程的基本概念

1.线程与进程的比较

线程具有许多传统进程所具有的特征,所以又称为轻型进程(light-weight process)或进程元,相应地把传统进程称为重型进程(heavy-weight process),传统进程相当于只有一个线程的任务。在引入了线程的操作系统中,通常一个进程都拥有若干个线程,至少也有一个线程。下面从调度性、并发性、拥有资源和系统开销等方面对线程和进程进行比较。

(1)调度性。在传统的操作系统中,作为拥有资源的基本单位和独立调度、分派的基本单位都是进程。而在引入线程的操作系统中,则把线程作为调度和分派的基本单位,而进程作为资源拥有的基本单位,把传统进程的两个属性分开,使线程基本上不拥有资源,这样线程便能轻装前进,从而可显著地提高系统的并发程度。在同一进程中,线程的切换不会引起进程的切换,但从一个进程中的线程切换到另一个进程中的线程时,将会引起进程的切换。

(2)并发性。在引入线程的操作系统中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间亦可并发执行,使得操作系统具有更好的并发性,从而能更加有效地提高系统资源的利用率和系统的吞吐量。例如,在一个未引入线程的单CPU操作系统中,若仅设置一个文件服务进程,当该进程由于某种原因而被阻塞时,便没有其他的文件服务进程来提供服务。在引入线程的操作系统中,则可以在一个文件服务进程中设置多个服务线程。当第一个线程等待时,文件服务进程中的第二个线程可以继续运行,以提供文件服务;当第二个线程阻塞时,则可由第三个继续执行,提供服务。显然,这样的方法可以显著地提高文件服务的质量和系统的吞吐量。

(3)拥有资源。不论是传统的操作系统,还是引入了线程的操作系统,进程都可以拥有资源,是系统中拥有资源的一个基本单位。一般而言,线程自己不拥有系统资源(也有一点必不可少的资源),但它可以访问其隶属进程的资源,即一个进程的代码段、数据段及所拥有的系统资源,如已打开的文件、I/O设备等,可以供该进程中的所有线程所共享。

(4)系统开销。在创建或撤销进程时,系统都要为之创建和回收PCB,分配或回收资源,如内存空间和I/O设备等,操作系统所付出的开销明显大于线程创建或撤销时的开销。类似地,在进程切换时,涉及当前进程CPU环境的保存及新被调度运行进程的CPU环境的设置,而线程的切换则仅需保存和设置少量寄存器内容,不涉及存储器管理方面的操作,所以就切换代价而言,进程也是远高于线程的。此外,由于一个进程中的多个线程具有相同的地址空间,在同步和通信的实现方面线程也比进程容易。在一些操作系统中,线程的切换、同步和通信都无须操作系统内核的干预。

2.线程的属性

在多线程OS中,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位,是花费最小的实体。线程具有下述属性:

(1)轻型实体。线程中的实体基本上不拥有系统资源,只是有一点必不可少的、能保证其独立运行的资源,比如,在每个线程中都应具有一个用于控制线程运行的线程控制块(threaded control block,TCB),用于指示被执行指令序列的程序计数器,保留局部变量、少数状态参数和返回地址等的一组寄存器和堆栈

(2)独立调度和分派的基本单位。在多线程OS中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。由于线程很“轻”,故线程的切换非常迅速且开销小。

(3)可并发执行。在一个进程中的多个线程之间可以并发执行,甚至允许在一个进程中的所有线程都能并发执行;同样,不同进程中的线程也能并发执行。

(4)共享进程资源。在同一进程中的各个线程都可以共享该进程所拥有的资源,这首先表现在所有线程都具有相同的地址空间(进程的地址空间)。这意味着线程可以访问该地址空间中的每一个虚地址;此外,还可以访问进程所拥有的已打开文件、定时器信号量机构等。

3.线程的状态

与进程类似,线程也有生命周期,因而,也存在各种状态。从调度需要来说,线程的关键状态有运行、就绪和等待。另外,线程的状态转换也类似于进程。由于线程不是资源的拥有单位,挂起状态对线程是没有意义的,如果一个进程挂起后被对换出主存,则它的所有线程因共享了进程的地址空间,也必须全部对换出去。可见由挂起操作引起的状态是进程级状态,不作为线程级状态。类似地,进程的终止会导致进程中所有线程的终止。

进程中可能有多个线程,当处于运行态的线程执行中要求系统服务,如执行一个I/O请求而成为等待态时,那么多线程进程中,是不是要阻塞整个进程,即使这时还有其他就绪的线程?对于某些线程实现机制,所在进程也转换为阻塞态;对于另一些线程实现机制,如果存在另外一个处于就绪态的线程,则调度该线程处于运行状态,否则进程才转换为等待态。显然前一种做法欠妥,丢失了多线程机制的优越性,降低了系统的灵活性。

多线程进程的进程状态是怎样定义的?由于进程不是调度单位,不必划分成过细的状态,如Windows操作系统中仅把进程分成可运行态和不可运行态,挂起状态属于不可运行态。

3.7.3 线程管理和线程库

多线程技术是利用线程库来提供一整套有关线程的原语集来支持多线程运行的,有的操作系统直接支持多线程,而有的操作系统不支持多线程。因而,线程库可以分成两种:用户空间中运行的线程库和内核中运行的线程库。一般地说,线程库至少应提供以下功能的原语调用:孵化、封锁、活化、结束、通信、同步、互斥等,以及切换(保护和恢复线程上下文)的代码,调度(对线程的调度算法及实施处理器调度)的代码。同时应提供一组与线程有关的应用程序编程接口API,支持应用程序创建、调度、撤销和管理线程的运行。

基本的线程控制原语有:

(1)孵化(spawn):又称创建线程。当一个新进程被生成后,该进程的一个线程也就被创建。此后,该进程中的一个线程可以孵化同一进程中的其他线程,并为新线程提供指令计数器和参数。一个新线程还将被分配寄存器上下文和堆栈空间,并将其加入就绪队列。

(2)封锁(block):又称线程阻塞或等待。当一个线程等待一个事件时,将变成阻塞态,保护它的用户寄存器、程序计数器和堆栈指针等现场。处理器现在就可以转向执行其他就绪线程。(www.xing528.com)

(3)活化(unblock):又称恢复线程。当被阻塞线程等待的事件发生时,线程变成就绪态或相应状态。

(4)结束(finish):又称撤销线程。当一个线程正常完成时,便回收它占有的寄存器和堆栈等资源,撤销线程TCB。当一个线程运行出现异常时,允许强行撤销一个线程。

对于在用户空间运行的线程库,由于它完全在用户空间中运行,操作系统内核对线程库不可见,而仅仅知道管理的是一般的单线程进程。这种情况下,线程库起到一个微内核的作用,实质上是多线程应用程序的开发和运行支撑环境。优点是:节省了内核的宝贵资源,减少内核态和用户态之间的切换,因而,线程库的运行开销小效率高;容易按应用特定需要选择进程调度算法,也就是说,线程库的线程调度算法与操作系统的低级调度算法是无关的;能运行在任何操作系统上。缺点是:当线程执行一个系统调用时,不仅该线程被阻塞,而且,进程内的所有线程会被阻塞,这种多线程应用就不能充分利用多处理器的优点。

在内核中运行的线程库,则是通过内核来管理线程库的。内核中不但要保存进程的数据结构,也要建立和维护线程的数据结构及保存每个线程的入口,线程管理的所有工作由操作系统内核来实现。由内核专门提供一组应用程序编程接口(API),供开发者开发多线程应用程序。优点是:能够调度同一进程中多个线程同时在处理器上并行执行,充分发挥多处理器的能力,若进程中的一个线程被阻塞了,内核能调度同一进程的其他线程占有处理器运行,也可以调度其他进程中的线程运行。缺点是:在同一进程中,控制权从一个线程传送到另一个线程时需要用户态-内核态-用户态的模式切换,系统开销较大。

基于上述两种线程库可把线程的实现分成三类:用户级线程(user level thread,ULT)(如POSIX的P-threads、Java的线程库)和内核级线程(kernel level thread,KLT)(如Windows 2000/XP、OS/2和Mach C-thread)。也有一些系统(如Solaris)提供了组合式,同时支持ULT和KLT两种线程的实现。下面将会进一步讨论三种线程库的实现方法。

近年来,已出现了具有支持多线程运行的微处理器体系结构,称为超线程技术。如Intel公司发布的新一代奔腾4处理器,是具有超线程技术的微处理器。它的微处理器包含两个逻辑上独立的微处理器,能够同时执行两个独立的线程代码流。每个均可被单独启停、中断和被调度执行特定的线程,而不会影响芯片上另一个逻辑上独立的处理器共享微处理器内核的执行资源,包括:引擎、高速cache、总线接口和固件等。

3.7.4 线程的实现

从实现的角度看,线程可以分成用户级线程(如POSIX的P-threads、Java的线程库)和内核级线程(如Windows 2000/XP、OS/2和Mach的C-thread),分别在用户空间和核心空间实现。也有一些系统(如Solaris)提供了组合式线程,同时支持两种线程实现。图3-11给出了各种线程实现方法。

图3-11 线程

1.内核级线程

在纯内核级线程设施中,线程管理的所有工作由操作系统内核来做。内核专门提供了一个KLT应用程序设计接口(API),供开发者使用,应用程序区不需要有线程管理的代码。Windows 2000/XP和OS/2都是采用这种方法的例子。任何应用都可以被程序设计成多个线程,当提交给操作系统执行时,内核为它创建一个进程和一个线程,线程在执行中可以通过内核创建线程原语来创建其他线程,这个应用的所有线程均在一个进程中获得支持。内核要为整个进程及进程中的单个线程维护现场信息,所以,应在内核空间中建立和维护PCB及TCB,内核的调度是在线程的基础上进行的。

这一方法有两个主要优点:首先,在多处理器上,内核能够同时调度同一进程中多个线程并行执行;其次,若进程中的一个线程被阻塞了,内核能调度同一进程的其他线程占有处理器运行,也可以运行其他进程中的线程。最后,由于内核线程仅有很小的数据结构和堆栈,KLT的切换比较快,内核自身也可以用多线程技术实现,从而能提高系统的执行速度和效率。

KLT的主要缺点是:应用程序线程在用户态运行,而线程调度和管理在内核实现,在同一进程中,控制权从一个线程传送到另一个线程时需要用户态—内核态—用户态的模式切换,系统开销较大。

2.用户级线程

纯用户级线程设施中,线程管理的全部工作都由应用程序来做,在用户空间内实现,内核是不知道线程的存在的。用户级多线程由用户空间运行的线程库来实现,任何应用程序均需通过线程库进行程序设计,再与线程库连接后运行来实现多线程。线程库是一个ULT管理的例行程序包,在这种情况下,线程库是线程的运行支撑环境。

当一个应用程序提交给系统后,系统为它建立一个由内核管理的进程,该进程在线程库环境下开始运行时,只有一个由线程库为进程建立的线程。首先,运行这个线程,当应用进程处于运行态时,线程通过调用线程库中的“孵化”过程,可以孵化出运行在同一进程中的新线程,步骤如下:通过过程调用把控制权传送给“孵化”过程,由线程库为新线程创建一个TCB数据结构,并置为就绪态,然后,按一定的调度算法把控制权传递给该进程中处于就绪态的一个线程。当控制权传送到线程库时,当前线程的现场信息应被保存,而当线程库调度一个线程执行时,便要恢复它的现场信息。现场信息主要包括用户寄存器内容、程序指令计数器和堆栈指针。当线程运行,执行系统调用,导致它挂起并进入等待态时,线程库代码会寻找一个就绪态线程来执行,这时将进行线程上下文切换,而新线程被激活。

上述活动均发生在用户空间,且在单个进程中,内核并不知道这些活动。内核按进程为单位调度,并赋予一个进程状态(就绪、运行、阻塞等)。下面的例子清楚地表明了线程调度和进程调度之间的关系。假设进程B正在执行它的线程2,则可能出现下列情况:

(1)正在执行的进程B的线程2发出了一个封锁进程B的系统调用,例如,做了一个I/O操作。这导致控制转移到内核,内核启动I/O操作,把进程B被置为阻塞态,并切换到另一个进程。按照由线程库所维护的数据结构,进程B的线程2仍然处在运行态。十分重要的是,线程2的运行并不是真正意义上的被处理器执行,而是可理解为在线程库的运行态中。这时,进程B中的其他线程尽管有的处于可运行的就绪态,但因进程B被阻塞而也都被阻塞了。

(2)一个时钟中断传送控制给内核,内核中止当前时间片用完的进程B,并把它放入就绪队列,切换到另一个就绪进程,此时,由于进程B中的线程2正在运行,按由线程库维护的数据结构,进程B的线程2仍处于运行态,进程B却已处于就绪态。

(3)线程2执行到某处,它需要进程B的线程1的某些操作。于是让线程2变成阻塞态,而线程1从就绪态转为运行态,注意进程始终处在运行态。

上述前两种情况中,当内核切换控制权返回到进程B时,便恢复原来断点现场,线程2继续执行。注意到当正在执行线程库中的代码时,一个进程也有可能由于时间片用完或被更高优先级的进程剥夺而被中断。当中断发生时,一个进程可能正处在从一个线程切换到另一个线程的过程中间;当一个进程恢复时,继续在线程库中执行,完成线程切换,并传送控制权给进程中的一个新线程。使用ULT代替KLT有许多优点:

(1)线程切换不需要内核特权方式,因为所有线程管理数据结构均在单个进程的用户空间中,管理线程切换的线程库也在用户地址空间运行,因而进程不要切换到内核方式来做线程管理。这不仅节省了模式切换的开销,也节省了内核的宝贵资源。

(2)按应用特定需要允许进程选择调度算法,一种应用可能从简单轮转调度算法得益,同时,另一种应用可能从优先级调度算法获得好处。在不干扰操作系统调度的情况下,根据应用需要可以裁剪调度算法,也就是说,线程库的线程调度算法与操作系统的低级调度算法是无关的。ULT能运行在任何操作系统上,内核在支持ULT方面不需要做任何改变。线程库是可以被所有应用共享的应用级实用程序,许多当代操作系统和语言均提供了线程库,传统UNIX并不支持多线程,但已有了多个基于UNIX的用户线程库。

与KLT相比,ULT有两个明显的缺点:

(1)在传统的基于进程操作系统中,大多数系统调用将阻塞进程,因此,当线程执行一个系统调用时,不仅该线程被阻塞,而且进程内的所有线程会被阻塞。而在KLT中,这时可以去选择另一个线程运行。

(2)在纯ULT中,多线程应用不能利用多重处理的优点。内核在一段时间里,分配一个进程仅占用一个CPU,因而进程中仅有一个线程能执行。因此,尽管多道程序设计能够明显地加快应用处理速度,也具备了在一个进程中进行多线程设计的能力,但通常不可能得益于多线程并发地执行。

克服上述问题的方法有两种。一是用多进程并发程序设计来代替多线程并发程序设计,这种方法事实上放弃了多线程带来的所有优点,每次切换变成了进程而非线程切换,导致开销过大。二是采用护套技术(jacketing)来解决阻塞线程的问题。主要思想是:把阻塞式的系统调用改造成非阻塞式的系统调用,当线程调用系统调用前,首先调用jacketing实用例程,来检查I/O设备使用情况。如果忙碌,该线程进入就绪态并把控制权传递给另一个线程,当这个线程后来又重新得到控制权时,再一次调用jaketing例程检查I/O设备。

3.组合式线程

有些操作系统提供了组合式ULT/KLT线程,Solaris便是一个例子。在组合式线程系统中,内核支持KLT多线程的建立、调度和管理,同时也提供线程库,允许用户应用程序建立、调度和管理ULT。一个应用程序的多个ULT映射成一些KLT,程序员可按应用需要和机器配置调整KLT数目,以达到较好效果。

组合式线程中,一个应用中的多个线程能同时在多处理器上并行执行,且阻塞一个线程时并不需要封锁整个进程。如果设计得当,组合式多线程机制能够结合两者优点,并舍去它们的缺点。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈