Skip to content

第四讲 线程及其实现

1378 个字 预计阅读时间 7 分钟 共被读过

1. 线程的基本概念

进程是资源分配的单位,并发执行的进程不宜过多。线程 (thread)是进程中能够独立执行的实体,是 CPU 调度的单位。

多线程:每个进程内允许包含多个并发执行的实体。同一进程中的线程共享进程的主存空间和资源。创建一个进程的时候需要创建一个主线程。

每个线程有自己的栈:函数调用时传递参数,保存返回地址,存放局部变量。

线程控制块 (TCB, Thread Control Block) 是标志线程存在的数据结构,包含系统对线程进行管理所需要的全部信息。包含内容: 线程标识、线程状态、调度参数、CPU 现场信息。其中,CPU 现场信息主要包括通用寄存器、指令计数器 PC 以及用户栈指针。OS 内核支持的线程的 TCB 中还包含系统栈指针。TCB 可能属于操作系统空间或用户进程空间,取决于线程的实现方式。

线程的状态也有运行、阻塞、就绪,转换方式类似于进程。

线程的优点:

  1. 减小并发执行的时间和空间开销(线程的创建、退出和调度,因此容许在系统中建立更多的线程来提高并发程度。
  2. 创建 / 结束一个新线程花费时间少。
  3. 两个线程的切换花费时间少(如果机器设有保存 / 恢复所有寄存器指令,则整个切换过程用几条指令即可完成
  4. 因为同一进程内的线程共享内存和文件,因此它们之间相互通信无须调用内核。
  5. 适合多处理机系统。

线程的缺点:

  1. 引入了某种程度的复杂性。
  2. 一个线程的崩溃可能影响到整个进程的稳定性。
  3. 线程能够提高的总性能有限,并且线程多了之后,线程本身的调度也更加复杂,需要消耗较多的 CPU 资源。

2. 线程的实现机制

2.1 用户级线程

User Level Thread, ULT.

线程管理工作由应用程序完成,在用户空间内实现。通过用户空间线程库(运行时系统)管理线程。操作系统内核不知道线程的存在。线程切换不需要核心态特权。

线程库的作用有:创建、撤销线程;在线程间传递消息和数据;调度线程执行;保护和恢复线程上下文。

每个进程有线程表 (thread table),每个表项为线程控制块 TCB,对应一个线程。线程表由线程库管理,当线程由运行态转为就绪态或阻塞态时,在 TCB 中存放重新运行该线程所需的信息。

用户级线程中,操作系统内核不知道线程的活动,仍然管理线程所从属的进程的活动,因此处理器调度的单位是进程而不是线程。当线程调用阻塞型系统调用时,整个进程阻塞。

用户级线程的优点:

  1. 线程切换不调用操作系统内核,性能良好。
  2. 调度是应用程序特定的,可针对应用优化。线程库的线程调度算法与操作系统的低级调度算法无关。
  3. 无论操作系统内核是否支持线程,ULT 都可以运行,只需要线程库即可,许多当代操作系统和程序设计语言均提供了线程库。

用户级线程的缺点:

  1. 调度通常采用非抢先式和更简单的规则。
  2. 大多数系统调用是阻塞的,因此内核阻塞进程,故进程中所有线程将被阻塞。
  3. 操作系统内核只将处理器分配给进程,同一进程中的两个线程不能同时运行于两个处理器上。

2.2 内核级线程

Kernel Level Thread, KLT.

由内核管理线程。内核中需要有记录系统中所有线程的线程表,包括每个线程的线程控制块 (TCB)。不需要线程库,进程中也不需要线程表。

内核级线程的优点:

  1. 多处理器上,内核能够同时调度同一进程中的多个线程并行执行。
  2. 阻塞是在线程一级完成。若进程中的一个线程被阻塞,内核能够调度同一进程的其它线程占有处理器运行,也可以运行其它进程中的线程。
  3. 内核自身也可以用多线程技术实现,提高系统执行效率。

内核级线程的缺点:线程在用户态运行,调度和管理在内核实现,需要频繁进行模式切换,系统开销较大。

2.3 混合实现

使用内核级线程,然后将用户级线程与某些或全部内核级线程多路复用起来。内核只认识内核级线程。某些内核级线程的顶部有若干可以轮流使用的用户级线程集合。

混合实现中,线程创建、调度、同步在用户级线程中完成,应用程序的多个 ULT 将被映射到一些 KLT 上。程序员可以根据情况调节 KLT 数量,以求系统达到最佳效果。

3. Linux Windows 的线程

略。