并发
多个事件在同一时间间隔内发生。
单核 CPU 上宏观同时、微观交替。OS 的并发靠引入进程实现。
这一章回答一个问题:多个程序同时跑在一台机器上,OS 怎么既给它们提供服务,又不让它们乱来。答案是一套硬件机制:危险指令只许内核执行,CPU 用 PSW 里的一位记住自己是什么身份,想进内核只能走中断和异常这一道门。
OS 控制和管理整个计算机系统的软硬件资源,合理组织调度工作和资源分配,为用户和其他软件提供方便的接口。它有三个身份:资源管理者(处理机、存储器、文件、设备四大管理)、用户与硬件之间的接口、扩充机器(把裸机包装成更好用的虚拟机器)。
多个事件在同一时间间隔内发生。
单核 CPU 上宏观同时、微观交替。OS 的并发靠引入进程实现。
资源可供内存中多个并发进程共同使用。
互斥共享:一段时间只给一个进程(打印机,即临界资源);同时访问:宏观同时(磁盘文件)。
把一个物理实体变成若干逻辑对应物。
时分复用:虚拟处理机、虚拟设备(SPOOLing);空分复用:虚拟存储器。
进程走走停停,推进速度不可预知。
但只要运行环境相同,多次运行结果必须相同,这由 OS 保证。
并发:同一时间间隔内都在推进,某一时刻只有一个在跑(第一行)。并行:同一时刻真的同时跑,需要多核或多个部件(下两行)。单核只能并发,不能并行。
并发和共享互为存在条件。
| 接口 | 给谁用 | 形式 | 要点 |
|---|---|---|---|
| 命令接口 · 联机 | 用户(交互式) | 终端上敲命令,说一句做一句 | 也叫交互式命令接口,如 shell 命令 |
| 命令接口 · 脱机 | 用户(批处理) | 作业控制说明书,一堆命令一次交上去 | 用户不能中途干预,也叫批处理命令接口 |
| 程序接口 | 程序员(只能在程序里用) | 系统调用,也叫广义指令 | 程序获得 OS 服务的唯一途径;见第六节 |
| 图形接口 GUI | 用户 | 窗口、图标、鼠标 | 最终也是通过调用程序接口(系统调用)实现 |
两个程序 A、B,每个都是“计算 10 ms → I/O 10 ms → 计算 10 ms”。看单道和多道各要多久。
总用时 60 ms,CPU 忙 40 ms,利用率 40 ÷ 60 ≈ 66.7%。
总用时 40 ms,CPU 忙 40 ms,利用率 100%。CPU 和 I/O 设备并行工作了。
| 系统 | 特点 | 解决了什么 | 留下的问题 |
|---|---|---|---|
| 手工操作 | 用户独占全机 | — | 人机矛盾,资源利用率极低 |
| 单道批处理 | 自动性、顺序性、单道性 | 缓解人机矛盾 | CPU 等 I/O,资源利用率仍低 |
| 多道批处理 | 多道;宏观上并行,微观上串行 | 资源利用率高、吞吐量大 | 无人机交互,平均周转时间长 |
| 分时系统 | 同时性(多路性)、交互性、独立性、及时性 | 人机交互,及时接收、及时处理用户命令 | 不能优先处理紧急任务 |
| 实时系统 | 及时性、可靠性 | 在截止时间内完成紧急任务 | 资源利用率不是首要目标 |
其他类型:网络操作系统(资源共享与通信)、分布式操作系统(各计算机地位平等,分布性和并行性)、个人计算机操作系统。
CPU 靠 PSW(程序状态字寄存器)里的模式位区分当前状态。内核态能执行全部指令,用户态只能执行非特权指令;用户态下执行特权指令会引发异常,交给 OS 处理。
多道程序共用一台机器。如果用户程序能关中断,它就能一直占着 CPU;能直接发 I/O 指令,就能绕过 OS 读别人的文件;能改 PSW,就能自己给自己升权限。所以这些指令只给 OS 用。
判断口诀:会影响其他进程或全系统的,是特权指令;只读不改、只影响自己的,不是。
中断让 OS 在用户程序运行时也能拿回 CPU。没有中断,就没有并发,也就没有现代 OS。
断点就是 PC。只要中断服务程序的第一条指令一执行,PC 就变了,软件再去保存已经来不及。所以保存 PC 必须在跳转之前由硬件完成。
断点:回到哪儿(PC,连同旧 PSW),硬件保存。现场:回来时各寄存器的样子(通用寄存器等),服务程序用软件保存。王道计组把 PSW 也算进“现场”,两种说法都会见到,核心结论不变:PC 一定是硬件保存的。
系统调用 = 传参 → 执行陷入指令 → 内核处理 → 返回。下面以 Linux 32 位的 read(fd, buf, 64) 为例(系统调用号 3,陷入指令 int 0x80)。页面打开时停在最后一步,可以点“重置”从头走,也可以点右侧任意一步。
它本来就是给用户程序进内核用的,必须能在用户态执行。执行陷入指令在用户态,执行之后 CPU 才转入内核态;系统调用的处理在内核态。“陷入指令是特权指令”是常见错误选项。
库函数不一定用系统调用:sqrt() 在用户态就算完;printf() 要输出到屏幕,最终调用 write 系统调用。系统调用按功能分:设备管理、文件管理、进程控制、进程通信、内存管理。
每项只能答一次,点完立刻给出判定和理由。卡片右上角写着这题问的是哪一类。
| 结构 | 做法 | 优点 | 缺点 |
|---|---|---|---|
| 大内核(宏内核) | OS 主要功能(进程、内存、文件、设备管理)都放在内核,都在内核态运行 | 各模块直接互相调用,性能高 | 内核庞大、结构混乱,难维护;一个模块出错可能拖垮整个内核 |
| 微内核 | 内核只留最基本功能:时钟管理、中断处理、原语(进程/线程管理、低级存储管理、进程通信);文件系统、设备驱动等放到用户态的服务器进程 | 扩展性、可靠性、可移植性好;一个服务崩溃不影响内核;适合分布式 | 服务之间要靠内核转发消息,用户态和内核态频繁切换,性能差 |
| 分层结构 | OS 分成若干层,每层只能调用紧邻的低层 | 便于调试和验证(自底向上逐层调试);易扩充维护 | 层次难划分;逐层调用,效率低 |
| 模块化 | 按功能分成模块,模块间通过接口通信;可动态加载内核模块 | 结构清晰,可并行开发,适应性强 | 模块间接口难以满足实际需求;各模块同时设计,决策顺序无法建立在已验证的基础上,正确性难保证 |
| 外核(exokernel) | 内核负责进程调度、通信等;外核把未经抽象的硬件资源直接分给用户进程,并保证使用安全 | 应用可以按需使用硬件,少了抽象映射层,效率高 | 降低系统一致性,系统更复杂 |
进一次内核就全办完,2 次状态切换。
文件服务在用户态,请求和结果都靠内核转发消息,切换次数成倍增加。实际系统可能还要再经过驱动服务,切换更多。
OS 平时存在磁盘上,内存(RAM)断电就清空,所以开机时必须有一段放在 ROM 里的程序先跑起来,再一级一级找到并加载内核。
UEFI 配合 GPT 分区时不读 MBR 里的引导代码,而是直接从 EFI 系统分区加载引导程序;408 按上面的 BIOS + MBR 流程考。
| 对比项 | 第一类 VMM(裸金属) | 第二类 VMM(寄居型) |
|---|---|---|
| 跑在哪 | 直接运行在硬件上,本身就像一个 OS | 运行在宿主 OS 之上,是宿主上的一个普通程序 |
| 运行模式 | VMM 运行在最高特权级(内核态);客户 OS 实际运行在用户态(“虚拟内核态”),执行特权指令时陷入 VMM 模拟 | VMM 部分在用户态、部分在内核态;客户 OS 的系统调用被 VMM 截获,转成对宿主 OS 的系统调用 |
| 物理资源控制权 | 直接控制和分配物理资源 | 依赖宿主 OS 分配资源 |
| 资源分配方式 | 直接划分未经抽象的物理资源(类似外核) | 客户 OS 的虚拟磁盘是宿主文件系统里的一个大文件;分到的内存是宿主的虚拟内存 |
| 性能 | 更好 | 更差,多一层宿主 OS 当中介 |
| 可支持的虚拟机数量 | 更多,不用和宿主 OS 抢资源 | 更少 |
| 可迁移性 | 更差 | 更好,导出虚拟机镜像文件即可 |
| 例子 | VMware ESXi、Xen、Hyper-V | VMware Workstation、VirtualBox |
| 类型 | 来源 | 与当前指令有关? | 例子 | 处理完返回到哪 |
|---|---|---|---|---|
| 外中断 · I/O 中断 | CPU 外部(设备控制器) | 无关 | 键盘输入完成、磁盘读完 | 被打断程序的下一条指令(当前指令执行完才响应) |
| 外中断 · 时钟中断 | CPU 外部(时钟部件) | 无关 | 时间片到 | 下一条指令(或调度去运行别的进程) |
| 内中断 · 陷入 trap | CPU 内部,有意安排 | 有关 | 执行陷入 / 访管指令(系统调用) | 下一条指令 |
| 内中断 · 故障 fault | CPU 内部,指令执行出错 | 有关 | 缺页;非法操作码、除数为 0、溢出 | 当前指令重新执行(修复成功时) |
| 内中断 · 终止 abort | CPU 内部,致命硬件错误 | 有关 | 控制器出错、存储器校验错 | 不返回,终止程序 |
| 动作 | 在哪个态执行 | 一句话 |
|---|---|---|
| 执行陷入指令 | 用户态 | 非特权指令;执行后才进入内核态 |
| 系统调用的处理(服务例程) | 内核态 | 由内核完成,可能让进程阻塞 |
| 库函数(如 sqrt) | 用户态 | 不涉及资源管理就不用进内核 |
| 中断服务程序、进程切换、缺页处理 | 内核态 | 都要改内核数据结构 |
| 中断返回指令 | 内核态 | 特权指令;执行后恢复旧 PSW,回到用户态 |