操作系统精髓与设计原理-线程、对称多处理(SMP)和微内核

本文若未注明均摘抄自《操作系统精髓与设计原理》:William Stallings著,陈向群、陈渝译,机械工业出版社出版第六版

4 线程、对称多处理(SMP)和微内核

关键字
内核级线程 多线程 任务
轻量级线程 端口 线程
消息 进程 用户级线程
微内核 多对称处理器 单体结构的操作系统

4.1 进程和线程

进程映像是数据、程序、栈和进程控制块中定义的属性的集合。到目前为止金成德概念包含两个特点:资源所有权调度/执行。为了区分这两个特点,分派的单位通常称做线程或轻量级进程(Light Weight Process, LWP),而拥有资源所有权的单位通常仍称做进程任务

4.1.1 多线程

多线程是指操作系统在点歌进程内支持多个并发执行路径的能力。在一个多线程环境中运行的进程,可能有一个或多个线程,每个线程拥有独立的:

  • 线程执行状态(运行、就绪等)
  • 在未运行时保存的线程上下文,某种意义上可以看作时进程内的一个独立的程序计数器。
  • 一个执行栈
  • 用于每个线程局部变量的静态存储空间
  • 与进程内其他线程共享的对进程资源的访问

线程的重要优点有:

  1. 创建和终止线程都比进程快
  2. 同一进程内线程切换比切换进程快
  3. 线程提高了不同执行程序间的通信效率,独立进程间的通信需要内核的接入,但同一线程中的不同线程则不需要

Mach开发者的研究表明,线程创建要比在UNIX中的进程创建快10倍

在支持线程的操作系统中,调度和分派是在线程基础上完成的

4.1.2 线程功能特性

线程状态

一般来说挂起态对线程没有什么意义,因为挂起是进程级的状态。 线程一般具有四种状态:派生、阻塞、解除阻塞和结束。

这里一个重要的问题是,当一个线程被阻塞,这个阻塞是否会阻止整个它所在的进程的运行,这个问题将在下一节详细讨论。

4.1.3 用户级和内核级线程

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

用户级进程

在一个纯粹的用户级线程软件中,有关县城管理的工作都由应用程序完成,内核意识不到线程的存在。因此线程的状态切换、线程间通信、派生、终止等对内核来说都是透明的,它们发生在用户空间中,并且发生在一个进程内,内核对此并不知情。

操作系统精髓与设计原理-线程、对称多处理(SMP)和微内核_第1张图片

操作系统精髓与设计原理-线程、对称多处理(SMP)和微内核_第2张图片

使用用户级线程而不是内核级线程有许多优点,包括

  1. 由于所有线程管理数据结构都在一个金成德用户地址空间中,线程的切换不需要内核态特权,因此进程不需要为了线程管理而切换到内核态,这就节省了两次状态切换
  2. 调度可以是应用程序相关的。可以做到为应用程序量身定制调度算法而不是扰乱底层操作系统调度程序。
  3. 用户级线程可以在任何操作系统中运行,不需要内核为其提供特别的运行环境。线程库是一组供所有应用程序共享的应用程序级别的函数。

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

  1. 系统调用会进入内核态并引起进程阻塞,因此当用户及线程智行一个系统调用时,不仅这个线程会被阻塞,进程中的所有线程都会被阻塞
  2. 纯粹的用户级线程策略中,一个多线程应用程序不能利用多处理技术,内核一次只能把一个进程分配给一个处理器,因此同一时间仍然只有一个线程可以执行

博主:这两个缺点实在是太致命,以至于典型的需要并行编程的场景中,用户级线程都可以说是残废的。比如同时发送多个网络请求(每个请求都引起进程阻塞,无法并行请求)、比如密集型计算(只能调动一个CPU核心,多线程甚至不如单线程)。

内核级线程

Windows是采用内核级线程的一个典型例子。

首先,内核可以同时把同一个进程中的多个线程调度到多个处理器中;其次,如果进程中的一个线程被阻塞,内核可以调度同一个进程中的另一个线程。内核级线程的另一个优点就是内核例程自身也是可以使用多线程的。

内核级线程缺点在于,每次切换线程都需要内核态的状态切换。从下表可以看到用户及县城和内核级线程、内核级线程和进程之间都有一个数量级以上的性能差距

操作 用户级线程 内核级线程 进程
Null Fork 34 948 11300
Signal-Wait 37 441 1840

不过这个差距是否真的能够实现取决于应用本身的性质。如果应用程序中的大多数线程切换都需要内核态的访问,那么基于用户及线程的方案不回避基于内核级线程的方案好多少。

组合方法

有的操作系统提供了一种这组合的用户级线程/内核级线程设施(见图4.6c)。Solaris就是一个很好的例子

博主:可惜已经快要倒闭了。。。

4.1.4 其他方案

线程:进程 描述 实例系统
1:1 执行的每个线程是一个唯一的进程 传统UNIX
M:1 进程具有地址空间和动态资源所有权,可以在进程中创建多个线程 Windows NT、Solaris、Linux、OS/2、MACH
1:M 一个线程可以从一个进程环境迁移到另一个进程环境 RS(Clouds)、Emerald
M:N 结合了M:1和1:M的情况 TRIX

一对多的关系

在分布式操作系统领域,人们对把线程作为一个可以在地址空间中移动的实体具有很大兴趣。

4.2 对称多处理

传统上计算机被看作是顺序机器,每条指令是以操作序列的方式执行的。但这并不是完全真实的,长久以来指令流水线技术至少可以把取操作和执行操作重叠起来,这些都是并行执行的例子。本书分析两种最流行的通过复制处理器提供并行的手段:对称多处理(SMP)和集群。接下来分析对称多处理,16章分析集群。

4.2.1 SMP体系结构

Flynn首先提出的对并行处理器系统的分类仍然时最流行的分类法,他把计算机系统分为以下4类:

  • 单指令单数据(SISD)流:单处理器执行单个指令流,对保存在单个内存中的数据进行操作。
  • 单指令多数据(SIMD)流:一个机器指令控制许多处理器不见步伐一致地同时执行,每个处理器部件都有一个相关的数据内存。如显卡。
  • 多指令单数据(MISD)流:一系列数据被传送到一组处理器中,每个处理器执行不同的指令序列,这个结构从未实现过。
  • 多指令多数据(MIMD)流:一组处理器同时在不同的数据集上执行不同的指令序列。

MIMD中,如果是每个处理器都有一个专用内存,那么每个处理器都可以看作一个单独的计算机,这类系统称作集群(Cluster),或者多计算机系统;如果共享一个公用内存,则称作共享内存多处理器系统。

操作系统精髓与设计原理-线程、对称多处理(SMP)和微内核_第3张图片

在主/从结构中,操作系统内核总是在某一特定的处理器上运行,其他处理器只能用于执行用户程序,主处理器负责调度进程或线程。该方法的缺点如下:

  • 主处理器的失效将导致整个系统的失效。
  • 由于住处理器必须单独完成所有的调度和进程管理,它可能成为性能瓶颈

在对称多处系统中,内核可以在任何处理器上执行,SMP方法增加了操作系统的复杂性,他必须确保两个处理器不会选择统一进程,并确保进程不会由于某种原因从队列中丢失。

4.2.2 SMP系统的组织结构

在现代操作系统中,一个处理器通常至少有专用的一级高速缓存,由于每个本地高速缓存包含了一部分内存映像,如果修改了高速缓存中的一个字,可以想象得到,这使得在其他高速缓存中的这个字都变成无效的。这被称为高速缓存的一致性问题,通常是由硬件解决的。

操作系统精髓与设计原理-线程、对称多处理(SMP)和微内核_第4张图片

4.2.3 多处理器操作系统的设计思考

  • 同事的并发进程或线程:为允许多个处理器同时执行相同的内核代码,内核例程必须是可重入(reentrant)的
  • 调度:如果使用了内核级多线程,则可能出现多个处理器上同时从一个进程中调度多个线程的机会

4.3 微内核

微内核方法通过在Mach操作系统中的使用而得到推广,该操作系统就是现在的Macintosh Mac OSX。在不远的将来,这种通用的设计方法将用于大多数的个人计算机、工作站和服务器的操作系统。

4.3.1 微内核体系结构

微内核的基本原理是,只有最基本的操作系统功能才能放在内核里,许多传统上属于操作系统一部分的功能现在都是外部子系统,包括设备驱动、文件系统、文件系统、内存管理系统、窗口系统和安全服务。

4.3.2 微内核组织结构的优点

一致接口、可扩展性、灵活性、可移植性、可靠性、分布式系统支持、对面向对象操作系统的支持。

你可能感兴趣的:(系统)