Introduction
What Operating Systems Do
Interface Between Users and Hardware
操作系统(Operating System,OS) 是管理计算机硬件、为应用程序提供运行环境,并在用户与硬件之间起中介作用的系统软件。
三个目标:执行用户程序、使计算机便于使用、有效利用硬件资源。
| 用户提出的任务 | 操作系统需要处理的事情 |
|---|---|
| 保存一张图片 | 组织文件、分配存储空间、通过设备完成读写 |
| 启动一个程序 | 建立执行环境、分配内存、安排 CPU 执行 |
| 按下键盘或移动鼠标 | 接收设备事件,把输入交给相应程序 |
应用提出任务,操作系统提供机制并协调资源,硬件完成实际计算与数据传输。
Four Components of a Computer System
用户:人、其他机器或其他计算机 ↓系统程序与应用程序:编译器、编辑器、浏览器、数据库等 ↓操作系统:控制、协调硬件资源的使用 ↓硬件:CPU、内存、I/O 设备
| 层次 | 主要作用 | 概念 |
|---|---|---|
| 硬件 | 提供基本计算、存储与输入输出能力 | 硬件资源本身不决定所有应用之间的分配策略 |
| 操作系统 | 控制和协调多个应用、多个用户对硬件的使用 | 关注公共机制与资源管理 |
| 系统程序与应用程序 | 利用资源完成具体任务 | 编译器、浏览器等不等同于操作系统内核 |
| 用户 | 提出计算或服务需求 | 用户不一定是直接操作键盘的人 |
数据库会自行管理一部分内存和存储。
Resource Allocator and Control Program
从系统角度,操作系统有两个互补的角色。
| 角色 | 核心问题 | 典型职责 |
|---|---|---|
| 资源分配者(Resource Allocator) | 多个请求发生冲突时,资源分给谁? | 管理 CPU 时间、内存、存储空间和 I/O 设备,兼顾效率与公平 |
| 控制程序(Control Program) | 程序怎样运行,才能避免错误使用或相互破坏? | 控制程序执行与 I/O,限制越权行为,处理运行错误 |
例如,多个程序同时要求 CPU,就需要调度;一个程序陷入死循环,系统需要有办法重新取得控制;一个程序试图修改其他程序的数据,系统需要检查并限制访问。
什么时候可以“浪费”一部分硬件资源?
个人交互系统可以为更方便的界面、更及时的响应付出额外 CPU 时间和内存。表面上,这些资源没有直接用于用户的计算任务;从完成任务所需的人力、等待时间和使用体验看,这种投入可能是合理的。
因此,评价“浪费”要先明确系统目标。最大化硬件利用率并非每一种系统的唯一目标。 同样,保留一定余量以应对交互请求,也不能仅凭资源未满载就判定设计低效。
Kernel, System Programs, and Applications
操作系统的边界没有一个适用于所有产品的统一定义。
内核(Kernel) 是操作系统的核心部分。“计算机运行期间始终存在的那个程序”。
核心职责 :管理进程、内存和设备,以及提供受保护的服务入口。
| 概念 | 理解 |
|---|---|
| 内核 | 支撑系统基本运行与资源管理的核心代码 |
| 系统程序 | 随系统提供、辅助系统使用和管理的软件 |
| 应用程序 | 直接完成用户具体任务的软件 |
内核一直存在,不表示 CPU 每一刻都在执行内核指令。 CPU 执行应用代码时,内核仍保留在系统中;出现中断、异常或服务请求时,控制可以转入内核。
Firmware and Booting
Firmware and Operating Systems
固件(Firmware) 是与设备或平台紧密结合的底层软件。
嵌入式设备可以运行操作系统,也可以由专用控制代码直接完成任务
Boot Process
引导程序(Bootstrap Program) 负责让计算机从刚上电的状态进入能够运行操作系统的状态。
上电或重启 ↓执行初始引导代码 ↓初始化 CPU 寄存器、设备控制器、内存等 ↓找到并装入操作系统内核 ↓开始执行内核,建立系统服务 ↓启动用户环境与应用程序内核运行之前,需要已有代码把它装入并开始执行。 最初的引导代码不能依赖尚未启动的操作系统服务。
上述流程是本章的概念模型。
Computer-System Organization
CPU, Memory, Devices, and Controllers
一个基本组织模型:一个或多个 CPU、多个设备控制器,通过公共总线连接,共享对主存的访问。

设备控制器(Device Controller) 是管理某类设备的硬件部分;设备驱动程序(Device Driver) 是操作系统中与相应控制器交互的软件。
| 部分 | 作用 |
|---|---|
| CPU | 执行指令,运行应用代码与操作系统代码 |
| 主存 | 保存正在使用的指令与数据 |
| 设备控制器 | 接收控制命令,管理设备操作与局部缓冲区 |
| 设备驱动程序 | 按具体设备的接口设置命令、处理状态,向系统提供访问能力 |
| 总线/互连 | 在各硬件部分之间传送地址、数据与控制信息 |
CPU 与 I/O 设备可以并发工作。例如,磁盘传送数据时,CPU 可以执行其他计算;但它们也可能竞争总线或内存访问机会。
数据先在设备与控制器的局部缓冲区之间传输,再由 CPU 在局部缓冲区与主存之间搬移。后面的 DMA 改进了这一步的数据搬移方式。
Purpose of Interrupts
中断(Interrupt) 使硬件能够通知 CPU:出现了需要处理的事件,例如 I/O 已经完成。
一个典型过程是:驱动程序启动设备操作后,CPU 继续执行其他工作;设备完成操作,控制器发出中断;CPU 转去执行处理程序,处理完成后恢复相应执行。
中断 让 CPU 不必在整个设备操作期间一直等待同一个完成状态。
| 事件来源 | 术语 | 例子 |
|---|---|---|
| 外部硬件事件 | 硬件中断 | I/O 完成、定时器到期 |
| 当前指令执行出现问题 | 异常/陷阱 | 除零、非法指令、非法内存访问 |
| 程序主动请求操作系统服务 | 系统调用,通过受控入口陷入内核 | 请求文件读写、创建进程等 |
陷阱(Trap) 是软件引起的中断,可能来自错误,也可能来自用户服务请求。
系统调用(System Call) 强调“程序向操作系统请求服务”。它与设备发出的完成中断具有不同的来源和目的。
Interrupt Handling
中断服务程序(Interrupt Service Routine,ISR) 是负责处理相应中断的代码。中断向量(Interrupt Vector) 用来定位相应处理入口,保存处理程序地址的表。
CPU 正在执行程序 ↓ 发生中断保存恢复执行所需的状态 ↓确定中断来源,找到处理入口 ↓执行相应中断服务程序 ↓恢复状态,继续相应执行保存状态的重点是程序计数器(Program Counter,PC)与寄存器等执行现场。
硬件与操作系统分工完成这一过程。硬件提供中断检测和控制转移等机制;操作系统设置处理入口、保存和恢复必要状态,并执行具体处理逻辑。
Identifying Interrupt Sources
| 方法 | 做法 | 特点 |
|---|---|---|
| 通用处理程序轮询 | 进入处理程序后,依次检查可能的设备或状态 | 通过检查找出需要服务的来源 |
| 向量中断 | 利用中断信息定位相应处理入口 | 减少逐个检查全部来源的需要 |
这里的“轮询来源”与“在 I/O 完成前不断检查设备是否准备好”用途不同:前者用于识别已到来的事件,后者用于等待事件发生。
处理中断时,是否必须禁止所有其他中断?
有可屏蔽中断、不可屏蔽中断和中断优先级:系统可以暂缓某些中断,也可以允许更高优先级的中断抢占较低优先级的处理程序。
因此,中断需要受控处理、关键状态需要保护;不是所有机器都不支持中断嵌套。
Example
输出 Hello World 的执行路径
输出语句用如何使用操作系统服务。
用户程序调用 printf() ↓标准 C 库处理相应调用 ↓ 需要输出服务时通过系统调用接口请求内核执行 write() ↓内核完成相应服务,并返回结果 ↓库函数和用户程序继续执行进入内核,是否就意味着切换到了另一个进程?
不一定。 一个进程请求系统服务,可以从用户态进入内核态,服务结束后再回到该进程的用户代码。这里改变的是 CPU 的执行权限与所执行的代码。
进程上下文切换还需要切换执行对象:保存原进程的状态,恢复另一个进程的状态。系统调用过程中可能因为等待 I/O 而触发调度,但系统调用本身不保证一定切换进程。
这一区别也适用于中断:执行一段中断处理代码,与决定改运行另一个进程,是可以关联、但需要分别判断的两件事。
Interrupt Timeline

图中上方是 CPU,下方是 I/O 设备,时间从左向右。
发出请求之后,设备从空闲进入传输状态;CPU 仍可执行程序。传输完成之后,设备发出中断,CPU 短暂转入中断处理。处理结束,CPU 返回原来的执行路径。
图中最重要的是两段时间的区别:设备传输时间可以与 CPU 计算重叠,中断处理本身仍占用 CPU 时间。 图上的短暂下凹表示 CPU 处理完成事件,不能把整个 I/O 传输都算成 CPU 在处理中断。
I/O Structure
Synchronous and Asynchronous I/O
| 比较项 | 同步 I/O(Synchronous I/O) | 异步 I/O(Asynchronous I/O) |
|---|---|---|
| 调用何时返回 | 等待所请求的操作完成后返回 | 操作尚未完成时即可返回 |
| 返回后能否直接使用本次结果 | 按完成状态判断,可以处理已返回的结果 | 还需要等待该请求的完成通知与结果 |
| 调用者在等待期间 | 当前执行路径停在等待位置 | 可执行与结果无关的其他工作 |
| 编程方式 | 较符合顺序执行的思路 | 需要组织请求、完成事件和后续处理 |
| 多个请求 | 顺序调用容易形成“一个完成后再发下一个” | 可以有多个未完成请求,完成顺序可能不同 |
两种简单等待方式:等待指令使 CPU 空闲直到出现中断;等待循环持续检查状态,会消耗 CPU 时间,并可能增加内存访问竞争。
Example
读取 1 GB 数据为什么可能让界面卡住?
假设界面处理与读取文件都在同一条执行路径中,程序发出一个需要较长时间的同步读取请求。
展开分析:现象、原因与异步方式
同步读取完成之前,这条执行路径不能继续处理后续事件。如果它也负责界面交互,用户就可能看到“按钮无响应、页面不再滚动”。
异步方式先登记读取请求,随后返回。程序可继续响应与该读取无关的界面操作,等数据完成后,再执行相应后续处理。
同步:提交读取 ── 等待完成 ── 处理结果 ── 继续处理界面
异步:提交读取 ── 继续处理界面 ──────────────┐ 设备在后台完成数据传输 ── 完成通知 ── 处理结果这个比较有一个重要前提:单一执行路径承担了读取和界面工作。
Example
后提交的读取为什么可能先完成?
程序先请求读取数据块 A,再请求读取数据块 B;A 在一块正忙的磁盘上,B 在另一块空闲磁盘上。
展开分析:请求顺序与完成顺序
A 可能先进入队列等待;B 所在的设备能够立即处理,所以 B 可能先完成。
因此,提交顺序 A → B,不保证完成顺序也是 A → B。异步程序需要知道每个结果对应哪个请求,不能只把“第一个回来的结果”当成 A。
如果后续计算必须同时使用 A、B,就应确认两个请求都已成功完成,再执行该计算。只有与尚未完成的结果无关的工作,才适合提前推进。
异步 I/O 允许不同完成顺序,实际是否乱序还取决于设备状态、请求内容和调度;它也可能恰好按提交顺序完成。
回调函数(Callback) 是完成通知之后安排应用后续处理的一种方式。硬件中断首先由系统处理,系统再通过相应机制使应用获知完成;应用回调不应直接等同于硬件中断服务程序。
非阻塞调用与异步调用进一步区分
| 方式 | 一次读取返回时表达什么 |
|---|---|
| 阻塞读取 | 等待操作完成,再返回结果 |
| 非阻塞读取 | 尽快返回当前可取得的数据;可能是全部、部分或没有数据 |
| 异步读取 | 返回时请求可能仍未完成,以后再报告该请求的完成结果 |
Device-Status Tables and Request Queues
异步执行后,系统需要记住哪些设备正在工作、有哪些请求还没有结束。

设备状态表(Device-Status Table) 为设备保存类型、地址、状态等信息,并关联相应请求。忙碌设备的后续请求可以先进入队列,设备完成后再安排下一项。
系统记录的既有设备状态,也有待完成操作的内容。如图中磁盘设备 3 处于忙碌状态,其请求链包含对文件 xxx 的读请求和对文件 yyy 的写请求。
新 I/O 请求 ↓查看相应设备状态 ├─ 可开始执行:配置设备并启动操作 └─ 需要等待:登记请求,加入待处理队列
设备完成并产生中断 ↓记录完成状态,通知相应等待者 ↓按调度策略选择后续请求,更新设备状态队列中的请求一定按先来先服务的顺序执行吗?
不一定。 队列用于记录等待中的请求,最终选择哪一个请求执行,还取决于调度策略。
磁盘访问说明:为了减少设备移动或提高效率,系统可能采用类似“电梯”的处理顺序,优先处理位置合适的请求。具体算法将在磁盘调度部分展开。
有两个细节需要关注:记录请求的数据结构与选择下一个请求的策略。
Direct Memory Access
如果大量数据的搬移都需要 CPU 逐次参与,CPU 会花很多时间在搬数据及处理相关事件上。高速设备传送大块数据时,这种开销尤其明显。
直接内存访问(Direct Memory Access,DMA) 允许设备控制器在设备与主存之间直接传送一块数据,传送过程不需要 CPU 逐字节搬移。
| 阶段 | CPU/操作系统 | 设备控制器/DMA 机制 |
|---|---|---|
| 准备 | 配置缓冲区、源/目的地址、传输数量等 | 接收传输配置 |
| 传输 | 可以执行其他工作 | 通过总线或互连完成数据块传送 |
| 完成 | 处理完成事件、更新状态 | 通常在相应传输块完成后发出中断 |
DMA 能够同时减少 CPU 搬运数据的工作和频繁处理完成事件的开销。
DMA 是否完全不需要 CPU?是否只是把中断攒到一起?
CPU 仍需要参与初始化、设置传输参数以及处理完成或错误状态。DMA 的关键在于传输主体由控制器直接完成,CPU 不再逐字节执行搬移。
同步/异步、中断、DMA 分别回答三个问题:调用者何时继续、CPU 怎样得知事件、数据由谁搬移。 它们可以组合使用。
Storage Structure and Caching
Main Memory, Secondary Storage, and Disks
主存(Main Memory) 保存 CPU 当前需要使用的指令与数据,是 CPU 可以直接寻址访问的大容量存储。主存通常使用 DRAM,断电后内容不能保留。
辅助存储(Secondary Storage) 提供更大的非易失性存储空间,用于保存程序和长期需要的数据。CPU 要处理磁盘中的数据,通常需要先通过 I/O 把它们送入主存。
| 对象 | 结构或特点 |
|---|---|
| 主存 | 可以按地址访问,速度较快;容量和成本限制了它可容纳的数据量 |
| 磁盘 | 盘片表面覆盖磁性记录材料;表面划分为磁道,磁道再划分为扇区 |
| 磁盘控制器 | 管理计算机与磁盘设备之间的交互 |
| 非易失性电子存储 | 教材以闪存、SSD 等为例,断电后仍能保存内容 |
| 光盘、磁带 | 可用于备份、归档等对访问速度要求较低的场景 |
磁道(Track) 与 扇区(Sector) 属于磁盘组织;不能直接把机械磁盘的结构套到所有存储介质上。
Storage Hierarchy
理想存储希望同时满足:速度快、容量大、价格低、断电不丢失。实际设计需要在这些目标之间取舍,因此使用多层存储共同工作。

从上到下可以概括为:
寄存器 ↓高速缓存 ↓主存 ↓非易失性电子存储 ↓磁盘 ↓光盘、磁带等归档存储| 比较维度 | 靠近上层时的一般特点 | 靠近下层时的一般特点 |
|---|---|---|
| 访问速度 | 较快 | 较慢 |
| 单位容量成本 | 较高 | 较低 |
| 典型容量 | 较小 | 较大 |
| 断电保持能力 | 寄存器、通常的缓存和主存具有易失性 | 常用辅助与归档存储具有非易失性 |
这是理解层次的总体取舍,不能代替具体设备参数比较。易失性(Volatility) 只描述断电后能否保留数据,也不能由它单独判断访问速度。
Caching Basics
缓存(Caching) 把暂时需要的信息从较慢的存储复制到较快的存储,以缓解不同层之间的速度差距。
需要某项数据 ↓先查缓存 ├─ 命中:直接使用缓存中的数据 └─ 未命中:访问较慢层,取得数据,并按策略放入缓存缓存命中(Cache Hit) 表示请求的信息已经在缓存中;缓存未命中(Cache Miss) 表示还需要到较慢的层次取得信息。
缓存通常比被缓存的数据集合小,所以系统必须决定保留哪些数据,以及空间不足时替换哪些数据。缓存容量与替换策略是重要设计问题。
缓存并不限于某一个硬件部件:处理器有硬件缓存,操作系统和应用也可以维护缓存。从磁盘的角度看,保存部分磁盘数据的主存也起到了更快一层缓存的作用。
Example
少量热点数据为什么值得放进缓存
展开分析:热点、容量与命中机会
假设大部分访问集中在一小部分数据上。若缓存能够容纳并保留这些热点,后续大量请求就可以在快存储中完成;即使缓存只占全部数据的一小部分,也可能覆盖相当多的访问。
反过来,如果每次都访问此前没有使用过的数据,或者热点远大于缓存、不断被替换出去,那么缓存的收益就可能下降。
因此,缓存效果取决于实际访问模式、容量和替换策略。
经常使用的数据可以放在较快的层,长期不活跃的数据放在成本较低的层,需要时再调入。这里保留的是冷热分层的设计思路;
Storage Performance and Management
缓存不仅涉及“数据放在哪里”,还涉及各层有多快、由谁管理,以及数据怎样在层次之间移动。
| 存储层次 | 访问时间(ns) | 带宽(MB/s) | 主要管理者 | 后备存储 |
|---|---|---|---|---|
| 寄存器 | 0.25–0.5 | 20,000–100,000 | 编译器 | 缓存 |
| 高速缓存 | 0.5–25 | 5,000–10,000 | 硬件 | 主存 |
| 主存 | 80–250 | 1,000–5,000 | 操作系统 | 磁盘 |
| 磁盘 | 5,000,000 | 20–150 | 操作系统 | 光盘或磁带 |
访问时间关注完成一次访问要等多久;带宽关注单位时间内能传送多少数据。二者不能只看数字大小直接比较。

Explicit and Implicit Data Movement
| 方式 | 说明 |
|---|---|
| 显式组织的数据移动 | 磁盘与主存之间的数据传输通常由操作系统控制,通过 I/O 完成 |
| 硬件自动完成的数据移动 | 缓存、CPU 与寄存器之间的数据传送通常由硬件完成,不需要操作系统逐次介入 |
编译器决定哪些值保存在寄存器、何时替换;硬件管理相应的处理器缓存;操作系统管理主存和辅助存储。存储层次中的数据都需要协调,但不意味着每次数据移动都执行一段内核代码。
一次磁盘访问,大约相当于多少次主存访问时间?
根据课件参数作数量级计算 从主存访问时间范围中取 ,磁盘访问取 :
按这组参数,一次磁盘访问时间约为一次主存访问的 5 万倍。因此,缓存命中所避免的慢速访问可能带来很大收益。
这里比较的是访问时间,不是 CPU 指令条数,也不是所有设备都具有这一比值。
Multiple Data Copies
层次结构提高了速度,但也使同一份数据可能同时出现在磁盘、主存、缓存和寄存器中。一处修改后,其他副本不一定已经同步更新。
Example
整数 A 从磁盘到寄存器
设整数 保存在磁盘文件 中,现在需要执行 。
磁盘中包含 A 的数据块 ↓ I/O:读入主存主存中的 A ↓缓存中的 A ↓寄存器中的 A → 执行加一
分析:寄存器已经加一,磁盘里的值也改变了吗?
不一定。 首先把包含 的磁盘块读入主存,再将 复制到缓存和寄存器。执行加一时,先改变的是寄存器中的副本。
若用 具体化这一过程:
| 阶段 | 磁盘副本 | 主存副本 | 缓存副本 | 寄存器副本 |
|---|---|---|---|---|
| 各层复制完成、尚未加一 | 5 | 5 | 5 | 5 |
| 寄存器刚完成加一、尚未向下写回 | 5 | 5 | 5 | 6 |
| 新值已传播并写回磁盘 | 6 | 6 | 6 | 6 |
所以,计算结果已在寄存器中生效,与磁盘上的数据已更新,是不同阶段。
Cache Coherency
多个执行者共享数据时,需要保证它们使用正确的新值。
| 环境 | 问题 |
|---|---|
| 多任务 | CPU 在不同进程之间切换,访问同一数据的进程不能继续使用过时值 |
| 多处理器 | 各 CPU 有本地缓存,同一个数据项可能同时保存在多个缓存中 |
| 分布式系统 | 同一文件或数据的副本还可能分散在不同计算机上,访问与更新的协调更复杂 |
缓存一致性(Cache Coherency) 处理多个缓存中同一数据副本的协调问题。本章指出,多处理器的缓存一致性通常由硬件机制处理;分布式副本更新则还需要相应系统机制。
缓存解决什么问题,又带来什么问题?为什么不直接用同样大的缓存替代磁盘?
收益:保留经常使用数据的快速副本,减少慢速访问;在快慢部件之间缓解速度不匹配,减少等待。
代价:空间有限,需要选择装入和替换策略;同一数据存在多个副本,更新时需要处理一致性。
容量不能脱离介质性质讨论:高速存储通常有更高的单位容量成本,且寄存器、通常的缓存和主存具有易失性。即使某种缓存能做得与磁盘一样大,也不能因此推断它在成本、容量和掉电保存能力上都能替代磁盘。
层次结构保留不同介质的优势,并让数据在需要时进入较快层次。
Operating-System Structure
Multiprogramming
多道程序设计(Multiprogramming) 将多个作业组织起来,使一个作业等待 I/O 等事件时,CPU 可以执行另一个已经准备好的作业。主要目标是提高 CPU 利用率。
作业包含代码和数据。系统通常只将全部作业中的一部分保存在内存中,选择其中的作业执行;当前作业需要等待时,再切换到其他作业。
作业 A 使用 CPU ↓ A 等待 I/OCPU 执行已准备好的作业 B;设备处理 A 的 I/O ↓ A 的 I/O 完成A 可以重新参与调度,等待下一次执行机会A 在等待,不意味着 CPU 也必须等待。 不过,只有仍有可运行的作业,系统才能继续利用 CPU;所有作业都在等待时,CPU 仍可能空闲。

Time Sharing
分时(Time Sharing)/多任务(Multitasking) 是多道程序的延伸:CPU 频繁地在任务之间切换,使用户能够在任务运行期间与它交互。
| 比较项 | 多道程序 | 分时 |
|---|---|---|
| 主要目标 | 提高 CPU 利用率 | 提供及时的交互响应 |
| 典型情形 | 一个作业等待时,执行另一个作业 | 多个任务轮流获得 CPU,用户不必等一个任务全部结束 |
| 共同基础 | 多个作业共存,系统协调资源和执行机会 | 同左,并强调较快的切换与响应 |
当多个任务都已准备好时,需要 CPU 调度(CPU Scheduling) 决定下一个运行谁。多个任务同时驻留又要求内存管理,并且需要限制任务之间的不当干扰。
Concurrency and Parallelism
并发(Concurrency):在同一段时间内推进多个任务,例如多个进程在一个 CPU 核心上交替运行。
并行(Parallelism):多个任务在多个 CPU 核心上同时执行。
因此,多个程序同时驻留内存,并不等于它们的指令正在同一时刻执行。 多道程序不要求一定有多个 CPU 核心。
Operating-System Operations
Hardware Protection
共享机器时,系统必须应对程序陷入无限循环、执行非法操作、修改其他程序或操作系统数据等问题。仅依靠用户程序自觉遵守规则不够,需要硬件提供受保护的执行机制。
双模式运行(Dual-Mode Operation) 区分用户态(User Mode)与内核态(Kernel Mode)。硬件中的模式位标记当前执行权限。
| 项目 | 用户态 | 内核态 |
|---|---|---|
| 执行内容 | 用户程序代码 | 操作系统的相应服务和管理代码 |
| 权限 | 不能执行被限制的特权指令 | 可以执行相应特权操作 |
| 模式位 | 1 | 0 |
| 请求受保护服务 | 通过系统调用进入指定服务入口 | 检查并执行请求 |
特权指令(Privileged Instruction) 是只允许在相应特权模式下执行的指令,例如对 I/O、定时器和中断的某些控制操作。用户态直接执行这些指令时,硬件会将违规操作交给系统处理。
User-to-Kernel Mode Transition
用户程序执行 ↓ 发起系统调用进入指定的内核服务,切换为内核态 ↓检查请求类型、参数与合法性,执行服务 ↓恢复用户态,返回用户程序中断或异常也可以使正在执行用户代码的 CPU 转入内核处理。进入内核的路径受系统控制,用户程序不能借一次调用任意执行所有特权操作。

前文已经区分:执行模式切换关注权限与代码路径,进程切换关注执行对象。 进入内核不必然意味着运行了另一个进程。
Timer and CPU Control
若程序一直循环而不发起系统调用,操作系统仍须有办法收回 CPU。定时器(Timer) 可在指定时间后产生中断,使控制权自动返回系统。
操作系统设置定时器 ↓让用户程序运行 ↓ 规定时间到达产生定时器中断 ↓操作系统重新取得控制权 ↓决定继续给予执行时间,或处理超时、安排其他任务修改定时器的操作必须受特权保护,否则用户程序可以不断修改它,使系统失去收回控制权的保证。
Example
哪些指令应是特权指令?
设置定时器、读取时钟、清空内存、发出陷阱指令、关闭中断、修改设备状态表、从用户态切换到内核态、访问 I/O 设备,哪些应受特权保护?
展开解答:按操作可能影响的范围判断
按双模式保护模型整理解答。
| 操作 | 判断 | 原因 |
|---|---|---|
| a. 设置定时器 | 应受保护 | 不能让用户程序任意改变系统收回 CPU 的时机 |
| b. 读取时钟 | 不必仅因“读时间”而设为特权操作 | 读取时间与修改定时器不同 |
| c. 清空内存 | 对任意内存的清空应受保护 | 不能允许覆盖内核或其他程序的内存 |
| d. 发出陷阱指令 | 受控陷阱入口可由用户态使用 | 用户程序需要通过这一机制请求系统服务 |
| e. 关闭中断 | 应受保护 | 防止用户阻止系统处理事件或重新取得控制 |
| f. 修改设备状态表 | 应受保护 | 这是系统管理设备的重要状态 |
| g. 从用户态切换到内核态 | 任意改变权限的操作应受保护 | 不能让用户自行取消权限限制 |
| h. 访问 I/O 设备 | 直接控制受保护设备应受保护 | 避免绕过设备管理和访问控制 |
按题目的上述含义,应选 a、c、e、f、g、h。
如何用定时器计算当前时间?
以下用固定周期定时器给出一种解答。
假定启动计时时已知参考时刻 ,每隔 产生一次定时器中断。系统累计已发生的节拍数 ,便可以估计:
例如,周期为 ,经过 2,500 个节拍,对应过去了 。
这里假设节拍计数正确,并且已有参考时刻。仅从开机后累计节拍,只能得到经过的时间;精度也受到周期与时钟误差的限制。
Process Management
Programs and Processes
进程(Process) 是执行中的程序,是系统中的一个工作单位。程序是被动的代码与数据描述,进程是带有执行状态的活动实体。[^os1-process]
| 比较项 | 程序 | 进程 |
|---|---|---|
| 观察对象 | 磁盘文件等介质中的程序内容 | 一次正在进行的执行 |
| 是否具有当前执行位置 | 程序本身没有“现在运行到哪一步” | 需要记录下一条指令等执行状态 |
| 所需资源 | 静态描述本身不代表正在使用执行资源 | 运行中需要 CPU 时间、内存、文件与 I/O 等 |
| 数量关系 | 同一程序可被多次运行 | 对应的多个进程是不同执行序列 |
进程还可能接收初始化数据。教材以浏览器为例:网址作为输入,进程通过指令和系统调用获取、显示网页。进程结束时,操作系统回收可复用的资源。
Single and Multiple Threads
单线程进程只有一条执行流,用一个程序计数器记录下一条指令;多线程进程则每个线程都有自己的程序计数器。
线程(Thread) 为 CPU 利用的基本单位,包含线程标识、程序计数器、寄存器集合和栈;同一进程内的线程共享代码、数据和打开的文件等资源。
| 同一进程内共享的内容 | 每个线程分别保存的内容 |
|---|---|
| 代码段、数据段 | 程序计数器与寄存器状态 |
| 打开的文件等进程资源 | 线程标识与自己的执行栈 |
进程描述一次执行及其资源环境,线程描述其中的一条执行流。 有多个线程,不要求为每个线程各建立一套完全独立的代码和数据。

文字处理器为什么可以一边响应输入,一边检查拼写?
一个线程显示图形,一个线程响应用户按键,另一个线程在后台进行拼写和语法检查。
这些线程可以共享进程中的文档数据,但分别保留自己的执行位置与中间状态。因此,交互工作与后台检查不必全部塞进同一条顺序执行流。
单核心上可以通过交替运行实现并发;多核心上还可能并行执行。共享数据方便协作,但访问共享内容仍需要相应协调机制,这也是后面学习同步的原因。
Process Management Activities
| 管理活动 | 需要解决的问题 |
|---|---|
| 创建与删除 | 建立用户进程、系统进程,结束后回收资源 |
| 调度进程与线程 | 多个执行者准备好时,如何分配 CPU 机会? |
| 挂起与恢复 | 怎样暂停执行,并在需要时恢复? |
| 同步 | 怎样协调执行顺序与共享资源访问? |
| 通信 | 进程之间怎样交换信息? |
| 死锁处理 | 多个进程相互等待而无法继续时,系统怎样应对? |
From Processes to Agent Tasks
进程关注“程序正在执行”,智能体任务关注“正在完成什么目标”。
| 进程 | 智能体任务 |
|---|---|
| 进程标识与身份 | 模型与指令 |
| 地址空间 | 目标、计划和当前上下文 |
| 线程与程序计数器 | 当前任务进度及后续行动 |
| 打开的文件、网络连接等 | 可调用的工具与外部服务 |
| 短期或长期的执行状态 | 跨多次交互保存的记忆 |
智能体还可能产生子任务或其他智能体。由此会遇到调度、检查点与恢复、隔离、资源计量等系统问题。
一个智能体任务的执行可以跨越多个进程和服务。
Memory Management
Memory Residency
CPU 使用的指令与数据需要进入可访问的内存体系。系统中有多个进程时,**内存管理(Memory Management)**决定哪些内容在何时驻留,以提高 CPU 利用率并改善响应。
| 职责 | 要回答的问题 |
|---|---|
| 跟踪使用情况 | 哪些内存正在使用?分别由谁使用? |
| 分配与回收 | 新需求从哪里获得空间?不再需要的空间如何释放? |
| 决定移入与移出 | 哪些进程、进程的一部分或数据,应进入或离开主存? |
前面的多道程序要求多个进程共存于内存;内存管理则负责为这种共存提供空间与状态管理。
Swapping and Virtual Memory
当进程不能都容纳在内存中时,引入两种相关机制。
交换(Swapping):将进程移入、移出内存,使有限的内存能被不同进程使用。
虚拟内存(Virtual Memory):允许一个进程在没有全部装入物理内存时执行。
“指令要在内存中才能执行”与“进程不必全部在内存中”矛盾吗?
不矛盾。前者关注当前要执行、使用的内容;后者关注整个进程的全部内容。
程序运行到某一阶段,只需要这一阶段所需的部分能够被访问,并不要求其他所有代码和数据同时驻留。虚拟内存可以支持大于实际物理内存的程序。
Memory and Context Management
| 操作系统内存管理 | 智能体上下文管理 |
|---|---|
| CPU 缓存 | 当前活动上下文 |
| 主存中的页面 | KV 缓存中的状态 |
| SSD 与文件 | 检索出的记忆、文件或数据库内容 |
| 哪些字节、页面应该驻留? | 哪些信息应该进入当前上下文? |
共同问题是:快速、直接可用的空间有限,哪些内容应该留在其中?
Storage Management
File Systems
不同介质的容量、访问速度、传输率、顺序/随机访问方式不同。操作系统通过**文件(File)**这一逻辑存储单位隐藏这些物理差异,再把文件映射到实际存储介质。
文件保存相关的信息,既可以是程序,也可以是数据;文件通常组织在目录中,访问控制决定谁可以读取、写入或执行相应操作。
| 文件系统管理活动 | 含义 |
|---|---|
| 创建与删除文件、目录 | 建立或移除逻辑存储对象,组织文件 |
| 提供操作原语 | 提供操作文件和目录的基本接口 |
| 映射到辅助存储 | 确定文件内容对应哪些实际存储位置 |
| 备份 | 将需要保留的文件备份到稳定的非易失性介质 |
应用使用的是文件这一抽象,系统还要落实它在介质上的存储和访问。
Mass Storage
主存放不下的数据,以及需要长期保存的数据,需要辅助存储。存储子系统及其管理算法可能成为整机性能的重要限制。
三项职责:
| 职责 | 核心问题 |
|---|---|
| 空闲空间管理 | 哪些存储空间还可使用? |
| 存储分配 | 把哪些可用空间分给某个文件或其他数据? |
| 磁盘调度 | 多个读写请求应按什么顺序服务? |
第三级存储(Tertiary Storage) 包括光盘、磁带等,适合备份、较少使用的数据和长期归档。并非所有存储都必须很快,但仍需管理介质、使用权和数据迁移。
其中,WORM 表示一次写入、多次读取;RW 表示可读写。它们描述允许的操作方式,与存储层次的速度高低不同。
I/O Subsystem
I/O 子系统为系统提供通用的设备驱动接口,再由针对具体硬件的驱动处理设备差异,使应用和系统其他部分不必逐项了解每种设备的细节。其职责还包括用于 I/O 的缓冲、缓存和假脱机。
| 机制 | 主要作用 | 理解重点 |
|---|---|---|
| 缓冲(Buffering) | 暂存正在传输的数据 | 协调传输双方的速度、数据传送单位等差异 |
| 缓存 | 在较快存储中保留数据副本 | 再次访问时减少慢速访问 |
| 假脱机(Spooling) | 先保存设备任务,再安排实际输出 | 协调多个作业与设备之间的执行,使相关工作可以重叠 |
缓冲区可能保存某数据的唯一副本,缓存则保存位于其他位置的数据的快速副本。两者功能不同,但同一块内存可以兼作缓冲与缓存。
多个应用同时打印,为什么输出不会混在一起?
打印机一次处理一个作业,不适合将多个输出流随意交错。系统先把各应用的输出分别保存到辅助存储上的假脱机文件,再把这些文件排队,逐个交给打印机。
应用 A → 假脱机文件 A ─┐应用 B → 假脱机文件 B ─┼→ 输出队列 → 打印机依次处理应用 C → 假脱机文件 C ─┘应用提交输出与设备实际输出被分开。多个应用可以提交任务,不要求打印机同时打印多个作业;系统还可以提供查看队列、删除尚未打印的任务、暂停打印等操作。
Coordinating Storage Management
一次文件读写中的职责区分为:
文件系统管理:要操作哪个文件,允许什么操作,文件映射到哪里? ↓大容量存储管理:使用哪些存储空间,请求按什么次序服务? ↓I/O 子系统与驱动:怎样通过具体控制器完成传输与状态处理?每个系统不是都必须采用同样的模块调用顺序。中断、DMA 和设备队列,属于实现这类工作的重要机制。
Protection and Security
Access Control and Threat Defense
保护(Protection) 控制进程和用户对系统资源的访问;安全(Security) 防御来自系统内部和外部的攻击。两者相关,但关注点不同。
| 概念 | 核心问题 | 例子 |
|---|---|---|
| 保护 | 哪个执行者可以对哪个资源进行什么操作? | 地址空间限制、设备控制权限、文件读写权限 |
| 安全 | 怎样防止系统被恶意利用或破坏? | 防御拒绝服务、病毒、蠕虫、身份盗用、服务盗用 |
地址空间保护、定时器和设备控制寄存器的访问限制都是保护机制的例子。它们分别限制程序能访问哪里、能否一直占有 CPU,以及能否直接控制设备。
文件权限检查正常,数据为什么仍可能被窃取?
假设合法用户的认证信息被盗。攻击者可能使用这一身份复制或删除数据,即使文件和内存保护机制仍然按原有规则运行。
因此,访问检查是否执行正确,与访问者是否冒用了身份,需要分别解决。有保护机制,并不意味着所有安全问题都已消失。
Users, Groups, and Effective Identity
系统通常先确定用户身份,再根据身份判断允许的操作。
| 标识或机制 | 作用 |
|---|---|
| 用户标识(User ID) | 区分用户,与相应进程、文件等对象的访问控制关联 |
| 组标识(Group ID) | 把一组用户作为管理对象,统一设置相应权限 |
| 有效身份与权限提升 | 在系统允许的条件下,以不同的有效身份执行需要额外权限的活动 |
文件所有者可以拥有完整操作权限,而某一组用户只拥有读取权限。
权限提升不等于用户自行改变 CPU 模式位。 这里讨论的是访问资源时采用什么身份和权限;前面的用户态/内核态讨论的是硬件执行模式。
Computing Environments
大型机 → 小型机 → 个人计算机 → 桌面互联网 → 移动互联网Distributed Systems
分布式系统(Distributed System) 由物理上分离、可能异构的计算机通过网络连接,向用户提供对共享资源的访问。
| 系统形式 | 区别 |
|---|---|
| 网络操作系统 | 提供跨机器文件共享、进程通信等能力,各计算机仍保持相对自主 |
| 分布式操作系统 | 各计算机紧密协作,试图向用户呈现由一个系统统一控制的视图 |
下文的客户端—服务器与 P2P,是组织分布式服务的两种模型。
Client–Server Computing
客户端—服务器(Client–Server,C/S) 模型中,服务器响应客户端发出的请求。
| 服务器类型 | 提供的服务 | 例子 |
|---|---|---|
| 计算服务器 | 接收操作请求,执行后返回结果 | 数据库查询 |
| 文件服务器 | 提供存储、读取、更新等文件操作接口 | 远程文件访问 |
客户端 ── 请求 ──→ 服务器客户端 ←─ 结果 ─── 服务器Peer-to-Peer Computing
对等计算(Peer-to-Peer,P2P) 不固定区分客户端和服务器。节点作为对等参与者,既可以请求服务,也可以提供服务。
节点加入网络后,还需要知道“谁能提供所需服务”。
| 方式 | 发现与访问过程 | 例子 |
|---|---|---|
| 中央查找服务 | 提供者先登记服务;请求者查询提供者,再与其通信 | Napster 的文件索引 |
| 服务发现协议 | 请求者广播服务请求,能够提供服务的节点响应 | Gnutella 的文件发现 |
存在中央查找服务,不代表服务内容必须由中央服务器提供。 查找“谁有文件”和实际“把文件传给对方”,可以由不同节点完成。
C/S 与 P2P 的主要区别是什么?
C/S 模型具有明确的请求者和服务提供者角色,多个客户端请求服务器提供服务;P2P 的节点角色不固定,同一节点可以在不同交互中请求或提供服务。
集中服务器可能成为瓶颈;P2P 则可以由分散的多个节点提供服务。但 P2P 不等于完全没有中心组件,因为它仍可使用中央查找服务。
判断时先看服务由谁提供、节点如何承担角色,再区分服务发现方式。
Web-Based Computing
越来越多的设备通过网络访问 Web 服务,办公软件也可以通过 Web 提供,例如 Google Docs。
负载均衡器(Load Balancer) 在提供相似服务的多台服务器之间分配请求,管理到达服务器的 Web 流量。
客户端请求 → 负载均衡器 → 多台提供相似服务的服务器客户端、服务器描述服务关系中的角色,不是简单依靠操作系统名称区分。
云计算与实时嵌入式环境
云计算(Cloud Computing):将计算、存储和应用作为经网络提供的服务。
| 分类维度 | 类型 |
|---|---|
| 使用与部署范围 | 公有云向外部用户提供服务;私有云供组织自身使用;混合云结合两者 |
| 提供的服务层次 | 软件即服务(SaaS)提供应用;平台即服务(PaaS)提供可供应用使用的软件栈;基础设施即服务(IaaS)提供服务器、存储等资源 |
这两组分类可以组合,例如同一个公有云提供不同层次的服务。
实时嵌入式系统:嵌入式系统通常针对特定设备和任务;实现可以采用通用操作系统加专用应用、专用嵌入式操作系统,也可以是无需操作系统的专用硬件。
实时系统(Real-Time System) 要求在明确的时间约束内完成处理。正确性同时包括结果正确和按时完成。
AI and OS Boundaries
From User Intent to Action
| 层次 | 接收什么 | 主要负责什么 |
|---|---|---|
| 智能体层 | 用户目标与任务上下文 | 理解意图、拆分任务、选择工具、观察结果并重新规划 |
| 操作系统 | 程序的服务请求与硬件事件 | 管理进程、内存、文件、I/O,并实施保护与隔离 |
用户目标 ↓智能体:理解目标 → 规划 → 调用工具 → 观察结果 → 必要时重新规划 ↓应用与工具 ↓操作系统:执行与资源管理、权限检查、隔离 ↓硬件智能体隐藏完成目标所需的软件操作细节;操作系统提供完成软件操作所需的资源管理与受保护机制。 两层都涉及调度、状态和资源管理,但管理对象与权限层次不同。