考研帮 > 数学 > 每日一练

2.1 进程与线程

2.1.6 线程概念与多线程模型

  本节将重点介绍线程的概念、作用、实现方式及线程与进程的区别,另外简单介绍多线程模型。
  1.线程的引入
  在传统操作系统的单线程进程中,进程和线程概念可以不加区别。图2-3给出了单线程进程的内存布局和结构,它由进程控制块和用户地址空间,以及管理进程执行的调用/返回行为的系统堆栈或用户堆栈构成。一个进程的结构可以划分为两个部分:对资源的管理和实际的指令执行序列。显然,采用并发多进程程序设计时,并发进程之间的切换和通信均要借助于操作系统的进程管理和进程通信机制,因而实现代价较大,而较大的进程切换和进程通信代价,又进一步影响了并发的粒度。

  设想是否可以把进程的管理和执行任务相分离,如图2-4所示,让进程是操作系统中进行保护和资源分配的单位,允许一个进程中包含多个可并发执行的控制流,这些控制流切换时不必通过进程调度,通信时可以直接借助于共享内存区,每个控制流称为一个线程,这就是并发多线程程序设计。

  多线程进程的内存布局如图2-5所示,在多线程环境中,仍然有与进程相关的内容是PCB 和用户地址空间,而每个线程除了有独立堆栈,以及包含现场信息和其他状态信息外,也要设置线程控制块TCB(Thread Control Block)。线程间的关系较为密切,一个进程中的所有线程共享其所属进程拥有的资源,它们驻留在相同的地址空间,可以存取相同的数据。例如,当一个线程改变了主存中的一个数据项时,如果这时其他线程也存取这个数据项的话,它便能看到相同的结果。

  在操作系统中引入进程的目的是为了使多个程序并发执行,以改善资源利用率及提高系统的吞吐量,那么,在操作系统中再引入线程,则是为了减少程序并发执行时所付出的时空开销,使操作系统具有更好的并发性能。
  线程是进程中的一个实体,是被系统独立调度和分派的基本单位。线程自己基本上不拥有系统资源,只拥有在运行中必不可少的资源,如线程状态、寄存器上下文和栈。它同样有就绪、阻塞和执行三种基本状态。它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中也呈现出间断性。
  2.线程实现方式
  内核线程:它依赖于操作系统内核,由内核的内部需求进行创建和撤销,用来执行一个指定的函数。一个线程发起系统调用而阻塞,不会影响其他线程。它通过时间片分配给线程,所以,多线程的进程获得更多CPU时间。
  用户线程:不依赖于操作系统内核,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。调度在应用软件内部进行,通常采用非抢先式和更简单的规则,也无须用户态和核心态切换,所以速度特别快。
  轻权进程:它是操作系统内核支持的用户线程。一个进程可有一个或多个轻权进程,每个轻权进程由一个单独的内核线程来支持。
  3.进程机制与线程机制的比较
  在引入线程的操作系统中,通常一个进程有若干个线程,至少也需要有一个线程。下面从5个方面来比较线程和进程。
  调度
  在传统的操作系统中,进程是拥有资源的基本单位和独立调度、分派的基本单位。而在引入线程的操作系统中,则把线程作为调度和分派的基本单位,把进程作为资源拥有的基本单位。
  并发性
  在引入线程的操作系统中,不仅进程之间可以并发执行,而且在一个进程的多个线程之间,也可并发执行。因而使操作系统具有更好的并发性,从而能够有效地使用多个资源和提高系统吞吐量。
  拥有资源
  一般来说,线程除了拥有一点必不可少的资源外,它自己不拥有系统资源,但它可以访问其隶属进程的资源。也就是说,一个进程所拥有的资源可供它所有的线程共享。
  系统开销
  在有的系统中,线程的切换、同步和通信都无须操作系统内核的干预。
  通信方面
  进程间通信需要进程同步和互斥手段的辅助,以保证数据一致性,而线程间可以通过直接读/写进程数据段(如全局变量)来进行通信。
  4.多线程模型
  线程是操作系统进程中能够独立执行的实体(控制流),是处理器调度和分派的基本单位。线程是进程的组成部分,每个进程内允许包含多个并发执行的实体(控制流),这就是多线程。
  许多系统都提供用户和内核线程支持,从而有不同的多线程模型。下面我们看一下三种常见的线程模型。
  多对一模型
  多对一模型(如图2-6所示)将多个用户线程映射到一个内核线程。线程管理是在用户空间进行的,因而效率比较高;但是,如果一个线程执行了阻塞系统调用,那么整个进程就会阻塞。而且,因为任一时刻只有一个线程能访问内核,所以多个线程不能并行运行在多处理器上。
  一对一模型
  一对一模型(如图2-7所示)将每个用户线程映射到一个内核线程。该模型在一个线程执行阻塞系统调用时,能允许另一个线程继续执行,所以,它提供了比多对一模型更好的并发功能;它也允许多个线程能在多处理系统上并行地运行。这种模型的唯一缺点是,创建一个用户线程需要一个相应的内核线程。由于创建内核线程的开销会影响应用程序的性能,所以,这种模型的实现大多数限制了系统所支持的线程数量。
  多对多模型
  多对多模型(如图2-8所示)是多路复用许多用户线程到同样数量或更小数量的内核线程上。内核线程的数量可能与特定应用程序或特定机器有关(位于多处理器上的应用程序可比单处理器上的应用程序分配更多数量的内核线程)。虽然多对一模型允许开发人员随意创建任意多的用户线程,但是由于内核只能一次调度一个线程,所以并不能增加并发性。一对一模型提供了更大的并发性,但是开发人员必须小心,不要在应用程序内创建太多的线程。而多对多模型没有这两方面的缺点,开发人员可创建任意多的必要用户线程,并且相应内核线程能在多处理器系统上并行执行。并且,当一个线程执行阻塞系统调用时,内核能调度另一个线程来执行。
  5.并发多线程程序设计的优点
  在一个进程中包含多个并行执行的控制流,而不是把多个可并发执行的控制流一一分散在多个进程中,这是并发多线程程序设计与并发多进程程序设计的不同之处。并发多线程程序设计的主要优点是使系统性能获得很大提高,具体表现在以下几个方面。

       

  快速线程切换。进程具有独立的虚地址空间,以进程为单位进行任务调度,系统必须交换地址空间,切换时间长,而在同一进程中的多线程共享同一地址空间,因而,能使线程快速切换。
  减少(系统)管理开销。对多个进程的管理(创建、调度、终止等)系统开销大,如在响应客户请求建立一个新的服务进程的服务器应用中,创建的开销比较显著。面对创建、终止线程,虽然也有系统开销,但要比进程小得多。
  (线程)通信易于实现。为了实现协作,进程或线程间需要交换数据。对于自动共享同一地址空间的各个线程来说,所有全局数据均可自由访问,不需什么特殊设施就能实现数据共享。而进程通信则相当复杂,必须借助诸如通信机制、消息缓冲、管道机制等设施,并且还要调用内核功能才能实现,同时线程通信的效率也很高。
  并发程度提高。许多多任务操作系统限制用户能拥有的最多进程数目,如早期的UNIX 一般为50个,这对许多并发应用来说是不够的。而对多线程技术来说,一般可达几千个,基本上不存在线程数目的限制。
  节省内存空间。多线程合用进程地址空间,而不同进程独占地址空间,使用不经济。
  由于队列管理和处理器调度是以线程为单位的,因此,多数涉及执行的状态信息被维护在线程数据结构中。然而,有一些影响到一个进程中所有线程的活动,操作系统必须在进程级进行管理。挂起意味着将主存中的地址空间对换到磁盘上,因为,在一个进程中的所有线程共享同一地址空间,此时,所有线程也必须进入挂起状态。相似地,终止一个进程时,所有线程应被终止。

关于"最后阶段,真题的正确打开方式_备考经验_考研帮"15名研友在考研帮APP发表了观点

扫我下载考研帮

考研帮地方站更多

你可能会关心:

来考研帮提升效率

× 关闭