408 · 操作系统 · 第 1 章

计算机系统概述

这一章回答一个问题:多个程序同时跑在一台机器上,OS 怎么既给它们提供服务,又不让它们乱来。答案是一套硬件机制:危险指令只许内核执行,CPU 用 PSW 里的一位记住自己是什么身份,想进内核只能走中断和异常这一道门。

特权指令怎么判断会影响别的进程或整个系统的(改 PSW、开关中断、I/O、写时钟、改页表基址)是特权指令;只影响自己的不是
用户态 → 内核态只有一道门中断或异常(包括执行陷入指令)。反过来,内核执行一条特权指令改 PSW 就回到用户态
返回到哪条指令故障(缺页)返回当前指令重新执行;陷入返回下一条;终止不返回
一 · 演进导图

每一步都在解决上一步留下的问题

操作系统管理硬件和软件资源、给用户和程序提供接口的系统软件;最基本的特征是并发和共享
发展历程:让 CPU 别闲着,再让人等得少每一代都在压榨上一代浪费掉的时间

手工操作

做法
用户独占全机,自己装纸带、按开关
新问题
人机矛盾:人装卸纸带时 CPU 全在等,机器越快浪费越严重

单道批处理

做法
作业成批放在磁带上,监督程序自动一个接一个运行
解决
去掉了人工装卸的等待
新问题
内存只有一道程序,它做 I/O 时 CPU 仍然空等

多道批处理

OS 正式诞生
做法
内存同时放多道,一道等 I/O 时 CPU 切去跑另一道
解决
资源利用率高、吞吐量大
新问题
缺乏交互性:作业交上去就不能干预;响应时间长

分时系统

做法
CPU 时间切成时间片,轮流给各终端用户
解决
人机交互:及时接收、及时处理
新问题
人人平等,紧急任务没法优先

实时系统

做法
按截止时间处理,紧急任务可抢占
强调
及时性和可靠性;分硬实时(导弹控制)和软实时(订票系统)
运行机制:多道并发之后,OS 怎么管住程序多个程序同时在内存里,一个出错不能拖垮别人

问题:谁都能执行任何指令

后果
用户程序能关中断霸占 CPU、直接读写磁盘、改别人的内存

特权指令 + 两种 CPU 状态

内核态用户态
做法
危险指令定为特权指令,只有内核态能执行;PSW 里一位记录当前状态
新问题
用户程序确实要 I/O,怎么进内核?OS 又怎么从用户程序手里拿回 CPU?

中断与异常

做法
用户态进内核态的唯一入口;时钟中断定时把 CPU 交还 OS
代价
每次都要保存、恢复断点和现场

系统调用

做法
用户程序传好参数,执行陷入指令,主动请求内核服务
代价
一次调用两次状态切换,比普通函数调用慢

内核结构

取舍
内核里功能多(大内核)则快;功能少(微内核)则可靠易扩展,但切换更频繁

虚拟机

做法
把整台机器也虚拟化:客户 OS 以为自己在内核态,执行特权指令时陷入 VMM 代为模拟

下一步 → 第 2 章 进程与线程:多道程序要轮流用 CPU,OS 用 PCB 记住每道程序跑到哪儿;进程切换正是在内核态、借时钟中断或系统调用完成的。

二 · 概念、特征与接口

OS 是资源的管理者,也是用户和硬件之间的接口

OS 控制和管理整个计算机系统的软硬件资源,合理组织调度工作和资源分配,为用户和其他软件提供方便的接口。它有三个身份:资源管理者(处理机、存储器、文件、设备四大管理)、用户与硬件之间的接口、扩充机器(把裸机包装成更好用的虚拟机器)。

最基本

并发

多个事件在同一时间间隔内发生。

单核 CPU 上宏观同时、微观交替。OS 的并发靠引入进程实现。

最基本

共享

资源可供内存中多个并发进程共同使用。

互斥共享:一段时间只给一个进程(打印机,即临界资源);同时访问:宏观同时(磁盘文件)。

虚拟

把一个物理实体变成若干逻辑对应物。

时分复用:虚拟处理机、虚拟设备(SPOOLing);空分复用:虚拟存储器。

异步

进程走走停停,推进速度不可预知。

但只要运行环境相同,多次运行结果必须相同,这由 OS 保证。

并发 vs 并行

单核
A
B
A
B
A
B
核 1
A 一直在跑
核 2
B 一直在跑

并发:同一时间间隔内都在推进,某一时刻只有一个在跑(第一行)。并行:同一时刻真的同时跑,需要多核或多个部件(下两行)。单核只能并发,不能并行。

四个特征之间的关系

并发和共享互为存在条件。

  • 没有并发,内存里只有一个程序,共享就无从谈起;
  • 没有共享(资源不能被多个进程轮流使用),程序就不能并发执行。
  • 虚拟和异步都以并发为前提:没有并发,就用不着把一个 CPU 虚拟成多个;也不会有“走走停停”。

OS 提供给用户的接口

接口给谁用形式要点
命令接口 · 联机用户(交互式)终端上敲命令,说一句做一句也叫交互式命令接口,如 shell 命令
命令接口 · 脱机用户(批处理)作业控制说明书,一堆命令一次交上去用户不能中途干预,也叫批处理命令接口
程序接口程序员(只能在程序里用)系统调用,也叫广义指令程序获得 OS 服务的唯一途径;见第六节
图形接口 GUI用户窗口、图标、鼠标最终也是通过调用程序接口(系统调用)实现
三 · 发展历程

从单道到多道:CPU 不再陪着 I/O 一起等

两个程序 A、B,每个都是“计算 10 ms → I/O 10 ms → 计算 10 ms”。看单道和多道各要多久。

单道批处理:A 做完才轮到 B

CPU
A
空闲
A
B
空闲
B
I/O
A
B
0204060 ms

总用时 60 ms,CPU 忙 40 ms,利用率 40 ÷ 60 ≈ 66.7%。

多道批处理:A 做 I/O 时 CPU 去跑 B

CPU
A
B
A
B
已全部完成
I/O
A
B
0204060 ms

总用时 40 ms,CPU 忙 40 ms,利用率 100%。CPU 和 I/O 设备并行工作了。

系统特点解决了什么留下的问题
手工操作用户独占全机—人机矛盾,资源利用率极低
单道批处理自动性、顺序性、单道性缓解人机矛盾CPU 等 I/O,资源利用率仍低
多道批处理多道;宏观上并行,微观上串行资源利用率高、吞吐量大无人机交互,平均周转时间长
分时系统同时性(多路性)、交互性、独立性、及时性人机交互,及时接收、及时处理用户命令不能优先处理紧急任务
实时系统及时性、可靠性在截止时间内完成紧急任务资源利用率不是首要目标

其他类型:网络操作系统(资源共享与通信)、分布式操作系统(各计算机地位平等,分布性和并行性)、个人计算机操作系统。

四 · 运行机制

一位模式位,把 CPU 分成两种身份

CPU 靠 PSW(程序状态字寄存器)里的模式位区分当前状态。内核态能执行全部指令,用户态只能执行非特权指令;用户态下执行特权指令会引发异常,交给 OS 处理。

用户态(目态) 运行应用程序
  • 只能执行非特权指令
  • 取数、存数、算术运算、跳转、陷入指令、读时钟
用户态 → 内核态只能通过中断或异常包括执行陷入指令引发的内中断。由硬件自动完成:保存断点,修改 PSW。
内核态 → 用户态执行一条特权指令修改 PSW典型是中断返回指令:把保存的旧 PSW 恢复回去,模式位回到用户态。
内核态(管态 / 核心态) 运行内核程序
  • 特权指令和非特权指令都能执行
  • 关中断、开中断、I/O 指令、置时钟、修改 PSW、改页表基址、清 TLB

为什么要有特权指令

多道程序共用一台机器。如果用户程序能关中断,它就能一直占着 CPU;能直接发 I/O 指令,就能绕过 OS 读别人的文件;能改 PSW,就能自己给自己升权限。所以这些指令只给 OS 用。

判断口诀:会影响其他进程或全系统的,是特权指令;只读不改、只影响自己的,不是。

内核里放些什么(都在内核态运行)

  • 时钟管理:计时;时钟中断是时间片轮转和进程切换的基础。
  • 中断机制:OS 的各项工作都靠中断驱动,内核只负责保护恢复现场、转交控制权等少量工作。
  • 原语:最接近硬件的一段小程序,运行具有原子性(靠关中断实现),运行时间短、调用频繁。
  • 系统控制的数据结构及处理:PCB、页表等,以及进程管理、存储器管理、设备管理。
五 · 中断与异常

看来源:CPU 外面来的是中断,指令自己惹的是异常

中断让 OS 在用户程序运行时也能拿回 CPU。没有中断,就没有并发,也就没有现代 OS。

外中断(中断) 来自 CPU 外部,与当前执行的指令无关。每条指令执行完后检查有没有中断请求。
I/O 中断键盘输入完成、磁盘读完、打印机缺纸
时钟中断时间片到,OS 借此做调度
还可以按能否被屏蔽分为可屏蔽中断(INTR)和不可屏蔽中断(NMI,如掉电)。
内中断(异常、例外) 来自 CPU 内部,由当前执行的指令引起,在指令执行过程中被发现。
陷入 trap有意安排的:执行陷入(访管)指令,实现系统调用返回下一条指令
故障 fault指令执行引起的错误,可能被修复:缺页;非法操作码、除数为 0、溢出也归入此类修复后返回当前指令重新执行
终止 abort不可恢复的致命错误:控制器出错、存储器校验错不返回,终止程序

中断处理流程:前三步是硬件,后面是软件

硬件 · 中断隐指令(CPU 响应中断时自动完成,不是指令系统里的一条指令;PSW 同时切到内核态)
  1. 关中断:保存断点期间不能被别的中断打断
  2. 保存断点:把返回地址(PC)存起来;旧 PSW 也在此时一起保存
  3. 引出中断服务程序:按中断向量找到服务程序入口地址,送进 PC
软件 · 中断服务程序(在内核态执行)
  1. 保存现场和屏蔽字:通用寄存器等压栈
  2. 开中断 多重中断才有:允许更高级的中断打进来
  3. 执行中断服务程序:真正干活
  4. 关中断 多重中断才有:恢复现场时不能被打断
  5. 恢复现场和屏蔽字
  6. 开中断
  7. 中断返回:执行中断返回指令(特权指令),断点和旧 PSW 回到寄存器,回到被打断的程序

为什么断点必须由硬件保存

断点就是 PC。只要中断服务程序的第一条指令一执行,PC 就变了,软件再去保存已经来不及。所以保存 PC 必须在跳转之前由硬件完成。

断点 vs 现场

断点:回到哪儿(PC,连同旧 PSW),硬件保存。现场:回来时各寄存器的样子(通用寄存器等),服务程序用软件保存。王道计组把 PSW 也算进“现场”,两种说法都会见到,核心结论不变:PC 一定是硬件保存的。

六 · 系统调用 · 单步动画

调用在用户态,处理在内核态

系统调用 = 传参 → 执行陷入指令 → 内核处理 → 返回。下面以 Linux 32 位的 read(fd, buf, 64) 为例(系统调用号 3,陷入指令 int 0x80)。页面打开时停在最后一步,可以点“重置”从头走,也可以点右侧任意一步。

PSW(示意:M = 1 表示内核态)
这一步由谁完成
内核栈(上方是栈顶)
      U 用户态K 内核态硬件 中断隐指令等硬件动作软件 内核程序

      易错:陷入指令是非特权指令

      它本来就是给用户程序进内核用的,必须能在用户态执行。执行陷入指令在用户态,执行之后 CPU 才转入内核态;系统调用的处理在内核态。“陷入指令是特权指令”是常见错误选项。

      系统调用 vs 库函数

      库函数不一定用系统调用:sqrt() 在用户态就算完;printf() 要输出到屏幕,最终调用 write 系统调用。系统调用按功能分:设备管理、文件管理、进程控制、进程通信、内存管理。

      七 · 动手分 · 特权指令与内核态

      一条指令是不是特权,一个事件会不会进内核

      每项只能答一次,点完立刻给出判定和理由。卡片右上角写着这题问的是哪一类。

      八 · 内核结构

      内核里放多少功能:放得多就快,放得少就稳

      结构做法优点缺点
      大内核(宏内核)OS 主要功能(进程、内存、文件、设备管理)都放在内核,都在内核态运行各模块直接互相调用,性能高内核庞大、结构混乱,难维护;一个模块出错可能拖垮整个内核
      微内核内核只留最基本功能:时钟管理、中断处理、原语(进程/线程管理、低级存储管理、进程通信);文件系统、设备驱动等放到用户态的服务器进程扩展性、可靠性、可移植性好;一个服务崩溃不影响内核;适合分布式服务之间要靠内核转发消息,用户态和内核态频繁切换,性能差
      分层结构OS 分成若干层,每层只能调用紧邻的低层便于调试和验证(自底向上逐层调试);易扩充维护层次难划分;逐层调用,效率低
      模块化按功能分成模块,模块间通过接口通信;可动态加载内核模块结构清晰,可并行开发,适应性强模块间接口难以满足实际需求;各模块同时设计,决策顺序无法建立在已验证的基础上,正确性难保证
      外核(exokernel)内核负责进程调度、通信等;外核把未经抽象的硬件资源直接分给用户进程,并保证使用安全应用可以按需使用硬件,少了抽象映射层,效率高降低系统一致性,系统更复杂

      大内核:一次文件读请求

      路径
      应用
      内核:文件系统 + 驱动
      应用

      进一次内核就全办完,2 次状态切换。

      微内核:同一个请求(示意)

      路径
      应用
      内核
      文件服务
      内核
      应用

      文件服务在用户态,请求和结果都靠内核转发消息,切换次数成倍增加。实际系统可能还要再经过驱动服务,切换更多。

      九 · 操作系统引导与虚拟机

      开机:从 ROM 里的一小段程序,一路把内核接力搬进内存

      OS 平时存在磁盘上,内存(RAM)断电就清空,所以开机时必须有一段放在 ROM 里的程序先跑起来,再一级一级找到并加载内核。

      1. 激活 CPU通电后 CPU 从固定地址开始执行ROM
      2. 执行 BIOS / UEFI固件程序,负责后续的自检和引导ROM
      3. 硬件自检 POST检查内存、显卡等硬件是否正常ROM
      4. 加载 MBR读启动盘的主引导记录:主引导程序 + 分区表磁盘 0 号扇区
      5. 扫描分区表主引导程序找到活动分区(装有 OS 的分区)MBR
      6. 加载分区引导记录 PBR活动分区的第一个扇区,负责找到启动管理器活动分区首扇区
      7. 加载启动管理器 → 内核把内核装入内存,内核完成初始化后接管机器分区内文件

      UEFI 配合 GPT 分区时不读 MBR 里的引导代码,而是直接从 EFI 系统分区加载引导程序;408 按上面的 BIOS + MBR 流程考。

      虚拟机:两类 VMM(虚拟机管理程序)

      对比项第一类 VMM(裸金属)第二类 VMM(寄居型)
      跑在哪直接运行在硬件上,本身就像一个 OS运行在宿主 OS 之上,是宿主上的一个普通程序
      运行模式VMM 运行在最高特权级(内核态);客户 OS 实际运行在用户态(“虚拟内核态”),执行特权指令时陷入 VMM 模拟VMM 部分在用户态、部分在内核态;客户 OS 的系统调用被 VMM 截获,转成对宿主 OS 的系统调用
      物理资源控制权直接控制和分配物理资源依赖宿主 OS 分配资源
      资源分配方式直接划分未经抽象的物理资源(类似外核)客户 OS 的虚拟磁盘是宿主文件系统里的一个大文件;分到的内存是宿主的虚拟内存
      性能更好更差,多一层宿主 OS 当中介
      可支持的虚拟机数量更多,不用和宿主 OS 抢资源更少
      可迁移性更差更好,导出虚拟机镜像文件即可
      例子VMware ESXi、Xen、Hyper-VVMware Workstation、VirtualBox
      十 · 易错速记 & 速查表

      选择题直接对表

      类型来源与当前指令有关?例子处理完返回到哪
      外中断 · I/O 中断CPU 外部(设备控制器)无关键盘输入完成、磁盘读完被打断程序的下一条指令(当前指令执行完才响应)
      外中断 · 时钟中断CPU 外部(时钟部件)无关时间片到下一条指令(或调度去运行别的进程)
      内中断 · 陷入 trapCPU 内部,有意安排有关执行陷入 / 访管指令(系统调用)下一条指令
      内中断 · 故障 faultCPU 内部,指令执行出错有关缺页;非法操作码、除数为 0、溢出当前指令重新执行(修复成功时)
      内中断 · 终止 abortCPU 内部,致命硬件错误有关控制器出错、存储器校验错不返回,终止程序
      动作在哪个态执行一句话
      执行陷入指令用户态非特权指令;执行后才进入内核态
      系统调用的处理(服务例程)内核态由内核完成,可能让进程阻塞
      库函数(如 sqrt)用户态不涉及资源管理就不用进内核
      中断服务程序、进程切换、缺页处理内核态都要改内核数据结构
      中断返回指令内核态特权指令;执行后恢复旧 PSW,回到用户态
      陷入指令不是特权指令它在用户态执行,作用是引发内中断进入内核。广义指令(系统调用)的调用在用户态,处理在内核态。
      读时钟 vs 写时钟读时钟非特权;写时钟(设置时钟)是特权。I/O 指令、关中断、置 PSW、清 TLB 都是特权。
      唯一入口用户态进内核态只能靠中断或异常;内核态回用户态靠执行特权指令修改 PSW。
      响应时机不同外中断在每条指令执行结束后检查;异常在指令执行过程中发现。
      断点靠硬件关中断、保存断点、引出服务程序由中断隐指令(硬件)完成;保存现场由软件完成。
      并发 ≠ 并行并发是同一时间间隔,并行是同一时刻。单核只能并发。并发和共享互为存在条件。
      三种系统各强调什么多道批处理:利用率高但无交互;分时:交互性,及时接收及时处理;实时:及时性和可靠性。
      微内核的代价可靠、易扩展,但频繁在用户态和内核态之间切换,性能不如大内核。
      两类虚拟机第一类直接跑在硬件上,性能好;第二类跑在宿主 OS 上,迁移方便。
      引导顺序BIOS(ROM)→ 自检 → MBR(0 号扇区)→ 分区表找活动分区 → PBR → 启动管理器 → 内核。