ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

操作系统复习地图:五章核心考点与易错点全梳理

操作系统复习地图:五章核心考点与易错点全梳理

简介:这份资源是《计算机操作系统(第三版)》课后习题的参考答案文档,面向高校计算机专业学生、考研复习者以及准备操作系统课程考核的学习者,用于对照教材章节核对习题解答、梳理知识脉络。内容覆盖操作系统引论、进程管理、并发编程等核心章节,对分时系统与实时系统的比较、进程三态转换、PCB 的作用与唯一标志性、记录型信号量 wait/signal 的物理含义、前趋图与临界区互斥等典型题目均给出完整作答,可当作章节复习的对照清单与答题思路参考。资源包共 1 个 doc 文件,约 170KB,体量轻便,便于打印或离线查阅。目前已有 512 人学习,适合在期末复习与考研初试阶段配合教材逐章核对使用。

1. 操作系统复习地图:从引论到设备管理的五条主线

翻开任何一本操作系统教材,目录几乎都长一个样:引论、进程、调度与死锁、内存、设备。真正拉开差距的不是背没背过这些名词,而是能不能在脑子里把它们串成一条因果链——为什么要有进程?因为多道程序要并发;并发为什么出问题?因为资源竞争和推进顺序不确定;于是需要同步机制、调度策略、死锁处理;进程多了内存不够,于是有虚拟存储和页面置换;I/O 慢,于是有通道、缓冲和 SPOOLing。这条链子理顺了,第三版课后习题里那些看似零散的问答就会自动归位。这份笔记面向正在系统学操作系统、或者拿课后习题答案做复习底稿的人,把五章内容压成一张可查漏补缺的地图,重点标出概念对比和血泪易错点,而不是把答案再抄一遍。

2. 引论与进程管理:OS 特征、PCB 与状态转换的复习重点

2.1 操作系统的目标、作用与四大特征

引论部分的考点高度集中,梳理下来无非三组:目标、作用、特征。设计现代 OS 的主要目标是方便性、有效性、可扩充性和开放性,这四个词经常被拆开考单选或填空。OS 的作用表现为三个方面:作为用户与计算机硬件系统之间的接口、作为计算机系统资源的管理者、实现了对计算机资源的抽象。这三条要能顺着说下来,而不是死记顺序。

四大特征是并发性、共享性、虚拟性、异步性。这里有个高频陷阱:最基本特征是并发和共享,而最重要的特征是并发性。题目问法不同,答案就不同,很多翻车就翻在没看清问的是"最基本"还是"最重要"。异步性的成因也要能讲清楚:多道程序环境下多个进程并发执行,受资源限制走走停停,何时执行、何时暂停、推进速度都不可预知,所以完成次序与进入内存次序不一致;但在进程控制和同步机制支持下,相同运行环境多次运行结果相同,说明异步执行是系统允许的。

分时系统与实时系统的比较是另一道必考题,按交互性、及时性、可靠性三条线对比最稳:

比较维度分时系统实时系统
交互性较强,主要用于终端用户程序有交互能力但不及分时系统
及时性以人所能接受的等待时间衡量实时控制以开始/完成截止时间衡量,要求更高
可靠性一般要求要求显著更高

分时系统的关键问题是让用户能与自己的作业交互:键入命令时系统要及时接收、及时处理、及时返回。及时接收靠多路卡同时接收各终端输入,并为每个终端配缓冲区暂存命令;及时处理则让所有用户作业直接进入内存,为每个作业分配时间片,只在自己的时间片内运行,从而在不长时间内让每个作业都轮转一次。

2.2 进程概念、PCB 与三态转换

为什么要引入进程?为了让程序在多道程序环境下能并发执行,并能对并发执行的程序加以控制和描述。进程与程序的比较从三个角度切入:动态性上,进程由创建而产生、由调度而执行、因缺资源而暂停、由撤销而消亡,有生命周期,程序只是有序指令的静态集合;并发性上,进程是能与其他进程并发执行的基本单位,程序本身不能并发;独立性上,进程实体是独立运行、独立获得资源和独立调度的基本单位,未建立进程的程序不能作为独立单位运行。

PCB 是进程实体的一部分,是操作系统中最重要的记录型数据结构,记录了描述进程情况和控制进程运行所需的全部信息。它使一个在多道环境下不能独立运行的程序成为一个能独立运行、能与其他进程并发执行的基本单位。说 PCB 是进程存在的唯一标志,是因为整个生命周期中系统总是通过 PCB 控制进程,是根据 PCB 而不是别的什么感知进程存在。

三态转换的典型原因要能双向说清:就绪到执行,是进程调度程序分配了处理机;执行到阻塞,是当前进程因某事件无法执行,比如访问已被占用的临界资源;执行到就绪,是时间片用完被暂停。挂起状态的引入有四种需要:终端用户请求、父进程请求、负荷调节需要、操作系统需要;被挂起的进程处于静止状态,不能直接被处理机调度。

2.3 同步机制:信号量、前趋图与经典问题

同步机构遵循四条准则:空闲让进、忙则等待、有限等待、让权等待,目的是实现进程互斥进入临界区。进入临界区前执行进入区代码,是为了检查临界资源是否正被访问,未被访问才可进入;退出前执行退出区代码,是为了恢复访问标志,让其他进程能再访问该资源。

记录型信号量的物理含义是这章的核心。wait(S) 在 S.value>0 时表示还有可用资源,执行后资源数减一;S.value<0 时资源已分配完,进程调用 block 原语自我阻塞、放弃处理机并插入信号量链表。signal(S) 释放一个单位资源,S.value 加一;若加一后 S.value≤0,说明链表中仍有被阻塞进程,调用 wakeup 唤醒第一个等待进程。这段描述要能默写,因为它是后面所有经典问题的地基。

前趋图用信号量描述时,每条有向边对应一个初值为 0 的信号量,前驱语句执行完 signal,后继语句执行前 wait。以四条语句 S1: a:=x+y; S2: b:=z+1; S3: c:=a-b; S4: w:=c+1 为例,S1 是 S3 的前驱,S2 也是 S3 的前驱,S3 是 S4 的前驱:

// 每条边一个信号量,初值 0 表示"事件尚未发生" semaphore a = 0, b = 0, c = 0; // S1 完成后通知 S3 的两个前驱条件之一 S1; signal(a); // S2 完成后通知 S3 的另一个前驱条件 S2; signal(b); // S3 必须等 a、b 都 signal 过才能执行 wait(a); wait(b); S3; signal(c); // S4 只依赖 S3 wait(c); S4;

参数说明:信号量初值一律为 0,因为前趋关系表达的是"事件先后",不是资源计数;wait 的个数等于该语句入边的条数,signal 的个数等于出边条数。写前趋图程序时最容易漏的是汇合点要 wait 全部入边,只 wait 一条就会让 S3 提前跑。

生产者—消费者问题的两个经典改错必须吃透。缺少 signal(full) 时,full 始终为 0,消费者执行 wait(full) 会认为缓冲池为空而永远等待;缺少 signal(empty) 时,缓冲池取空后 empty 仍为 0,生产者申请不到空缓冲区而被阻塞。把 wait(full) 和 wait(mutex) 互换位置可能引起死锁:缓冲区全满时生产者先拿到 mutex,再 wait(empty) 失败阻塞,它不释放 mutex,消费者和其他生产者全部堵死;而 signal(mutex) 与 signal(full) 互换只影响释放次序,不会死锁。这条"wait 顺序不能换、signal 顺序可换"的结论,是考场上最值钱的一句话。

单缓冲区数据采集与计算的同步算法,用 mutex、empty、full 三个信号量初值 1、1、0 即可;若缓冲区只有一个且采集与计算天然互斥,可省掉 mutex,只用 empty=1、full=0 两个信号量,这是答案里给出的简化版本,考试时写哪个取决于题目是否要求显式互斥。

2.4 线程与进程的四方比较

引入线程是为了减少程序并发执行付出的时空开销,使 OS 具有更好的并发性。进程与线程从四方面比较:调度性上,传统 OS 中进程既是资源拥有单位又是调度分派单位,引入线程后线程成为调度分派单位、进程成为资源拥有单位;并发性上,线程让同一进程内多个线程也能并发,并发粒度更细;拥有资源上,进程始终是资源拥有基本单位,线程只拥有一点运行必不可少的资源,但可访问所属进程的资源;开销上,创建撤销进程要分配回收资源,切换要保存的现场信息也多于线程,所以进程的创建、撤销、切换开销显著大于线程。低级通信工具效率低、对用户不透明、操作全靠程序员实现,高级通信工具用一组通信命令高效传送大量数据,这个对比常以简答出现。

3. 调度与死锁:三级调度、算法对比与银行家算法

3.1 三级调度的分工

高级调度决定把外存后备队列中哪些作业调入内存、创建进程、分配必要资源并插入就绪队列;低级调度决定就绪队列中哪个进程获得处理机,再由分派程序执行具体分配;引入中级调度是为了提高系统资源利用率和系统吞吐量,本质是在内存紧张时把暂时不能运行的进程换出,等条件具备再换入。三级调度常被问"各自任务是什么、为什么引入中级",答的时候要把"作业"和"进程"两个词用准,高级调度面对的是作业,低级调度面对的是进程。

3.2 FCFS 与 SPF 的异同

两者相同点是都既可用于作业调度也可用于进程调度。不同点在选择依据:FCFS 每次从后备队列选最先进入的作业调入内存,有利于长作业/进程,不利于短作业/进程;SPF 选估计运行时间最短的作业,有利于短作业/进程,不利于长作业/进程。实时调度按调度方式分为非抢占调度算法和抢占调度算法两类,这个二分法要记牢,后面实时调度大题基本从这里展开。

3.3 死锁四条件与处理策略

死锁是多个进程因竞争资源造成的僵局,无外力作用则永远无法推进。产生原因有二:竞争资源和进程推进顺序非法。必要条件是互斥、请求和保持、不剥夺、环路等待,四个条件缺一不可,这是判断"是否可能死锁"的标尺。

处理策略的取舍是高频简答:预防死锁最容易实现,但限制条件过严,会降低资源利用率和系统吞吐量;检测和解除死锁能让系统获得较好的资源利用率和吞吐量。预防的三条途径对应摒弃三个条件:摒弃请求和保持,要求进程运行前一次性申请全部资源,只要有一种不能满足就整体等待;摒弃不剥夺,已持有资源的进程再申请新资源失败时必须释放已持有的全部资源,以后重新申请;摒弃环路等待,把所有资源按类型线性排序并赋序号,进程必须严格按序号递增次序请求,资源分配图就不可能成环。

3.4 银行家算法:安全序列怎么推

银行家算法是这章唯一需要动手算的题。给一张 Allocation、Need、Available 表,第一步算 Work+Allocation,第二步找 Need≤Work 的进程,第三步回收其 Allocation 继续找,直到所有进程都能 finish。以题目数据为例,存在安全序列 P0→P3→P4→P1→P2,所以初始状态安全。当 P2 请求 Request(1,2,2,2) 时,先做合法性检查:Request 不超过 Need、不超过 Available;试分配后 Available 变为 (0,4,0,0),此时没有任何进程的 Need 能被满足,系统进入不安全状态,因此不能分配。

检查步骤判断内容本例结果
请求≤Need(1,2,2,2)≤(2,3,5,6)通过
请求≤Available(1,2,2,2)≤(1,6,2,2)通过
试分配后找安全序列Available=(0,4,0,0)找不到,拒绝

提示:安全序列不唯一,考试写出任意一条即可,但每一步的 Work、Need、Allocation、Work+Allocation 四列要写全,否则过程分拿不到。

4. 存储器管理:装入链接、分页分段与页面置换

4.1 装入方式与链接方式

配置层次式存储器的理由有三:多个存储器使两端硬件能并行工作;多级存储特别是 Cache 是减轻存储器带宽对系统性能影响的最佳结构方案;微处理机内部设缓冲存储器、增加寄存器数量可缓解对存储器的压力。程序装入内存有三种方式:绝对装入适用于单道程序环境,重定位装入和动态运行时装入适用于多道程序环境。链接分三种:静态链接在运行前把目标模块和库函数链接成完整装配模块且不再拆开;装入时动态链接边装入边链接,遇到外部模块调用就去找并修改相对地址;运行时动态链接把链接推迟到执行时,发现被调用模块未装入才由 OS 装入并链接。链接时要完成两件事:修改相对地址、变换外部调用符号。

动态重定位的引入是因为程序运行中经常要在内存中移动,移动后必须修改地址才能正常执行;实现靠硬件地址变换机构,增设重定位寄存器存放程序在内存的起始地址,真正访问的地址是相对地址与寄存器值相加。

4.2 分区分配策略与对换

四种分区分配策略的优缺点要成对记:首次适应保留高址大空闲区、利于大作业,但低址不断被划分留下大量小空闲区且每次从低址查找增加开销;循环首次适应让空闲区分布更均匀、减少查找开销,但缺乏大空闲区装不下大作业;最佳适应每次给最合适的分区,但留下大量难以利用的小空闲区;最坏适应剩下的空闲区不至于太小、碎片几率最小,但缺乏大空闲区不利于大文件。引入对换能把暂不运行的进程或暂不用的程序数据换到外存,腾出内存给具备运行条件的进程,提高内存利用率。以进程为单位对换时并非整个进程换出:PCB 总有部分或全部常驻内存,程序段和数据段可能正被若干进程共享,这两部分不能换出。

4.3 分页与分段:三维度区别

分页需要页表机制和地址变换机构的硬件支持。分页与分段的共同点是都采用离散分配、都要通过地址映射机构实现地址变换;区别有三:功能上页是物理单位,分页是为消减内存外零头、提高利用率,满足系统管理需要,段是逻辑单位,含一组意义相对完整的信息,满足用户需要;大小上页固定由系统确定,段长度不固定由用户程序决定;地址空间上分页是一维的,分段是二维的。分段更易实现共享和保护,因为每段从 0 开始编址、地址连续,共享保护只需设一个段表项把基址与内存地址对应,而分页每页分散存储,需要建立大量页表项一一对应。

连续分配与离散分配的比较要落到"各自适合什么":连续分配包括单一连续和分区式,单一连续最简单但只适合单用户单任务,固定分区会造成空间浪费,动态分区按需分配但四种算法各有碎片问题;离散分配包括分页、分段、段页式,分页提高内存利用率,分段满足用户需要且共享保护更优,段页式取长补短,既有分段便于共享保护动态链接的优点,又能像分页那样解决外部碎片和离散分配问题。

4.4 虚拟存储器与页面置换计算

虚拟存储器的特征是离散性、多次性、对换性、虚拟性,最本质的特征是离散性,最重要的特征是虚拟性——这两个"最"又是易混点。实现虚拟存储器需要页表机制、缺页中断机构、地址变换机构(分段系统对应段表、缺段中断、地址变换机构)。请求分页的物理块分配策略有三种:固定分配局部置换、可变分配全局置换、可变分配局部置换。

FIFO 缺页计算是必练题型。页面走向 4、3、2、1、4、3、5、4、3、2、1、5,物理块 M=3 时缺页 9 次、缺页率 75%;M=4 时缺页 10 次、缺页率 83%。块数增加反而缺页增加,这就是 Belady 现象,只有 FIFO 这类算法会出现,LRU 和 OPT 不会。改进型 Clock 算法在考虑页面使用情况之外再引入置换代价:换出时若页面被修改过要写回磁盘,未修改则不必,所以优先选未使用且未修改的页面换出。

抖动是指内存无空闲又发生缺页时调出一页,刚换出的页很快又被访问需重新调入,频繁换页使系统大部分时间耗在换进换出上,几乎不能完成有效工作。成因是 CPU 利用率与多道程序度的矛盾:提高多道程序度本为提高利用率,却造成缺页率急剧上升、利用率下降,调度程序又继续提高多道程序度,形成恶性循环。

5. 设备管理:I/O 控制方式、缓冲与 SPOOLing

5.1 三种通道与瓶颈破解

字节多路通道含许多非分配型子通道连接低中速设备,子通道按时间片轮转共享主通道,按字节传送,一个子通道交换完一个字节立即让出主通道给下一个;数组选择通道只含一个分配型子通道,一段时间只能执行一道通道程序、控制一台设备按数组传送,被占用后一直独占直到传完,利用率低,主要用于多台高速设备;数组多路通道结合两者优点,含多个非分配型子通道连接高中速设备,按时间片轮转共享主通道、按数组传送,既有高速率又有满意的通道利用率。

通道不足造成的瓶颈,最有效的解法是增加设备到主机间的通路而不是增加通道,即一个设备连多个控制器、一个控制器连多个通道。多通路不仅解决瓶颈,还提高可靠性,个别通道或控制器故障不会让设备与存储器之间无法建立通路。

5.2 I/O 控制方式的演进与适用场合

推动 I/O 控制发展的因素有三:尽量减少 CPU 对 I/O 控制的干预,把 CPU 从繁杂控制中解脱出来做数据处理;缓和 CPU 高速性与设备低速性的矛盾,提高利用率和吞吐量;提高 CPU 与 I/O 设备的并行程度。四种控制方式及适用场合:程序 I/O 方式适用于早期无中断的计算机系统;中断驱动方式普遍用于现代计算机系统;DMA 方式适用于块设备与主机交换数据;I/O 通道方式适用于一组数据块的交换,但要求系统配置相应通道及通道控制器。

5.3 单缓冲与双缓冲的时间公式

单缓冲下,磁盘把一块数据输入缓冲区时间为 T,OS 把缓冲区数据传到用户区为 M,CPU 计算为 C。设备输入与 CPU 处理可并行,所以每块数据处理时间为 max(C,T)+M。双缓冲下设备输入与 CPU 处理并行、设备输入与数据传送也并行,耗时约为 max(C+M,T),因 M 是内存内搬移、非常短暂可省略,近似为 max(C,T)。这两个公式要能解释"为什么",而不是只背结果。

5.4 设备独立性与 SPOOLing 虚拟设备

引入设备独立性使应用程序独立于具体物理设备,设备分配更灵活,也容易实现 I/O 重定向。实现的关键是在设备驱动程序之上设一层设备独立性软件,执行所有 I/O 设备的公用操作并向用户层提供统一接口,系统中设置逻辑设备表 LUT 完成逻辑设备到物理设备的映射,表目含逻辑设备名、物理设备名、驱动程序入口地址三项。分配独占设备的步骤是一条链:进程以逻辑设备名请求,查 LUT 得物理设备类型指针,检索系统设备表找空闲且安全可用的设备控制表,再依次检查控制器控制表、通道控制表是否忙碌,忙则挂等待队列,三者都分配成功才算成功,然后启动设备传送。

虚拟设备是通过虚拟技术把一台独占设备变换成若干台逻辑设备供多个进程同时使用,实现依赖的关键技术是 SPOOLing。后台打印时,输出进程在输出井中申请空闲盘块区存放待打印数据,这是 SPOOLing 系统为请求 I/O 进程提供服务的起点,后续再由输出进程按队列实际打印。

6. 查漏补缺:一份可执行的复习清单

复习到这一步,最怕的不是不会,而是"以为会了"。我的做法是把五章压成一张自测表,每行一个必答点,能不看书画出关键词才算过。下面这张表按章排列,右列是我自己踩过的坑,你可以直接拿去对照。

章节必答点常见翻车处
引论OS 四大特征、最基本与最重要之分把"最基本"答成"最重要"
引论分时与实时三线对比及时性衡量标准混用
进程PCB 为何是唯一标志只答"记录信息"不答"系统据此感知进程"
进程三态转换双向原因阻塞到就绪写成被调度
进程wait/signal 物理含义忘记 value≤0 时唤醒
进程生产者消费者改错wait 互换与 signal 互换混为一谈
调度三级调度任务高级调度对象写成进程
死锁四条件与三种预防途径预防与避免策略张冠李戴
死锁银行家算法安全序列试分配后忘检查 Available
内存分页分段三维区别地址空间维数答反
内存FIFO 缺页与 Belady块数增加就认定缺页必减
内存虚拟存储最本质/最重要特征离散性与虚拟性互换
设备单双缓冲时间公式只背公式不解释并行关系
设备独占设备分配六步漏掉通道检查

具体怎么用这张表:第一遍合上书,对每行口述 30 秒,卡壳的做记号;第二遍只攻记号行,回到对应章节把那段答案的因果链重新推一遍,而不是重读;第三遍挑计算题——前趋图信号量、银行家算法、FIFO 缺页——各手写一遍,写的时候强制标出每一步的参数含义。计算题是操作系统的黑匣子,光看答案觉得顺,自己动笔就露馅,这是血泪经验。

还有一个容易被忽略的动作:把每道简答题的答案压缩成"结论 + 一句理由"。比如"最基本特征是并发和共享,因为多道程序环境下两者互为存在条件",考场上先写结论再补理由,比整段背诵更抗紧张。前趋图和信号量题则相反,必须完整写出 wait/signal 序列,少一个就扣分,没有后悔药。

从那以后我每次复习操作系统,都强制走一遍"合书口述—标记卡壳—手写计算—压缩结论"这四步,哪怕时间只够走一遍,也比通读三遍答案踏实。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进