(四)操作系统-多线程

发布于 2021年04月21日1 min read

线程的引入

  • 提高系统并行性
    • 硬件方面:流水线计算机、数据流计算机、并行处理器、流水存储器、多体交叉及多端口存储器等;
    • 操作系统方面:中断、通道、多道程序设计技术、并发程序技术。
  • 仅使用进程来解决并行性问题的缺点
    • 经常性的进程开关,系统开销很大;
      • 与进程运行有关的表格要改写;
      • 进程的地址空间要进行转换为新被调度的进程的地址空间;
      • 两次模式开关的开销(用户模式—内核模式—用户模式)
  • 传统的进程概念有两个严重的局限性
    1. 许多应用想并发执行彼此间独立的任务,但又必须要共享一个公共的地址空间和其他资源,将这类应用中独立的任务串行化,效率很低;
    2. 传统的进程不能很好地利用多处理器系统。

线程(thread)的概念

概念:

  • 进程内的一个执行单元
  • 进程内的一个可调度实体
  • 线程是程序(或进程)中相对独立的一个控制流序列
  • 线程是执行的上下文,即执行的现场数据和其他调度所需要的信息

线程是进程内一个相对的、可调度的执行单元 ; 有些系统把线程称为轻质进程(lightweight process)

线程的性质

  • 线程是进程内一个相对独立的可执行单元;
  • 线程是操作系统中的基本调度单元,因此线程中应包含有调度所需要的必要信息;
  • 每个进程在创建时,至少需要同时为该进程创建一个线程,即进程中至少要有一个或一个以上线程,否则该进程无法被调度执行;
  • 需要时,线程可以创建其他线程;
  • 进程是被分给并拥有资源的基本单元,同一进程内的多个线程共享该进程的资源,但线程并不拥有资源,只是使用它们;
  • 由于共享资源(数据和文件),所以线程间需要通信和同步机制;
  • 线程有生命周期,有诞生和死亡,在生命周期中有状态的变化。

多线程机制的优点

  • 在进程内创建多线程,可以提高系统的并行处理能力。
  • 线程机制可显著提高程序执行的有效性,也可方便用户编程;
  • 不但适用于多机系统(尤其是对称式多机系统),而且对大多数单CPU系统也同样有好处。
  • 首先用于创建和撤消线程的开销比创建和撤消进程的系统开销(CPU时间)要少得多(比如不需要建立它的地址空间和所需资源等);
  • CPU在线程之间开关时的开销也远比在进程之间开关的开销小;
  • 线程机制也增加了通讯的有效性(无须内核参与);
  • 方便和简化了用户的程序结构工作。

线程的状态

所谓状态是指线程当前正在干什么和它能干什么

几个基本状态:

  • 就绪状态
  • 运行状态
  • 等待状态(或阻塞状态)

线程没有挂起操作和挂起状态;

  • 线程不是资源的拥有者,资源属于进程,所以线程不应有决定整个进程或自己从主存撤出的权力。

进程中可能有多个线程,当其中一个线程在执行中成为阻塞状态时,不阻塞其他线程,该进程中其他线程仍然可以参与调度运行;

对于多线程进程中的进程状态,可以只划分为活动(可运行)状态和非活动(不可运行)状态。

线程的生命周期图:

1

线程的状态转换

运行状态到阻塞状态

  • 其他线程使用Sleep( )原语;
  • 因为“挂起”原语;
  • 该线程自己“等待”某个条件(事件);
  • 该线程请求I/O服务。

阻塞状态到可运行状态

  • 唤醒
  • 解除挂起
  • 条件发生
  • I/O完成

进入死亡状态

  • 线程自己由于完成而使用Exit原语结束自己;
  • 被其他线程使用Stop原语而突然结束。

线程的描述(TCB)

线程控制块TCB——描述和记录其属性和调度所需的数据,是线程存在的标志。

  • 线程状态(就绪、运行、阻塞等)
  • 当线程不运行时,被保存的现场信息;
    • 程序计数器、程序状态字、通用寄存器、堆栈指针
  • 一个执行堆栈;
  • 存放每个线程的局部变量的主存区;
  • 访问被同一进程中所有线程共享的该进程的主存和其他资源。

线程的管理

  • 也用链指针将TCB或线程对象按它们所处的状态链接成相应的线程队列来加以管理;
  • 操作系统的进程管理程序为某用户应用程序创建进程时,同时为该进程创建第一个线程;
  • 以后在线程的运行过程中,线程可以在需要的时候创建所需的线程;
  • 线程间不提供父子关系的支持。

线程控制原语

创建线程原语

  • 为线程得到一个TCB或线程对象,并初始化线程ID,线程描述表(程序计数器PC、程序状态字PSW、通用寄存器、堆栈指针等)和其他有关项,然后进入相应就绪队列。

撤消线程原语

  • 撤消线程TCB或线程对象、线程堆栈和描述表。

阻塞或等待原语

挂起一个线程

恢复(解挂)一个线程

改变优先数

基于线程的操作系统分类

  • 单进程和单线程系统——只有一个进程,每个进程中只有一个线程,如MS-DOS;
  • 多进程和单线程系统——有多个进程,但每个进程中只有一个线程,如传统意义上的UNIX系统;
  • 单进程和多线程系统——只有一个进程,但每个进程有多个线程;
  • 多进程和多线程系统——有多个进程,每个进程中又有多个线程,是当前应用最广泛的系统类型。

2

查看更多操作系统系列

(一)操作系统-概述

(二)操作系统-运行环境

(三)操作系统-进程管理

(四)操作系统-多线程

(五)操作系统-进程间的交互

(六)操作系统-处理器调度及死锁

(七)操作系统-主存储器管理

(八)操作系统-虚拟存储管理

(九)操作系统-设备管理

(十)操作系统-文件系统

分享此文章