进程管理九(线程)

  • 线程的概念

引入进程的目的是使多道程序能并发执行,以提高资源利用率和系统吞吐量。自从提出了进程的概念后,在操作系统中一直都是以进程作为资源分配和调度运行的基本单位。进程作为一个资源拥有者,在创建、撤销、切换中,系统必须为之付出较大时空开销。所以系统中进程的数量不宜过多,进程切换的频率不宜过高,但这也就限制了并发程度的进一步提高。

为了进一步提高系统的并发度,人们考虑把进程的“资源分配单位”与“调度运行单位”分离开来,进程作为系统资源分配和保护的独立单位,不需要频繁地切换;线程作为系统调度和分派的基本单位,能轻装运行,会被频繁地调度和切换。在这种指导思想下,产生了线程的概念。引入线程是为了提高系统的执行效率,减少处理机的空转时间和调度切换(保护现场信息)的时空开销,提高操作系统的并发性能。

一个进程内的基本调度单位称为线程。线程最直接的理解就是“轻量级进程”,线程自己不拥有系统资源,只拥有自己在运行中必不可少的资源,包括程序计数器、寄存器集合和堆栈。但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性,因此线程也有就绪、阻塞和运行三种基本状态,在线程并发中也存在同步和互斥机制。

引入线程的优点:

(1)并发执行发生在线程实体上,因而系统对处理机的分配也发生在线程之间,而线程间的切换改善了系统时空开销,包括内存管理、线程切换等。

(2)系统创建或终止一个线程的开销要比创建或终止一个进程的开销要小得多。

(3)线程之间通信的效率要高于进程之间通信的效率。进程间通信要内核介入,而同个进程的多个线程共享一个地址空间,所以通信时无需内核介入。

尽管线程可以提高系统的执行效率,但并不是在所有的计算机系统中,线程都是适用的,事实上在那些很少做进程调度和切换的实时系统、个人系统中,由于任务的单一性,设置线程反而会占用更多的系统资源。

适用线程的最大好处是在有多个任务需要处理机处理时,减少处理机的切换时间;而且,线程的创建和结束所需要的系统开销也比进程的创建和结束要小得多。由此,可以推出最适合适用线程的系统是多处理机系统和网络系统或分布式系统。在多处理机系统中,同一用户程序可以根据不同的功能划分为不同的线程,放在不同的处理机上执行。在网络或分布式系统中,服务器可对多个不同用户的请求按不同的线程进行处理,从而提高系统的处理速度和效率。

  • 线程与进程

在多线程操作系统中,把线程作为独立运行(或调度)的基本单位,此时的进程已不再是一个基本的可执行实体。但进程仍具有与执行相关的状态,所谓进程处于执行态实际上是指该进程中某线程正在执行。

线程的主要属性

(1)线程是一个轻型实体,它不拥有系统资源,但每个线程都应有一个唯一的标识符和一个线程控制块,线程控制块记录了线程执行的寄存器和栈等现场状态。

(2)不同的线程可以执行相同的程序,即同一个服务程序被不同的用户调用时,操作系统为它们创建成不同的线程。

(3)同一进程的各个线程共享该进程所拥有的资源。

(4)线程是处理器的独立调度单位,多个线程是可以并发执行的。在单CPU的计算机系统中,各线程可交替地占用CPU;在多CPU的计算机系统中,各线程可同时占用不同的CPU,若各个CPU同时为一个进程内的各线程服务,则可缩短进程的处理时间。

线程与进程的比较

(1)调度。进程在传统的操作系统中,既是资源的拥有者,也是系统调度和分派的单位。而在引入线程之后,进程仅作为资源的分配单位,线程作为调度和分派的单位。在统一进程内,线程的切换不会引起进程的切换,而由一个进程中的线程切换到另一个进程中的线程时,才会发生进程切换。

(2)并发性。在引入线程的操作系统中,不仅进程之间可以并发执行,而且在一个进程内的多个线程之间也同样可以并发执行,因而使系统具有更好的并发性,系统资源利用率和系统吞吐量得到提高。

(3)系统资源。在引入线程的操作系统中,线程成为了被调度和分派的基本单位。线程基本不拥有资源,只有一些运行所必须的资源,但它可以和进程内其他线程共享进程所拥有的全部资源,即拥有一个进程的代码段、数据段以及系统资源。

(4)系统开销。在创建和撤销进程时,系统都要进行资源分配和回收,如内存空间、I/O设备等。因此,操作系统所付出的时空开销显著地大于线程创建和撤销的开销。相类似地,在进程进行切换时,涉及当前进程的现场保存,以及新选择进程的上下文恢复。而线程的切换只需保存和设置少量的寄存器内容,并不涉及存储器管理方面的操作。由此可见,进程间切换的开销也大于线程间切换的开销。此外,由于同一进程内多个线程具有相同的地址空间,因而线程之间的同步和通信也变得更加容易。

  • 线程的实现方式

​​​​​​​线程已经在很多系统中实现,但各系统的实现方式并不完全相同。线程实现的方式有用户级线程和核心级线程两种。有些操作系统,例如linux或solaris2.x,同时提供用户级线程和核心级线程两种方式。

用户级线程的管理过程全部由用户程序完成,操作系统内核只对进程进行管理。由于这些线程都是设置在用户空间,而线程所执行的操作也无需内核的帮助,因而内核完全不知道用户级线程的存在。为了对用户级线程进行管理,操作系统提供一个在用户空间执行的线程库。该线程库提供创建、调度、撤销线程的功能。同时,该线程库也提供线程间的通信,线程的执行以及存储线程上下文的功能。当一个线程被创建时,线程库为其生成相应的线程控制块等数据结构,并为线程控制块中的参数赋值和把该线程置于就绪状态,其处理过程与进程创建过程大致相似。不同之处如下:

(1)用户级线程的调度算法和调度过程全部由用户自行选择和确定,与操作系统内核无关。在用户级线程系统中,操作系统内核的调度单位仍是进程。如果进程的调度区间为T,则在T区间内,用户可以根据自己的需要设置不同线程调度算法。

(2)用户级线程的调度算法只进行线程上下文切换而不进行处理机切换,且其线程上下文切换是在内核不参与的情况下进行的。也就是说,线程上下文切换只是在用户站、用户寄存器等之间进行切换,不涉及物理机的状态。

(3)因为用户级线程的上下文切换与内核无关。所以可能出现如下情况:即当一个进程由于I/O中断或时间片用完等造成该进程退出处理机,而属于该进程的执行中线程仍处于执行状态。也就是说,尽管相关进程的状态是阻塞的或等待的,但所属线程状态确实执行的。

核心级线程由操作系统内核进行管理。操作系统内核给应用程序提供相应的系统调用和应用程序接口API,以使用户程序可以创建、执行、撤销线程。

与用户线程不同,核心级线程既可以被调度到一个处理机上并发执行,也可以被调度到不同的处理机上并发执行。操作系统内核既负责进程的调度,也负责进程内不同线程的调度工作。因此,核心级线程不会出现进程处于阻塞状态,而线程处于执行状态的情况。

另外,核心级线程技术也可用于内核程序自身,从而提高操作系统内核程序的执行效率。在同一个进程中,从一个线程切换到另一个线程时,处理机需要从用户态转换到内核态进行,这是因为用户进程的线程在用户态运行,而线程调度和管理是在内核态实现的。因此核心级线程的上下文切换时间要大于用户级线程的上下文切换时间。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值