2 处理器管理
处理器管理是操作系统的重要组成部分:
- 负责管理、调度和分配计算机系统的重要资源,并控制程序执行
- 处理器管理中最重要的是处理器调度,即进程调度,也就是控制、协调进程对处理器的竞争
进程与线程:
- 进程是资源分配和管理的单位
- 线程是处理器调度的基本单位
管态与目态:
- 管态又叫特权态,可以执行特权指令,执行资源管理程序、为应用程序执行提供良好运行环境的各种原语等
- 目态又叫用户态,只能执行非特权指令
1 处理器与寄存器
1.1 处理器
1.2 寄存器
用户程序可见寄存器
可以使程序员减少访问主存储器的次数,提高指令执行的效率
所有程序可使用,包括应用程序和系统程序
- 数据寄存器:又称通用寄存器
- 地址寄存器:索引、栈指针、段地址等寄存器
控制与状态寄存器
主要被具有特权的操作系统程序使用,以控制程序的执行
程序计数器 PC:存储将取指令地址
指令寄存器 IR:存储最近使用的指令
条件码 CC:标志正/负/零/溢出等结果
标志位:中断位、中断允许位、中断屏蔽位、处理器模式位、内存保护位等
程序状态字 PSW
PSW 既是操作系统的概念,指记录当前程序运行的动态信息,也是计算机系统的寄存器(设置一组控制与状态寄存器,也可以专设一个 PSW 寄存器)
通常包含:
- 程序计数器、指令寄存器、条件码
- 中断字、中断允许/禁止、中断屏蔽、处理器模式、内存保护、调试控制
PSW in IBM System/360:
2 指令与处理器模式
2.1 机器指令
机器指令是计算机系统执行的基本命令,是中央处理器执行的基本单位
2.2 指令执行过程
一种指令执行步骤:
- 取指:根据 PC 从存储器或 cache 中取指令到 IR
- 解码:解译 IR 中的指令来决定其执行行为
- 执行:连接到 CPU 部件,执行运算,产生结果并写回,同时在 CC 里设置运算结论标志;跳转指令操作 PC,其他指令递增 PC 值
2.3 指令执行周期与指令流水线
2.4 特权指令与非特权指令
特权指令:只能被操作系统内核使用的指令
非特权指令:能被所有程序使用的指令
2.5 处理器模式
计算机通过设置处理器模式实现特权指令管理
一般设置四种运行模式,分别对应:
- 0:操作系统内核
- 1:系统调用
- 2:共享库程序
- 3:用户程序等保护级别
0 模式可以执行全部指令;3 模式只能执行非特权指令;其他运行模式可以规定执行的指令子集
一般来说现代操作系统只使用 0 和 3 两种模式,分别对应内核模式和用户模式
2.6 处理器模式的切换
用户模式 \(\to\) 内核模式,内核模式 \(\to\) 用户模式
中断、异常或系统异常等事件导致用户程序向 OS 内核切换,触发用户模式 \(\to\) 内核模式
OS 内核处理完成后,调用中断返回指令,触发内核模式 \(\to\) 用户模式
3 中断
3.1 中断的概念
中断是指程序执行过程中,遇到急需处理的事件时,暂时中止 CPU 上现行程序的运行,转去执行相应事件的处理程序,待处理完成后再返回源程序被中断处或调度其他程序执行的过程。
操作系统时“中断驱动”的;也就是说,中断时激活操作系统的唯一方式。
上述中断指的是广义中断
3.2 中断、异常与系统异常
狭义的中断指来源于处理器之外的中断事件,即与当前运行指令无关的中断事件,如 I/O 中断、时钟中断、外部信号中断等
异常指当前运行指令引起的中断事件,如地址异常、算数异常、处理器硬件故障等
系统异常指陷入指令而触发系统调用引起的中断事件,如请求设备、请求 I/O、创建进程等
中断与异常的异同?
相同点:
都是程序执行过程中的强制性转移,转移到相应的处理程序。
中断是 CPU 以外的事件引起的,而异常来自 CPU 内部事件或程序执行中的事件引起的过程。中断是异步的,异常是同步的。
3.3 中断源
由处理器、内存储器、总线等硬件故障引起
处理原则为:保护现场、停止设备、停止 CPU、向操作员报告、等待人工干预
1 程序性中断事件(内部异常中断):
处理器执行机器指令引起
- 除数为 0、操作数溢出等算数异常
- 非法指令、用户态使用特权指令、地址越界、非法存取等指令异常
- 虚拟地址异常
2 自愿性中断事件(软中断):
处理器执行陷入指令请求 OS 服务引起;在操作系统中一般被称作系统调用
处理流程:陷入 OS、保护现场、根据功能号查入口地址、跳转具体处理程序
3 I/O 中断事件:
来源于外围设备报告 I/O 状态的中断事件
4 外部中断事件:
由外围设备发出的信号引起的中断事件(时钟中断、间隔时间中断;设备报到与结束中断;键盘鼠标信号中断;关机/重启中断)
4 中断系统
中断系统是计算机系统中响应和处理中断的系统,包括硬件子系统和软件子系统两部分,分别进行响应与处理。
4.1 中断响应处理与指令执行周期
在指令执行周期最后增加一个微操作,以影响中断
4.2 中断装置
指计算机系统中发现并响应中断/异常的硬件装置;由于中断源的多样性,硬件实现的中断装置有多种,分别处理不同类型的中断:
- 处理器外的中断
- 处理器内的异常
- 请求 OS 服务的系统异常
4.3 中断控制器
CPU 中的一个控制部件,包括中断控制逻辑线路和中断寄存器
- 外部设备向其发出中断请求 IRQ,在中断寄存器中设置已发生的中断
- 指令处理结束前,会检查中断寄存器,若有不被屏蔽的中断产生,则改变处理器内的操作顺序,引出操作系统中的中断处理程序
4.4 陷阱与系统陷阱
指令的逻辑和实现线路的一部分
- 执行指令出现异常后,会根据异常情况转向操作系统的异常处理程序
- 出现虚拟地址异常后,需要重新执行指令,往往越过陷阱独立设置页面异常处理程序
- 执行陷入指令后,越过陷阱处理,触发系统陷阱,激活系统调用处理程序
4.5 中断响应过程
- 发现中断源,提出中断请求
- 发现中断寄存器中记录的中断
- 决定这些中断是否应该屏蔽
- 根据优先级选择一个中断源响应
- 中断当前程序的执行(保存当前程序的 PSW/PC 到核心栈)
- 转向操作系统的中断处理程序
4.6 中断的处理
中断处理程序:主要任务是处理中断事件和恢复正常操作
中断处理过程:
- 保护未被硬件保护的处理器状态
- 通过分析被中断进程的 PSW 中断码字段,识别中断源
- 分别处理发生的中断事件
- 恢复正常操作
- 情况一:处理完毕后,直接返回刚刚被中断的进程
- 情况二:需要中断当前进程的运行,调整进程队列,启动进程调度,选择下一个执行的进程并恢复其执行
5 多中断的响应与处理
5.1 中断屏蔽
当计算机检测到中断时,中断装置通过中断屏蔽位决定是否响应已发生的中断。
5.2 中断优先级
当计算机同时检测到多个中断时,中断装置响应中断的顺序
一种可能的处理次序:
处理机硬件故障中断事件、自愿性中断事件、程序性中断事件、时钟中断等外部中断时间、输入输出中断事件、重启动和关机中断事件。
5.3 中断的嵌套处理
当计算机响应中断后,在中断处理过程中可以再响应其他中断。考虑到系统效率和实现代价,中断的嵌套应限制在一定层数内,如 3 层。
5.4 中断响应与处理总结
决定中断处理次序的因素:
- 中断屏蔽可以使中断装置不响应某些中断
- 中断优先级决定了中断装置响应中断的次序
- 中断可以嵌套处理,但嵌套的层数应有限制
- 中断的嵌套处理改变了中断处理的次序
6 进程及其状态
6.1 进程的提出
操作系统必须全方位地管理计算机系统中运行的程序,因此操作系统为正在运行程序建立一个管理实体——进程。
6.2 进程的概念
进程是一个具有一定独立功能的程序,是关于某个数据集合的一次运行活动;进程是操作系统进行资源分配和调度的一个独立单位。
一个进程包括五个实体部分:
- (OS 管理运行程序的)数据结构 P
- (运行程序的)内存代码 C
- (运行程序的)内存数据 D
- (运行程序的)通用寄存器
- (OS 控制程序执行的)程序状态字信息 PSW
6.3 进程举例
6.3.1 根据数据集
不同程序在不同数据集上运行:构成两个无关进程
不同程序在相同数据集上运行:构成两个共享数据的交往进程
6.3.2 根据代码
相同代码在不同数据集上运行:构成两个共享代码的无关进程
共享的代码称为可再入程序,如编辑器
可再入程序是纯代码的
6.3.3 内存级
前述的程序与数据集均是内存级的。
那么,在不同时段中针对同一个外存数据文件运行同一个外存程序文件,意味着完全不同的 P/C/D/R/Psw,所以两次运行构成两个不同的进程。
6.4 概念级的进程状态
运行态:进程占有处理器运行
就绪态:进程具备运行条件等待处理器运行
等待态:进程由于等待资源、输入输出、信号等而不具备运行条件
6.4.1 进程三态模型
6.4.2 进程挂起的概念
OS 无法预期进程的数目与资源需求,计算机系统在运行过程中可能出现资源不足的情况。
解决办法:剥夺某些进程的内存及其资源,调入 OS 管理的对换区,不参加进程调度,待适当时候再调入内存、恢复资源、参与运行。这就是进程挂起。
挂起态与等待态有着本质区别,后者占有已申请到的资源处于等待,前者没有任何资源。
6.4.3 进程挂起的选择与恢复
加入挂起的概念后,进程的形态模型变得更加复杂。
一些规则:
- 一般选择等待态进程进入挂起等待态,也可以选择就绪态进程进入挂起就绪态
- 运行态进程可以挂起自己
- 等待事件结束后,挂起等待态进入挂起就绪态
- 一般选择挂起就绪态进程予以恢复
6.5 进程的数据描述
6.5.1 进程控制块
进程控制块(PCB)是 OS 用于记录和刻画进程状态及环境信息的数据结构。借助 PCB,OS 可以全面管理进程的物理实体,刻画进程的执行现状,控制进程的执行。
要注意,在不同操作系统中,进程控制块包含的内容可能有所不同。
6.5.2 标识信息
用于存放唯一标识该进程的信息。包括:
- 系统分配的标识号
- 系统分配的进程组标识号
- 用户定义的进程名
- 用户定义的进程组名
进程组和会话
进程组(progress group)是进程的集合,可以由一个或多个进程组成。默认情况下,父进程与子进程属于同一个进程组。如果子进程想要脱离当前进程组,可以通过调用setpgid
创建一个新的进程组或者移入已有的进程组。进程组的一大作用体现在对信号的处理上。应用程序可以通过killpg
向进程组发送信号,这个信号会被发送给这个进程组的每个进程。
会话(session)是进程组的集合,可以由一个或多个进程组构成。会话将进程组根据执行状态分为前台进程组和后台进程组。控制终端进程是会话与外界进行交互的窗口,负责接收从用户发来的输入。
6.5.3 现场信息
用于存放该进程运行时的处理器现场信息。
- 用户可见寄存器内容:数据寄存器、地址寄存器
- 控制与状态寄存器内容:PC、IR、PSW
- 栈指针内容:核心栈与用户栈指针
6.5.4 控制信息
如上图
6.5.5 内存映像
某一时刻进程的内容及其执行状态集合:
- 进程控制块:保存进程的标识信息、状态信息和控制信息
- 进程程序块:进程执行的程序空间
- 进程数据块:进程处理的数据空间,包括数据、处理函数的用户栈和可修改的程序
- 核心栈:进程在内核模式下运行时使用的堆栈,中断或系统过程使用
进程映像是内存级的物理实体,又称为进程的内存映像。
6.5.6 进程上下文
进程的执行需要环境支持,包括 CPU 现场和 Cache 中的执行信息。OS 中的进程物理实体和支持进程运行的环境合成进程上下文,包括以下:
- 用户级上下文:用户进程块/用户数据区/用户栈/用户共享内存
- 寄存器上下文:PSW/栈指针/通用寄存器
- 系统级上下文:PCB/内存区表/核心栈
当操作系统需要切换当前执行的进程时,就会使用上下文切换机制。该机制会将前一个进程的寄存器状态保存到 PCB 中,然后将下一个进程先前保存的状态写入寄存器,从而切换到该进程执行。
在早期的操作系统中,进程是操作系统调度的基本单位。但随着更加轻量级的运行抽象——线程的提出,调度和上下文切换的基本单位也由进程变为线程。
6.6 进程的管理
6.6.1 概念级的 OS 进程管理软件
关键的进程管理软件包括:
- 系统调用/中断/异常处理程序
- 队列管理模块
- 进程控制程序
- 进程调度程序
- 进程通信程序
- 终端登录与作业控制程序、性能监控程序、审计程序等外围程序
6.6.2 进程实现的队列模型
6.6.3 队列管理模块
- 队列管理模块是操作系统实现进程管理的核心模块。操作系统建立多个进程队列,包括就绪队列和等待队列。
- 按需组织为先进先出队列与优先队列,队列中的进程可以通过 PCB 中的队列指引元采用单/双指引元或索引连接。
- 进程与资源调度围绕进程队列展开。
6.6.4 进程的控制与管理
- 进程创建:进程表加一项,申请 PCB 并初始化,生成标识,建立映像,分配资源,移入就绪队列
- 进程撤销:从队列中移除,归还资源,撤销标识,回收 PCB,移除进程表项
- 进程阻塞:保存现场信息,修改 PCB,移入等待队列,调度其他进程执行
- 进程唤醒:等待队列中移出,修改 PCB,移入就绪队列(该进程优先级高于运行进程触发抢占)
- 进程挂起:修改状态并出入相关队列,收回内存等资源送至对换区
- 进程激活:分配内存,修改状态并出入相关队列
- 其他:如修改进程特权
6.6.5 原语与进程控制原语
进程控制过程中涉及对 OS 核心数据结构(进程表/PCB 池/队列/资源表)的修改,为了防止与时间有关的错误,应使用原语。原语是由若干条指令构成的完成某种特定功能的程序,执行上具有不可分割性。原语的执行可以通过关中断实现。
进程控制使用的原语成为进程控制原语,另一类常用原语是进程通信原语。
6.7 进程切换
进程切换指从正在运行的过程中收回处理器,让待运行进程来占有处理器运行。
进程切换实质上就是被中断运行进程与待运行进程的上下文切换,处理过程如下:
- 保存被中断进程的上下文
- 转向进程调度
- 恢复待运行进程的上下文
6.7.1 模式切换
进程切换必须在操作系统内核模式下完成,这就需要模式切换。模式切换又称处理器状态切换,包括:
- 用户模式到内核模式
- 内核模式到用户模式
6.7.2 模式切换的基本工作任务
中断装置完成正向模式切换,包括:
- 处理器模式转为内核模式
- 保存当前进程的 PC/PSW 值到核心栈
- 转向中断/异常/系统调用处理程序
中断返回指令完成逆向模式转换,包括: - 从待运行进程核心栈中弹出 PSW/PC 值
- 处理器模式转为用户模式
6.7.3 进程切换的工作过程
- (中断/异常等触发) 正向模式切换并压入 PSW/PC
- 保存被中断进程的现场信息
- 处理具体中断/异常
- 把被中断进程的系统堆栈指针 SP 值保存到 PCB
- 调整被中断进程的 PCB 信息,如进程状态
- 把被中断进程的 PCB 加入相关队列
- 选择下一个占用 CPU 运行的进程
- 修改被选中进程的 PCB 信息,如进程状态
- 设置被选中进程的地址空间,恢复存储管理信息
- 恢复被选中进程的 SP 值到处理器寄存器 SP
- 恢复被选中进程的现场信息进入处理器
- (中断返回指令触发) 逆向模式转换并弹出 PSW/PC
6.7.4 进程切换的发生时机
进程切换一定发生在中断/异常/系统调用处理过程中,常见的情况是:
- 阻塞式系统调用、虚拟地址异常导致终端进程进入等待态
- 时间片中断、I/O 中断后发现更高优先级进程导致被中断进程转入就绪态
- 终止用系统调用、不能继续执行的异常导致被中断进程进入终止态
6.7.5 进程切换与模式切换
一些中断/异常不会引起进程状态转换,不会引起进程切换,只是在处理完成后把控制权交回给被中断进程,处理流程是:
- (中断/异常触发) 正向模式切换压入 PSW/PC
- 保存被中断进程的现场信息
- 处理中断/异常
- 恢复被中断进程的现场信息
- (中断返回指令触发) 逆向模式转换弹出 PSW/PC
7 多线程技术概述
7.1 多线程环境概述
7.1.1 单线程结构进程
传统进程是单线程结构进程。
单线程结构进程的问题
单线程结构进程在并发程序设计上的问题:
- 进程切换开销大
- 进程通信开销大
- 限制了进程并发的粒度
- 降低了并行计算的效率
解决思路:
- 把进程的两项功能,即“独立分配资源”和“被调度分派执行”分离开来
- 进程作为系统资源分配和保护的独立单位,不需要频繁切换
- 线程作为系统调度和分派的基本单位,能轻装运行,会被频繁地调度和切换
- 线程的出现会减少进程并发执行所付出的时空开销,使得并发力度更细、并发性更好
7.1.2 多线程结构进程
多线程环境下进程的概念
在多线程环境中,进程是操作系统中进行保护和分配资源的独立单位。具有:
- 用来容纳进程映像的虚拟地址空间
- 对进程、文件和设备的存取保护机制
多线程环境下线程的概念
线程是进程的一条执行路径,是调度的基本单位,同一个进程中的所有线程共享进程获得的主存空间和资源。具有:
- 线程执行状态
- 受保护的线程上下文,当线程不运行时,用于存储现场信息
- 独立的程序指令计数器
- 执行堆栈
- 容纳局部变量的静态存储器
7.1.3 多线程环境下线程的状态与调度
线程状态有运行、就绪和睡眠,无挂起
与线程状态变化有关的线程操作有:孵化、封锁、活化、剥夺、指派、结束
OS 感知线程环境下:
- 处理器调度的对象是线程
- 进程没有三状态(只有挂起态)
OS 不感知线程环境下: - 处理器调度对象仍是进程
- 用户空间中的用户调度程序调度线程
7.1.4 并发多线程程序设计的优点
- 快速线程切换
- 减少(系统)管理开销
- 线程通信易于实现
- 并行程度提高
- 节省内存空间
7.1.5 多线程技术的应用
- 前台和后台工作
- C/S 应用模式
- 加快执行速度
- 设计用户接口
7.2 KLT 与 ULT
7.2.1 内核级线程 KLT
县城管理的所有工作由 OS 内核来做,OS 提供一个应用程序接口 API,供开发者使用 KLT,OS 直接调度 KLT。
特点
- 进程中的一个线程被阻塞了,内核能调度同一进程的其他线程占有处理器运行
- 多处理器环境中,内核能同时调度同一进程中多个线程并行执行
- 内核自身也可用多线程技术实现,能提高操作系统的执行速度和效率
- 应用程序线程在用户态运行,线程调度和管理在内核实现,在同一进程中,控制权从一个线程传送到另一个线程时需要模式切换,系统开销较大
7.2.2 用户级线程 ULT
用户空间运行的线程库,提供多线程引用程序的开发和运行支撑环境,任何应用程序均需通过线程库尽兴程序设计,再与线程库连接后运行。县城管理的所有工作都有应用程序完成,内核没有意识到线程的存在。
特点
- 所有线程管理数据结构均在进程的用户空间中,线程切换不需要内核模式,能节省模式切换开销和内核的宝贵资源
- 允许进程按应用特定需要选择调度算法,甚至根据应用需求裁剪调度算法
- 能运行在任何 OS 上,内核在支持 ULT 方面不需要做任何工作
- 不能利用多处理器的优点,OS 调度进程,仅有一个 ULT 能执行
- 一个 ULT 的阻塞,将引起整个进程的阻塞
7.2.3 Jacketing 技术
把阻塞式系统调用改造成非阻塞式,当线程陷入系统调用时,执行 Jacketing 程序,由 Jacketing 程序来检查资源使用情况,以决定是否执行进程切换或传递控制权给另一个线程。
7.2.4 用户级线程 vs 内核级线程
ULT 适用于解决逻辑并行问题;KLT 适用于解决物理并行问题
7.2.5 多线程实现的混合式策略
线程创建时完全在用户空间做的,单应用的多个 ULT 可以映射成一些 KLT,通过调整 KLT 数目,可以达到较好的并行效果。
特点
- 组合用户级线程/内核级线程设施
- 线程创建完全在用户控件中完成,线程调度和同步也在应用程序中尽兴
- 一个应用中的多个用户级线程被映射到一些(小于等于用户及线程数目)内核级线程上
- 程序员可以针对特定应用和及其调节内核级现成的数目,以达到整体的最佳结果
- 该方法将会结合纯粹用户及线程方法和内核级线程方法的有点,同时减少它们的缺点
7.2.6 线程混合策略下的线程状态
- KLT 三态,系统调用负责
- ULT 三态,用户调用负责
- 活跃态 ULT 代表绑定 KLT 的三态
- 活跃态 ULT 运行时可激活用户调用
- 非阻塞系统调用可使用 Jacketing 启动用户调度,调整活跃态 ULT
7.2.7 多线程实现的各种策略总结
8 处理器调度
8.1 处理器调度的层次
- 高级调度:又称长程调度,作业调度;决定能否加入到执行的进程池中
- 中级调度:又称平衡负载调度;决定主存中的可用进程集合
- 低级调度:又称短程调度,进程调度;决定哪个可用进程占用处理器执行