简介:计算机操作系统(第三版)课后习题答案面向正在学习操作系统课程的计算机专业本科生,也适用于考研复习阶段对照巩固基础知识,帮助使用者在完成课后练习时核对解题思路、掌握操作系统核心概念。这份资源以1个doc电子文档呈现,压缩包大小约170KB,内容集中,便于按章节查阅和快速定位题目答案。文档涵盖第一章操作系统引论与第二章进程管理相关习题解答,包括操作系统设计目标与作用、分时系统与实时系统在交互性和及时性上的比较、并发程序执行的间断性与封闭性、PCB作用与进程状态转换、记录型信号量Wait和Signal操作原理等知识点,答案附有较为清晰的推导与说明。资源目前已有509人学习浏览,适合需要系统梳理操作系统重点内容、备战期末考试或考研专业课复习的读者使用。
1. 为什么这本教材的课后题值得认真做:答案背后是解题思维
很多人在学操作系统时,手里有一套“计算机操作系统(第三版)课后习题答案”,但真正用到的时候发现,题是看懂了,换个问法又不会了。原因很简单:答案只是结果,解题的推导过程才是操作系统这门课最值钱的部分。进程调度怎么算等待时间、银行家算法怎么判断安全序列、页面置换缺页率怎么数,这些题型在考试、考研、面试里反复出现,规律极其固定。如果你只会对照答案背结论,遇到稍微变通的题目就只能干瞪眼。
这篇文章不打算贴整本答案,那没有意义。我按自己做题和带人复习的经验,把课后题按题型拆成可复用的解题模板,配合具体算例和踩坑记录,让你拿任何一套课后习题答案都能真正用起来。不管你是还在上课的学生,还是准备考研、准备求职面试的开发者,这套方法都能直接上手。
2. 按章节梳理知识框架:先建体系再做题,效果翻倍
课后习题答案如果脱离知识体系去背,效率极低。操作系统的知识点之间有强依赖关系:不懂进程状态机,就看不懂调度算法的意义;不懂地址转换,页面置换题做对了也是蒙的。所以做题之前,先把整本书的框架在脑子里过一遍。
2.1 进程与线程:操作系统最核心的抽象
进程这一章是整本教材的根基。课后题集中在几个方向:进程与程序的区别、PCB(进程控制块)里存什么、进程三态图里状态怎么迁移、同步与互斥的概念、信号量的含义。这些题看起来是纯概念,但恰恰是后面所有计算题的前提。
我一般会建议先把进程五态图画熟练:创建、就绪、运行、阻塞、终止,然后弄清两个关键转移——运行到阻塞是主动等待事件,运行到就绪是被抢占或时间片用完。很多选择题的陷阱就藏在“运行态只能主动进入阻塞态”这一点上,进程不能自己把自己从就绪改成阻塞。
做题时有个技巧:凡是涉及“多个进程共享资源”的题,先判断是互斥问题还是同步问题。互斥是“同一时刻只能一个进程用”,同步是“一个进程等另一个进程完成某个动作”。课后题里大量PV操作的题目,第一步判断错,后面全错。
2.2 调度与死锁:算法题的主战场
这一章是计算题的密集区。先弄清调度算法的评价指标:周转时间、带权周转时间、等待时间、响应时间。这四个指标的定义必须精确记忆,因为后面所有调度算法题都在算这些数值。
调度算法本身不难,但容易混:先来先服务(FCFS)按到达顺序排;短作业优先(SJF)按服务时间排,注意抢占式版本又叫SRTF;时间片轮转(RR)要画时间轴,注意每个进程到达时间不同,就绪队列动态插入;优先级调度要区分抢占式和非抢占式。
死锁这块只有一个核心:死锁的四个必要条件——互斥、持有并等待、不可剥夺、循环等待。四个条件缺一不可,破坏任何一个就能防止死锁。课后题里关于死锁的简答题基本围绕这个展开,计算题则是银行家算法。
2.3 内存管理:从地址转换到页面置换
内存管理章节的课后题,计算量最大。逻辑地址到物理地址的转换是基础中的基础。公式很直接:物理地址 = 页框号 × 页框大小 + 页内偏移,前提是页面大小是2的整数次幂,这样页内偏移可以直接从逻辑地址低位截取。
页面置换算法是另一个计算题大户。OPT(最优置换)是理论下限,FIFO(先进先出)有Belady异常,LRU(最近最久未使用)是考试和面试最常考的近似最优算法。做题时一定要画表格,一行一个访问序列,一列一个物理块,把每次访问后各块的内容写出来,缺页次数一目了然。
这一章还有一个重点:分段和分页的区别。简答题常考,从“是否产生外部碎片”“逻辑地址结构”“共享与保护的方式”三个角度答,基本上就是满分答案。
2.4 文件系统与磁盘管理:常被忽略的拿分项
文件系统这一章,课后题相对简单,但知识点杂:文件的逻辑结构(顺序、索引、索引顺序)、物理结构(连续、链接、索引)、目录结构(单级、两级、树形)、空闲空间管理(位示图、空闲链表、成组链接)。
磁盘调度算法建议用表格式复习:FCFS按请求顺序服务,SSTF选离当前磁道最近的,SCAN沿一个方向扫到底再回头,C-SCAN只沿一个方向扫。计算时先画磁道数轴,标好当前磁头位置和请求序列,再按算法规则移动。
这里有个高频简答题:索引节点(inode)里存了什么。答案分两部分:文件属性信息(大小、权限、时间戳)和盘块指针。课后题有时候会结合“文件系统能支持的最大文件大小”来考,本质是用索引的级数算指针能指向多少盘块。
章节知识图谱与对应题型速查表
| 章节 | 核心知识点 | 常考题型 | 课后题分布规律 |
|---|---|---|---|
| 进程管理 | 进程状态、同步互斥、信号量 | 简答、PV操作 | 概念题多,PV题集中 |
| 调度与死锁 | 调度算法、银行家算法 | 计算题 | 每类调度算法至少一题 |
| 内存管理 | 地址转换、页面置换 | 计算题 | 置换算法必考 |
| 文件系统 | inode、目录结构、空闲管理 | 简答、计算 | 位示图计算常出现 |
| 磁盘管理 | 磁盘调度算法 | 计算题 | 画图题出现频率高 |
| 设备管理 | I/O控制方式、SPOOLing | 简答 | 概念辨析为主 |
3. 按题型拆解题思路:找到每类题的标准解法
课后习题答案里的题目,看起来五花八门,归纳起来就是四类:概念简答题、调度/地址转换计算题、PV操作题、页面置换与磁盘调度题。每一类都有固定的解题套路,按套路走,正确率能稳定提高,而不是靠感觉。
3.1 概念简答题:把“关键词+对比+举例”三件套用起来
操作系统简答题有个通病:背了答案,考场上换个问法就不知道怎么组织语言。我建议用“关键词 + 对比 + 举例”三层结构来答任何概念题。
比如问到“分页和分段的区别”,标准答法是先各给一句定义(关键词),然后从地址结构、是否产生外部碎片、是否逻辑独立三个维度做对比,最后各举一个小例子说明。这样的答案既有得分点,又有逻辑层次,不会被扣分。
课后题里有一类题特别容易翻车:“描述进程从创建到终止的整个生命周期”。很多人上来就背状态名,但漏了“创建→就绪”和“就绪→运行”这两个转移的触发条件。答这类题时,先画状态转移链,然后对每个箭头写出触发事件,最后补充PCB的创建与回收。三步走完,基本能拿满分。
3.2 计算题:调度算法与地址转换的统一解题流程
调度算法的计算题看起来种类多,本质只有一个:按时间轴推进,记录每个进程的开始时间、完成时间,再套公式。FCFS、SJF、RR都是这个流程,区别只在就绪队列的排列规则。
我拿银行家算法作为计算题的示范,因为它是死锁章节最经典、也最容易算错的一道题。题目通常给一个系统状态:进程对各类资源的最大需求、已分配资源、系统剩余资源。解题分四步:
第一步,用最大需求减已分配,得到每个进程还需要的资源数 Need。
第二步,用系统总资源减所有已分配资源之和,得到 Available。
第三步,在 Available 足够满足某个进程的 Need 时,假设该进程完成并释放资源,更新 Available,把进程加入安全序列。
第四步,重复第三步,直到所有进程都能完成。如果某一步没有任何进程的 Need 能被满足,系统就不安全。
下面给一个具体算例。假设系统中有五个进程 P0 到 P4,三类资源 A、B、C,总数为 (7, 5, 3)。已分配情况如下:
进程 已分配 最大需求 P0 (0, 1, 0) (7, 5, 3) P1 (2, 0, 0) (3, 2, 2) P2 (3, 0, 2) (9, 0, 2) P3 (2, 1, 1) (2, 2, 2) P4 (0, 0, 2) (4, 3, 3)先算 Need:
| 进程 | Need (还需) | 当前Available |
|---|---|---|
| P0 | (7, 4, 3) | (3, 3, 2) |
| P1 | (1, 2, 2) | (3, 3, 2) |
| P2 | (6, 0, 0) | (3, 3, 2) |
| P3 | (0, 1, 1) | (3, 3, 2) |
| P4 | (4, 3, 1) | (3, 3, 2) |
找第一个 Need 能被 Available 满足的进程:P1 的 (1, 2, 2) 和 P3 的 (0, 1, 1) 都能满足。按序号优先取 P1,P1 完成后释放资源,Available 变为 (3, 3, 2) + (2, 0, 0) = (5, 3, 2)。
再扫一轮,P3 的 (0, 1, 1) 可以被满足,执行后 Available 变为 (5, 3, 2) + (2, 1, 1) = (7, 4, 3)。接下来 P0、P2、P4 依次都能被满足,安全序列为 P1、P3、P4、P0、P2(后续顺序可能不同,但第一步取 P1 是常见惯例)。
参数说明:银行家算法的关键参数是 Available、Allocation、Max、Need 四个矩阵。做题时先把每个进程的 Need 显式列出来,再逐轮扫描,可以避免“看起来不安全但其实安全”的误判。
3.3 PV操作题:从同步关系出发设计信号量的四步法
PV操作题是课后习题里最让新手头疼的,但其实有固定套路。我用四步法拆解:
第一步,找出题目中的所有“前驱—后继”关系。例如生产者必须等缓冲区有空位才能放,消费者必须等缓冲区有数据才能取。
第二步,为每个约束关系设置信号量。互斥关系用互斥信号量,初值通常为1;同步关系用资源信号量,初值通常为缓冲区大小或0。
第三步,确定每个信号量的 P、V 位置。P 操作放在“使用资源之前”,V 操作放在“释放资源之后”。特别注意:同步信号的 P 必须放在互斥信号量的 P 之前,否则可能死锁。
第四步,检查每个进程的代码路径,确保信号量成对出现,且不会出现“自己等自己释放”的死循环。
单缓冲区的生产者消费者问题,标准写法是:
Semaphore empty = 1; /* 空缓冲区数量 */ Semaphore full = 0; /* 满缓冲区数量 */ Semaphore mutex = 1; /* 互斥访问缓冲区 */ Producer() { while (true) { produce_item(); P(empty); /* 申请一个空位,没有空位则阻塞 */ P(mutex); /* 进入临界区,互斥锁 */ put_item(); V(mutex); /* 退出临界区 */ V(full); /* 缓冲区多了一个满位,唤醒消费者 */ } } Consumer() { while (true) { P(full); /* 申请一个满位,没有数据则阻塞 */ P(mutex); /* 进入临界区 */ take_item(); V(mutex); /* 退出临界区 */ V(empty); /* 缓冲区多了一个空位,唤醒生产者 */ consume_item(); } }逻辑说明:empty 和 full 是同步信号量,mutex 是互斥信号量。同步信号量的 P 操作必须先于互斥信号量的 P 操作,否则可能出现生产者持有互斥锁后在 empty 上阻塞,消费者无法进入临界区取数据,死锁。这个顺序是课后题阅卷时的扣分点,也是面试官最爱的追问点。
3.4 页面置换与磁盘调度:画表格算,别心算
页面置换题最忌讳心算。访问序列一长,心算漏一个页面就全错。正确做法是画表:每一列是一个访问时刻,每一行是一个物理块,遇到缺页就在对应位置打标记。
拿一个经典算例:访问序列为 7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3,物理块数 3,用 LRU 算法。逐列推演:
| 时刻 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 访问 | 7 | 0 | 1 | 2 | 0 | 3 | 0 | 4 | 2 | 3 | 0 | 3 |
| 块1 | 7 | 7 | 7 | 2 | 2 | 2 | 2 | 4 | 4 | 4 | 0 | 0 |
| 块2 | 0 | 0 | 0 | 0 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | |
| 块3 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | ||
| 缺页 | √ | √ | √ | √ | √ | √ | √ | √ |
这里缺页标记按“首次装入也算缺页”的教材惯例。LRU 的关键是每次缺页时替换“最近最久未使用”的页面,比如时刻 4 访问 2,此时 7 是最近最久未使用的,所以替换 7。
磁盘调度同理,画一条磁道数轴,标记当前磁头位置和请求柱面,再按算法规则连线。SCAN 算法关键在于方向:先向一个方向服务完所有请求,再反向。很多人漏了“到达端点才回头”还是“到达最远请求即可回头”的差别,两种教材口径不同,做题时看题目默认的是哪种。
4. 对着答案做题会踩的 5 个坑:从现象到解决
用课后习题答案复习,最常见的坑不是答案错,而是使用方式错了。下面这 5 条是我和周围人都踩过的,列出来帮你避开。
4.1 背答案不背推导过程,换个条件就懵
现象:同一道题,数字换一下,或者把“求安全序列”改成“请问当前系统是否安全”,就不会做了。原因是之前只记住了答案序列,没有理解每一步为什么选那个进程。
解决:做题时把每一步的判断依据写下来,比如“因为 Available 为 (3, 3, 2),只有 P1 和 P3 的 Need 能被满足”,养成“先说明理由再写结果”的习惯。这正好也是简答题的得分逻辑。
4.2 跳过 PV 操作题,导致同步互斥题成为盲区
现象:觉得 PV 操作难,翻了几次答案看不懂,就直接跳过,结果考试和面试里最常考的就是信号量。原因是 PV 题需要从题目描述的流程反推信号量,比计算题更抽象。
解决:回到四步法,先找同步关系,再画信号量。看不懂答案的时候,把答案里的 P、V 操作在代码里标注成中文注释:这里的 P(empty) 是“没有空位就等”,V(full) 是“通知消费者有货了”。把每个信号量的含义用中文写出来,看起来就不玄学了。
4.3 刷题只看数量,不看模型归类
现象:做了二十道调度题,每道都从头算,速度一直提不上去。原因是题与题之间没有归纳,反复做的是同一种流程。
解决:每做完几道题,把题目条件抽象成模型:这题是“SJF 非抢占 + 求周转时间”,那题是“RR 时间片 2 + 求等待时间”。下次遇到新题先贴模型标签,再套对应流程,速度会明显变快。
4.4 死磕有争议的题目,浪费时间
现象:某道题的答案在不同版本里不一致,比如 SCAN 算法的回头时机,或者首次缺页是否计入缺页次数,花一小时争论对错。
解决:教材课后题以教材正文口径为准。如果教材正文没写清楚,看答案所在版本的解法,考试按出题人默认的口径答。争议题不值得投入时间,标记“按教材口径计”即可。
4.5 只看答案,不回到教材原文验证
最隐蔽的坑是:答案写得很简略,比如某道简答题只写了“通过原语实现”,但你没翻教材里“原语是什么、为什么必须用原语”的段落,下次考到“为什么 PV 操作必须是原语”依旧不会。
解决:每道题做完,回到教材正文找到对应的定义和推导段落,把上下文读一遍。这一步其实是在做知识点的二次连接,比多刷一道新题的收益大得多。
5. 把习题答案变成自己的复习材料:两种进阶做法
进阶用法不是继续刷题,而是把答案转化成自己能快速复用的复习材料。我长期用两种做法,效果稳定。
第一种是建“错题表”,但只记录错因不抄答案。表格按章节分组,一个错题占一行:题目关键词、当时的错误答案、错误类型(计算失误、概念混淆、流程遗漏)、正确思路的一句话概括。复习时先只看错误类型和正确思路,能回忆出完整过程就恢复,回忆不出再去看答案。这样每一轮复习的时间会越来越短,抓的重点越来越准。
第二种是“问题树”式自查。把教材目录里的每一节变成一个问题,比如“什么是进程控制块,里面存哪些信息”“页面置换算法的评价指标是什么”“位示图怎么分配和回收盘块”。每章只列 10 个左右的问题,独立回答,卡住的地方单独标记,再回到答案或教材里补。这个过程本质上是在构建自己的知识索引。
我自己备考时,最有效的不是从头翻答案,而是把错题表里正确思路加起来,发现 PV 操作反复错在“P 操作顺序”,页面置换总是把“首次装入缺页”漏掉。针对性补这两个点之后,正确率提升非常明显。对答案的使用,最终应该落成“跑到正确答案所需的关键分支都在自己的推导里”,而不是“答案里写了什么”。
如果你现在正对着课后题的答案发愁,按这套方法先归纳题型,再做错题分类,比从头硬刷有效得多。希望帮到你。
本文还有配套的精品资源,点击获取