第1页:第四章 多线程
第四章 多线程(thread):线程是近年来操作系统领域出现的一个非常重要的机制和技术,其重要程度不亚于进程。线程机制对提高程序执行有效性的效果显著,而且也方便了用户结构和编程。不但适用于多机系统,而且对大多数的单 CPU 的个人计算机也同样带来好处,当代操作系统都支持线程。
第2页:进程在操作系统中的作用
进程在操作系统中的作用
- 进程是拥有自己资源的基本单元
- 进程是被调度到处理机上运行的单元体
第3页:进程的局限性
进程的局限性
- 许多应用想并发执行彼此间独立的任务,但又必须要共享一个公共的地址空间和其他资源,传统的进程概念对并行进程本身难以支持
- 传统的进程不能很好的利用多处理器,因为一个进程在某个时刻只能使用一个处理器
第4页:引入线程的原因
在操作系统中,进程的引入提高了计算机资源的利用效率。但在进一步提高进程的并发性时,人们发现进程切换开销占的比重越来越大,同时进程间通信的效率也受到限制。线程的引入正是为了简化进程间的通信,以小的开销来提高进程内的并发程度。
第5页:引入多线程技术的重要性
引入多线程技术的重要性
- 并行技术发展的需要
- 网络技术发展的需要
- 软件技术发展的需要
- 并发程序设计的需要
第6页:线程的概念
线程是指进程中的一条执行路径,是系统进行处理器调度的基本单位,同一个进程中的所有线程共享进程获得的主存空间和资源。
线程具有
- 一个线程执行状态
- 有一个受保护的线程上下文,当线程不运行时用于存储现场信息
- 一个独立的程序指令计数器
- 一个执行堆栈
- 一个容纳局部变量的静态存储器
第7页:对线程的不同理解
对线程的不同理解
- 进程内的一个执行单元
- 进程内的一个可调度单元
- 线程是程序(或进程)中相对独立的一个控制流序列
- 线程是执行的上下文,其含义是执行的现场的数据和其他调度所需的信息
第8页:线程的特性
- 并行性
- 同一进程的多个线程可在一个或多个处理器上并发或并行运行
- 共享性
- 同一个进程中的所有线程共享进程获得的主存空间和一切资源
- 动态性
- 线程也是程序在相应数据集上的一次执行,由创建而产生,至撤销而消亡,有其生命周期
第9页:线程的性质
线程的性质
- 线程是进程内一个相对独立的可执行单元
- 线程是操作系统中的基本的调度单元
- 进程中至少要有一个或一个以上的线程
- 线程可以创建其他线程
- 进程是被分给并拥有资源的基本单元,同一进程中的线程共享资源,但并不拥有资源,只是使用资源
- 由于共享资源,线程间需要通信和同步机制
- 线程有生命期,有诞生和死亡
第10页:线程的好处
线程的好处
- 创建和撤销线程的开销比创建和撤销进程小:如创建进程需要建立 PCB 并初始化、加入进程队列、申请内存空间以存放代码和数据、列出资源清单等,而建立线程只需建立线程控制表并将其加入线程队列
- 两个线程的切换(开关)花费时间少
- 通讯效率比较高,因为同一进程内的线程共享内存和文件,因此它们之间相互通信无须调用内核
- 适合多处理机系统
第11页:线程的应用
线程的应用
- 前台和后台工作
- 异步处理工作
- 加快执行速度
- 组织复杂工作
- 多用户服务
第12页:线程的状态
线程的状态
- 就绪状态
- 线程已具备执行的条件,等待调度程序分配给一个 CPU 运行
- 运行状态
- 线程正在 CPU 上运行
- 等待状态
- 线程正等待某事件发生
第13页:进程与线程的比较
进程与线程的比较
- 进程中有挂起操作,线程不拥有资源,没有权力决定进程或线程自己从主存撤出,挂起只是进程一级的概念,线程没有挂起状态
- 进程中可能有多个线程,一个线程阻塞并不影响整个进程,进程中的其他线程仍然可以参与调度运行
第14页:线程控制原语
线程控制原语
- 创建线程原语
- 撤消线程原语
- 阻塞或等待原语
- 挂起一个线程(注意:与挂起一个进程有什么不同?)
- 恢复(或解除挂起)一个线程
- 改变优先数原语
第15页:线程组(thread group)
线程组(thread group):为方便地管理线程,引入线程组。
- 每个线程属于某个线程组
- 每个线程创建时,用户可以显式的说明为它创建一个新的线程组;也可以由系统自动把该线程归入创建该线程的线程所在的线程组
- 线程组是多个线程的集合,系统将它们归入一个单独的对象,统一加以管理
- 可为线程组设置不同的特性和保密安全方法
- 一个线程在已被创建后,不能更改移入其他线程组
第16页:单线程进程模型
单线程进程(模型)示意图:本页以图示方式展示单线程进程由用户地址空间、进程控制块、用户堆栈、内核堆栈构成,并标明管理者与执行序列。
第17页:多线程进程模型
多线程进程(模型)示意图:本页以图示方式展示多线程进程中各线程分别拥有线程控制块、系统堆栈与用户堆栈,并共享进程的用户地址空间与进程控制块。
第18页:基于线程的操作系统分类
基于线程的操作系统分类
- 单进程和单线程系统
- 只有一个进程和一个线程,如 MS-DOS
- 多进程和单线程系统
- 有多个进程,每个进程只有一个线程,如 UNIX
- 单进程和多线程系统
- 只有一个进程,每个进程有多个线程,如 Java Run-time System
- 多进程和多线程系统
- 有多个进程,每个进程又有多个线程,如 WINDOWS NT
第19页:线程的实现机制
线程的实现机制
第20页:用户级线程(ULT)
用户级线程(User Level Thread,ULT)
- ULT 是指由用户应用程序建立的线程
- 由应用程序完成 ULT 的调度执行和管理(注意:不是由操作系统完成,为什么?操作系统本身不是基于多线程的,如 MS-DOS、UNIX)
- 核心不知道线程的存在
- 线程切换不需要核心态特权
- 调度是由应用程序特性而定
第21页:线程库(Threads Library)
Threads Library 是一个基于多线程的用户应用程序开发环境和运行环境:
- 创建、撤消线程
- 在线程之间传递消息和数据
- 调度线程执行
- 保护和恢复线程上下文
第22页:对用户级线程的核心活动
对用户级线程的核心活动
- 核心不知道线程的活动,但仍然管理线程的进程的活动
- 当线程调用系统调用时(如线程 A 申请 I/O 或其他资源),整个进程阻塞,但对线程库来说其他线程仍然是运行状态,即线程状态是与进程状态独立的
- 当然,在基于进程的操作系统(MS-DOS、UNIX)中,调度是以进程为单位的,实际上其他线程也都被阻塞了
第23页:用户级线程的优点
用户级线程的优点
- 线程切换不调用核心
- 调度是应用程序特定的:可以选择最好的算法
- ULT 可运行在任何操作系统上(只需要线程库)
第24页:用户级线程的缺点
用户级线程的缺点
- 大多数系统调用是阻塞的,因此核心阻塞进程,故进程中所有线程将被阻塞
- 核心只将处理器分配给进程,同一进程中的两个线程不能同时运行于两个处理器上
第25页:核心级线程(KLT)
核心级线程(KLT)
- 所有线程管理由核心完成
- 没有线程库,但对核心线程工具提供 API
- 核心维护进程和线程的上下文
- 线程之间的切换需要核心支持
- 以线程为基础进行调度
- 例子:Windows NT,OS/2
第26页:核心级线程的优点及缺点
核心级线程的优点及缺点
- 优点
- 对多处理器,核心可以同时调度同一进程的多个线程;阻塞是在线程一级完成;核心例程是多线程的
- 缺点
- 在同一进程内的线程切换需调用内核,导致速度下降
第27页:ULT和KLT结合方法
ULT 和 KLT 结合方法:
- 线程创建在用户空间完成
- 大量线程调度和同步在用户空间完成
- 程序员可以调整 KLT 的数量
- 可以取两者中最好的
- 例子:Solaris(改进型的 UNIX)
第28页:本章结束致谢页
Thanks!