乐正

Actions speak louder than words.

什么是线程

要成就一个复杂的系统,各部分必须分工明确,各司其职。 —— 《人工科学》

线程和进程

在上篇文章中(进程描述和控制),提出的进程概 念包含两个特点:

  • 资源所有权:一个进程拥有包括一个存放进程映像的虚拟地址空间。一个进程总是拥 有对于资源的控制或所有权。操作系统提供对于资源访问的保护功能。

  • 调度/执行:一个进程具有一个执行状态和一个被分配的优先级,它是一个可以被操 作系统调度和分派的实体。

分派的单位通常称为线程或轻量级进程;而拥有资源所有权的单位通常仍称为进程或者任务。

多线程

多线程是指在操作系统单个进程内支持多个并发执行路径的能力。对应的每个进程只有 一个线程在执行的称为单线程方法

在多线程环境中,进程被定义成资源分配的单位和一个被保护的单位。在一个进程中,可能 有一个或者多个线程,与进程相关的有:

  • 存放进程映像的虚拟地址空间
  • 受保护的对处理器、其他进程、文件和I/O资源的访问。
  • 线程执行状态(运行、就绪等)。
  • 在未运行时保存的线程上下文。
  • 一个执行栈。
  • 用于每个线程局部变量的静态存储空间。
  • 与进程内的其他线程共享的对进程的内存和资源的访问。

在多线程环境中,进程只有一个与之关联的进程控制块和用户地址空间。但是每个线程都有 一个独立的栈,还有独立的控制块用于包含寄存器值、优先级和其他与线程有关的状态信息。

进程中的所有线程共享该进程的状态和资源,它们驻留在同一地址空间中,并且可以访问到 相同的数据。

在性能比较方面,线程有下面重要的优点:

  1. 在一个已有的进程中创建一个新的线程比创建一个全新的进程所需的时间要少的多。
  2. 终止一个线程比终止一个进程花的时间少。
  3. 同一进程内线程间切换比进程间切换花费的时间少。
  4. 线程提供了不同的执行程序间的通信效率。

因此,如果一个应用程序或函数被实现为一组相关联的执行单位,那么用一组线程比一组进 程更有效。

线程的功能特性

和进程一样,现在的关键状态有运行态、就绪态和阻塞态。一般来说,挂起态对于线程来说 没有意义。

有四种与线程状态改变的相关工作:

  • 派生:当派生一个新的进程时,同时也为该进程派生了一个线程。随后,进程中的线 程可以在同一进程中派生另一个线程。
  • 阻塞:当线程需要等待一个事件时,它将被阻塞,此时处理器转为执行另一个就绪态 线程。
  • 解除阻塞:当阻塞一个线程的事件发生时,该线程被转移到就绪队列中。
  • 结束:当一个线程完成时,其寄存器上下文和栈都被释放。

线程分类

用户级和内核级线程

线程的实现分为两大类:用户级线程和内核级线程(User-Level Thread, ULT和Kernel-Level Thread, KLT) ,后者又被称为轻量级进程。

在一个纯粹的用户级线程软件中,有关线程管理的所有工作都是由应用程序完成,内核意识 不到线程的存在。任何应用程序都可以通过使用线程库被设计成多线程程序。线程库是用于 用户级线程管理的一个例程包,它包含用于创建和销毁线程的代码、在线程间传递消息和数 据的代码、调度线程执行的代码,以及保存和恢复线程上下文的代码。

用户级线程和内核级线程

线程调度活动都发生在用户空间中,并且发生在一个进程内,内核并不知道这些活动。内核 继续以进程为单位进行调度,并且给该进程指定一个执行状态。

使用用户级线程而非内核级线程有很多优点,包括:

  • 由于所有线程管理数据结构都在一个进程的用户地址空间中,线程切换不需要内核特权, 这节省了状态转换的开销。
  • 调度可以是应用程序相关的。可以为应用程序量身定制调度算法。
  • 用户级线程可以在任何操作系统中运行,不需要对低层内核进行修改以支持用户级线程。

用户级线程相对于内核级线程有两个明显的缺点:

  • 在典型的操作系统中,许多系统调用都会引起阻塞。因此,当用户级线程执行一个系统调 用时,不仅这个线程会被阻塞,进程中所有线程都会被阻塞。
  • 在纯粹的用于几线程策略中,一个多线程应用程序不能利用多处理技术。

技术

« 第一次与 Arduino 交互 使用串口与 Arduino 通信 »

Comments