简介:这份资源是《计算机操作系统(第三版)》课后习题的参考答案文档,面向高校计算机专业学生、考研复习者以及准备操作系统课程考核的学习者,用于对照教材章节核对习题思路、梳理核心考点。内容覆盖操作系统引论、分时系统、进程管理、进程控制块、进程状态转换与并发编程等章节,对设计目标、OS作用、分时系统关键问题、进程与程序的区别、PCB作用及信号量机制等典型题目均给出条理清晰的解答,便于读者逐章自测与查漏补缺。资源包共1个文件,为doc格式文档,整体约170KB,体积轻便,适合直接打开查阅或打印复习。目前已有512人学习下载,可作为课程同步练习与期末、考研复习阶段的辅助参考资料。
1. 操作系统到底在管什么:从“课后答案”说起
很多人第一次翻开操作系统教材,看到“并发性、共享性、虚拟性、异步性”这四个词,脑子里冒出来的不是理解,而是一串问号:这到底在说啥?其实可以把操作系统想成一家大型餐厅的“总调度”:厨房、服务员、餐桌、排队取号的顾客,全归它协调。你点菜时不用关心后厨谁在炒、灶台怎么分配,操作系统也一样,它把硬件藏在自己身后,给用户和程序一个“看起来很好用”的界面。这份《计算机操作系统(第三版)课后习题答案》整理的,正是围绕这套调度逻辑展开的核心问答,从引论、进程管理到调度、存储、设备,把教材里那些绕口的定义一条条拆开。搞懂它,你再看“进程”“死锁”“缺页”这些词,就不会觉得是玄学。
2. 操作系统引论:四个目标和三大作用到底在说什么
2.1 设计现代操作系统的四个目标
教材里给出的四个目标是方便性、有效性、可扩充性和开放性。这四个词单看都认识,连起来却容易背完就忘。通俗地说,方便性解决的是“人怎么用机器”——没有操作系统,你得自己对着硬件发号施令;有效性解决的是“机器怎么不闲着”,让 CPU 和 I/O 设备尽量并行干活;可扩充性解决的是“以后加新功能方不方便”,系统结构要能长出新模块;开放性解决的是“能不能和外面的世界对接”,遵循统一标准,别家写的程序也能跑。
打个比方,一家餐厅要开得久,得让顾客点菜方便(方便性)、后厨出菜快(有效性)、以后加新菜系不用推倒重来(可扩充性)、还能接入外卖平台(开放性)。四个目标之间有时会打架,比如追求方便可能牺牲一点效率,所以操作系统设计从来不是单选题,而是权衡。
2.2 操作系统的三大作用
答案里把 OS 的作用归为三条:作为用户与计算机硬件系统之间的接口、作为计算机系统资源的管理者、实现了对计算机资源的抽象。这三条其实是同一个意思的三个侧面。接口说的是“你通过它跟硬件打交道”,管理者说的是“它决定谁先用、谁后用、用多少”,抽象说的是“它把复杂的硬件细节包装成简单概念”。
拿文件来举例最直观。硬盘上本来是一堆扇区、磁道、柱面,操作系统把它抽象成“文件”和“目录”,你双击一个文档就能打开,完全不用管数据落在哪块盘片上。这就是抽象的价值:把复杂留给自己,把简单留给用户。资源管理则体现在你同时开十个程序,系统要决定 CPU 时间怎么分、内存怎么让、谁先打印,背后全是调度。
2.3 分时系统的关键问题与解决办法
分时系统要解决的核心问题是“及时交互”:用户在终端敲一条命令,系统得赶紧接收、赶紧处理、赶紧把结果送回来。答案里给的方案很具体——及时接收靠多路卡,让主机能同时接收多个终端的数据,每个终端再配一个缓冲区暂存命令;及时处理靠让所有用户作业直接进内存,并给每个作业分配时间片,只在自己的时间片里运行。
这里的时间片可以理解成“轮流发言的时长”。每个人说一小会儿就换下一个人,轮一圈下来时间很短,每个用户都感觉自己独占了一台机器。这正是分时系统“看起来公平”的秘诀,也是它和实时系统最容易混淆的地方,后面会专门拆开讲。
3. 进程管理:为什么程序一“跑起来”就变了样
3.1 进程和程序的区别:静态图纸与施工队
教材里反复强调:程序是一组有序指令的集合,是静态实体;进程是程序的一次执行,有创建、调度、暂停、消亡的生命期。用盖房子打比方,程序是图纸,进程是拿着图纸干活的施工队。图纸可以复印很多份,但每支施工队都有自己的进度、自己的材料占用、自己的停工原因。
答案从动态性、并发性、独立性三个角度做了比较。动态性是进程最基本的特性,它“活”着,会走走停停;并发性是说多个进程能在一段时间内交替推进,而单个程序本身做不到;独立性是说进程是独立获得资源和独立调度的基本单位。理解这三条,后面学 PCB、状态转换、同步互斥就都有了落脚点。
3.2 PCB:进程存在的唯一标志
PCB(进程控制块)是操作系统里最重要的记录型数据结构之一。答案说得很明确:系统是根据 PCB 而不是别的什么来感知进程存在的,所以 PCB 是进程存在的唯一标志。你可以把 PCB 想成每个进程的“档案袋”,里面记着它是谁、现在什么状态、占用了哪些资源、程序和数据在哪、优先级多少。
进程的整个生命周期里,系统都是通过 PCB 对它进行控制的。创建进程本质上是建立 PCB,撤销进程本质上是回收 PCB。这也解释了一个常见困惑:为什么说“进程实体”由程序段、数据段和 PCB 组成?因为光有代码和数据,系统根本不知道有这么个东西在跑,必须有档案袋登记在册。
3.3 三种基本状态与挂起状态
进程的三个基本状态是就绪、执行、阻塞。转换原因答案列得很清楚:就绪的进程被调度程序分配了处理机,就变成执行;执行中的进程因某事件无法继续(比如申请的资源被占用),就变成阻塞;时间片用完,又从执行回到就绪。这三者构成一个循环,是理解调度的基础。
挂起状态则是另一层概念。引入它主要有四种需要:终端用户请求、父进程请求、负荷调节、操作系统自身需要。被挂起的进程处于静止状态,不能直接被处理机调度。打个比方,就绪和阻塞是“在候车厅等车”,挂起是“被请出候车厅先到旁边待着”,位置还在,但暂时不参与排队。这个区别在讲对换和虚拟存储时会反复用到。
3.4 同步与互斥:临界区为什么要“进门登记、出门销号”
多个进程抢同一个资源,就必须有规矩。答案里提到同步机构应遵循四条准则:空闲让进、忙则等待、有限等待、让权等待。前两条好理解,后两条是防止“饿死”和“空转浪费 CPU”。临界区之前要执行进入区代码,检查资源是否被占用;退出前要执行退出区代码,恢复访问标志,让别的进程能进来。
记录型信号量的 wait 和 signal 是这套规矩的具体实现。wait 时如果资源还有(S.value>0),就减一占用;如果没有(S.value<0),就阻塞自己并挂到信号量链表上。signal 时先加一释放资源,如果加完还小于等于零,说明链表里还有人在等,就唤醒一个。这里的关键是:信号量的值不只是计数,负数还代表等待进程的数量,这个设计很巧妙。
3.5 生产者—消费者问题里的经典翻车点
答案里有两道题特别值得琢磨。第一道:如果缺少 signal(full) 或 signal(empty) 会怎样?缺 signal(full),消费者会一直以为缓冲区是空的,永远等下去;缺 signal(empty),生产者把缓冲区塞满后就再也申请不到空位,同样卡死。第二道:如果把 wait(full) 和 wait(mutex) 互换位置,可能死锁。原因是生产者先拿到互斥锁,再去等空位,空位没有就阻塞,而它握着锁不放,消费者进不来,谁也动不了。
这类题之所以经典,是因为它把“顺序”这件事讲透了。同步信号量和互斥信号量的 wait 顺序不能随便换,血泪经验就是:先等资源条件,再拿互斥锁。答案里还提到 signal(mutex) 和 signal(full) 互换只影响释放次序,不会死锁,这个对比正好帮人分清“哪些顺序要命、哪些顺序只是风格”。
4. 调度、死锁与存储:几个最容易背混的概念
4.1 常见误区:这些概念长得像,用起来差很远
易混点一:分时系统与实时系统。为什么混?两者都讲“及时”。怎么区分?分时系统的及时是“人能接受的等待”,追求交互体验;实时系统的及时是“控制对象要求的截止时间”,追求确定性。答案明确说,实时系统对可靠性要求更高,交互能力反而不如分时系统。
易混点二:进程与线程。为什么混?都跟“执行”有关。怎么区分?传统系统里进程既是资源拥有单位,又是调度分派单位;引入线程后,线程是调度分派单位,进程退居资源拥有单位。线程基本不拥有资源,但能访问所属进程的资源,创建和切换开销明显小于进程。
易混点三:分页与分段。为什么混?都是离散分配,都要地址变换。怎么区分?页是物理单位,大小固定由系统定,目的是减少内存外碎片;段是逻辑单位,长度不定由程序定,目的是满足用户模块化需要。分页地址空间是一维的,分段是二维的,这个差别在算地址时特别容易翻车。
易混点四:死锁的四个必要条件与预防手段。为什么混?四个条件背得滚瓜烂熟,一到“摒弃哪个”就乱。怎么区分?互斥条件通常不动;请求和保持靠“一次性申请全部资源”来破;不剥夺靠“拿不到就释放已有”来破;环路等待靠“资源按序申请”来破。答案里说预防死锁最容易实现但资源利用率低,检测和解除则相反,这个取舍要记牢。
易混点五:Belady 现象与抖动。为什么混?都跟缺页有关。怎么区分?Belady 现象是 FIFO 算法下“物理块增多、缺页反而增多”的反常;抖动是内存紧张导致页面频繁换进换出,系统大部分时间耗在换页上。前者是算法特性,后者是系统状态,答案里那道 M=3 缺页 9 次、M=4 缺页 10 次的题就是 Belady 现象的典型例子。
4.2 调度算法与死锁处理的选择逻辑
高级调度决定哪些作业从外存进内存,低级调度决定就绪队列里谁拿处理机,中级调度则是为了提高资源利用率和吞吐量而引入的“中间层”。FCFS 和 SPF 的对比很直白:前者有利于长作业、不利于短作业,后者反过来。答案没有堆公式,而是把“谁受益、谁受损”讲清楚了,这比背平均周转时间公式更有用。
死锁处理有四类办法:预防、避免、检测、解除。预防是提前破坏必要条件,简单但限制严;避免是银行家算法那样边分配边判断安全性;检测和解除则是先让它发生再收拾。答案里那道银行家算法题,判断安全序列是 ,而 P2 请求 (1,2,2,2) 后系统进入不安全状态,所以不能分配。这类题的关键不是算得快,而是理解“安全状态”不等于“不会死锁”,只是“存在一条让所有进程都能完成的路径”。
4.3 存储管理:连续与离散的取舍
连续分配给一个程序一整块连续空间,简单但容易产生碎片;离散分配把程序打散到不相邻的分区,分页、分段、段页式都属于这一类。答案对四种分区分配算法的优缺点列得很细:首次适应保留高址大空闲区但低址碎片多;循环首次适应分布均匀但缺大分区;最佳适应留下大量小碎片;最坏适应碎片少但缺大分区。这些结论不用死记,抓住“碎片大小”和“查找开销”两个维度就能推出来。
虚拟存储器的特征答案给了四个:离散性、多次性、对换性、虚拟性,并指出最本质的是离散性、最重要的是虚拟性。实现它需要页表机制、缺页中断机构和地址变换机构这些硬件支持。请求分页的三种物理块分配策略——固定分配局部置换、可变分配全局置换、可变分配局部置换——名字长,但拆开看就是“块数变不变”和“置换范围全局还是局部”两个维度的组合。
5. 设备管理与 I/O:什么时候该用这套答案,什么时候别硬套
5.1 四种 I/O 控制方式的适用边界
答案把 I/O 控制方式分成程序 I/O、中断驱动、DMA、I/O 通道四类。程序 I/O 适合早期无中断系统,CPU 全程盯着,效率最低;中断驱动让 CPU 不用干等,设备完成时打断一下,现代系统普遍使用;DMA 适合块设备成批传数据,CPU 只在开始和结束时介入;I/O 通道更进一步,用一组数据块为单位,需要专门的通道硬件。选择逻辑其实就一句话:数据量越大、设备越多,就越需要把 CPU 从搬运工的角色里解放出来。
单缓冲和双缓冲的处理时间公式也值得说清楚。单缓冲下,设备输入时间 T 和 CPU 计算时间 C 可以并行,但缓冲区数据传到用户区的时间 M 通常不能完全重叠,所以整块处理时间约为 max(C,T)+M。双缓冲下,输入和传送也能并行,近似为 max(C,T)。这里的 M 是内存内“搬家”的耗时,通常很短,所以常被忽略。理解这个推导,比背公式更能应对变体题。
5.2 设备独立性与虚拟设备
设备独立性是指应用程序不直接绑定具体物理设备,而是用逻辑设备名申请,由系统通过逻辑设备表 LUT 映射到物理设备。好处是分配灵活、容易实现 I/O 重定向。答案里分配独占设备的步骤有六步,从逻辑设备名查到物理设备,再依次检查设备、控制器、通道是否空闲,三者都成功才算分配成功。这个“逐层检查”的思路,和前面进程状态转换一样,都是操作系统里常见的分层控制。
虚拟设备则是用 SPOOLing 技术把一台独占设备变成多台逻辑设备,典型例子是后台打印。多个进程同时请求打印,系统先把输出存到磁盘的输出井,再由输出进程排队真正送打印机。用户感觉自己独占了一台打印机,实际上是在共享。这里的关键技术就是 SPOOLing,它把“独占”变成了“排队共享”。
5.3 什么时候用这份答案,什么时候别只靠它
这份课后习题答案最适合的场景很明确:你在学操作系统课程,刚看完一章,需要对照检查自己有没有把概念理解偏;或者你在准备考试,想快速回顾每章的高频问答题和典型计算题。它的价值在于把教材里散落的定义、比较、算法步骤整理成可直接对照的问答,尤其是进程同步、银行家算法、页面置换这类容易出计算题的地方,答案给了完整的推演过程。
但它也有边界。第一,它是对教材习题的解答,不是从零讲起的教程,如果你连“进程”和“线程”都没分清,直接看答案会越看越懵,最好先过一遍教材对应章节。第二,答案里的代码和算法描述偏伪代码风格,比如信号量的 wait/signal、前趋图的 parbegin/parend,直接复制去跑并不现实,理解逻辑比照抄更重要。第三,操作系统这门课不同教材、不同版本的术语和侧重点有差异,这份答案对应的是第三版的内容,遇到对不上的地方以你手头的教材为准,别硬套。
我自己的习惯是:每看完一章教材,先自己把课后题做一遍,卡住的地方再翻这份答案对照,重点看“它为什么这么答”而不是“答案是什么”。尤其是死锁和页面置换那几道计算题,第一遍算错很正常,对着答案把每一步的中间状态写出来,比只看结论有用得多。从那以后我每次复习操作系统,都会先把每章的典型题手推一遍再对答案,避免“看懂了但写不出”的错觉。希望这份整理也能帮到你,把那些绕口的概念真正变成自己的东西。
本文还有配套的精品资源,点击获取