尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

汤小丹操作系统第四版习题答案:核心考点与解题思路精讲

发布时间:2026/9/30 1:21:33

资讯中心
01
ARTICLE

汤小丹操作系统第四版习题答案:核心考点与解题思路精讲

汤小丹操作系统第四版习题答案:核心考点与解题思路精讲
1. 从一份习题答案说起操作系统这门课到底该怎么啃聊计算机操作系统绕不开汤小丹这本教材。第四版在很多学校的考研和期末考里几乎是指定动作而配套的习题答案成了每年考试季后台被问得最多的东西。我先把结论摆前面习题答案本身不值钱值钱的是你在对答案过程中被迫想明白的那些细节。单纯背答案考场上题目稍微一变就翻车但如果你拿答案当校验工具用它反推自己哪一步理解错了这门课的分数和真正的能力都能一起上来。先说清楚这份内容适合谁。如果你正在上操作系统课、准备期末考或者考研408里要啃操作系统部分那它对你直接有用如果你已经工作想回头把进程调度、内存管理这些底层逻辑重新捋一遍也合适——因为习题里那些PV操作、银行家算法、页面置换计算恰恰是面试和实际排查问题时最常被追问的硬骨头。全文我会围绕汤小丹第四版的知识框架展开把典型章节的核心考点、解题思路、容易踩的坑一个个拆开讲尽量让你看完就能上手做题而不是看完还是一头雾水。有一件事我得先提醒这门课最大的特点是概念多、计算多、陷阱多。概念多到你第一遍看书会觉得每页都是新词计算多到光看不动笔必然学不会陷阱多到答案和你想的差一个符号就是零分。所以下面我不打算给你一份干巴巴的答案清单而是按章节把为什么这样解怎么避免出错哪些地方是出题人最爱挖坑的位置讲透。你完全可以把它当成一份带解题思路的复习笔记来用。2. 先摸清教材骨架汤小丹第四版的知识地图与题型分布2.1 全书章节的逻辑主线汤小丹第四版的编排逻辑其实非常清楚它是沿着一台计算机从开机到运行程序这条线走的。第一章引论交代操作系统的定义、发展历程和基本特征第二章讲进程管理这是全书的绝对核心第三章是处理机调度与死锁第四章存储器管理第五章虚拟存储器第六章文件管理第七章磁盘存储器管理后面还有作业管理和接口相关的章节。你会发现进程管理、内存管理、文件与磁盘这三块占了考试分值的绝大部分。为什么这么排因为操作系统干的事说白了就四件管CPU、管内存、管文件、管设备。进程管理解决CPU给谁用、怎么切换存储器管理解决程序放哪、怎么装下比内存还大的程序文件管理解决数据怎么存、怎么找设备管理解决外设怎么高效率地被共享。你把这个主线记住再看每一章的习题就知道它在考哪个环节。我个人的建议是不要按顺序一章一章死磕。先把第二章进程、第四章内存这两块彻底吃透因为它们概念的抽象度最高、计算最密集。文件系统和磁盘调度相对具象理解起来轻松可以放到后面收尾。这样安排的原因是进程和内存的理解成本是前高后低的——前面花大力气建立直觉后面越做越顺反过来如果先学简单的到了进程同步那块会被直接劝退。2.2 各章题型分布与拿分策略从历年题来看这门课的题型大致分三类。第一类是概念判断题比如进程和程序的区别分页和分段的区别选择题和简答题里到处都是第二类是计算题PV操作、银行家算法、页面置换缺页率、磁盘调度寻道时间这几类几乎每套卷子都有第三类是综合分析题往往给一个场景让你设计同步方案或者分析一段代码会不会死锁。章节核心考点典型题型拿分难度进程管理PV操作、经典同步问题代码填空、设计题高处理机调度银行家算法、调度算法计算题中存储器管理地址转换、分页分段计算题中虚拟存储器页面置换算法缺页率计算中高文件管理目录结构、分配方式概念计算低磁盘管理磁盘调度算法寻道时间计算低这张表不是为了让你挑简单的做而是帮你分配精力。我的经验是PV操作和银行家算法这两块只要掌握了固定套路是能拿满分的投入产出比最高必须优先攻克。页面置换计算容易算错但套路也固定多练几遍就行。反倒是那些看起来简单的概念题因为范围广、容易出偏题性价比最低不用花太多时间死背理解到位即可。3. 进程管理全书的命门也是大题重灾区3.1 进程状态转换背后的隐藏考点进程的三态模型就绪、运行、阻塞看着简单但习题里最爱考的是某个事件会导致什么状态转换。比如时间片用完是从运行到就绪等待I/O是从运行到阻塞I/O完成是从阻塞到就绪。这里有个坑I/O完成永远不会直接让进程回到运行态它只能回到就绪态排队等CPU。很多人第一次做会选错原因就是把事件发生和获得CPU混为一谈了。再深入一点五态模型里多了新建态和终止态还要理解挂起状态。挂起的意思是进程被换出到外存不占内存。这里常考的一道题是一个进程被挂起后它的状态可能是就绪挂起或阻塞挂起两者的区别是什么答案是前者只差CPU、一旦调入内存就能运行后者还在等某个事件、调入内存也得继续等。这个区分理解了后面讲虚拟内存的页面换入换出时你会豁然开朗。PCB进程控制块是另一个高频点。你要记住PCB是进程存在的唯一标志它里面装了进程标识符、状态、程序计数器、寄存器现场、内存指针、资源清单等。进程切换的本质就是保存旧进程的PCB现场、恢复新进程的PCB现场。为什么切换有开销因为要保存和恢复一堆寄存器还要更新各种队列。这个开销概念在后面调度算法里会反复用到——时间片设太短切换开销占比就高系统效率反而下降。3.2 线程、管程、协程到底怎么区分热搜里管程和协程被频繁搜说明这两个概念确实容易混。我一个个说清楚。先说线程。线程是进程内的一个执行单元是CPU调度的基本单位注意传统教材里说进程是资源分配单位、线程是调度单位。同一进程内的多个线程共享地址空间和资源所以切换开销比进程小得多但一个线程崩了整个进程就崩了。习题里常问线程和进程的区别标准答案要覆盖调度单位不同、并发性不同、拥有资源不同、系统开销不同、地址空间不同。再说管程。管程是一种高级同步机制它把共享变量和对这些变量的操作封装在一起任何时刻只允许一个进程进入管程。你可以把管程理解成自带锁的房间——进门自动上锁出门自动解锁你不用自己写P/V操作。管程里用条件变量wait/signal来处理等待。汤小丹教材里管程这块的重点是它解决了信号量分散使用容易出错的问题把同步逻辑集中管理。考试里如果让你对比信号量和管程核心就是管程的同步操作由编译器自动加锁程序员不容易写错。最后说协程。严格来说协程在传统操作系统教材里着墨不多更偏编程语言和并发模型的范畴。协程是用户态的轻量级线程切换完全由程序自己控制不经过内核开销极小。它和线程最大的区别是线程切换是抢占式的、由内核决定协程切换是协作式的、由代码自己让出。很多高并发场景用它来处理大量I/O等待任务。你在做教材习题时如果碰到记住这套对比就够了如果教材没细讲考试一般也不会深挖不用慌。提示这三者最容易混的是调度者不同。进程和线程由操作系统内核调度协程由用户程序自己调度管程则是一种同步工具而非执行单元。答题时抓住谁在调度、有没有独立地址空间这两条线就不会串。3.3 进程通信的三种方式与常考细节进程之间要交换数据教材里讲了共享内存、消息传递、管道三种主要方式。共享内存最快因为数据不用在用户态和内核态之间来回拷贝但需要自己配合同步机制这就又回到信号量了。消息传递适合分布式环境通过发送/接收消息来通信解耦性好但开销大。管道是半双工的一端写一端读本质是一段内核缓冲区。这里有个经典的坑题管道通信中写进程和读进程必须同步吗答案是必须。管道有容量限制写满了就得等读者取走读空了就得等写者放数据。很多同学做简答时只写了管道是半双工漏掉了同步这一点分数就丢了。这类题提醒我们凡是涉及共享缓冲区的机制背后一定藏着同步问题答题时把这一层点出来往往就是得分点。4. 同步与互斥把PV操作变成一套可复制的解题流程4.1 信号量机制的三条铁律信号量这块我见过太多同学看得懂答案、自己写不出。根子在于没把规则内化成肌肉记忆。我总结成三条铁律做题时挨个对照。第一条P操作是申请资源V操作是释放资源。P把信号量减1减完如果小于0就阻塞V把信号量加1加完如果不大于0就唤醒一个等待者。记住减了变负说明不够用就得等这条判断能帮你检查逻辑对不对。第二条先写P操作顺序不能乱。特别是互斥信号量和资源信号量同时出现时必须先P资源再P互斥。经典的生产者问题里如果先P(mutex)再P(empty)当缓冲区满时生产者拿着互斥锁去等空位消费者又拿着锁进不来直接死锁。这个顺序错误是出题人最爱设的陷阱几乎每年都有人栽。第三条每个P都要有配对的V。写完代码数一数P和V的数量和位置要对得上缺一个都会导致资源永久占用。检查时想象一遍完整流程看信号量最终能不能回到初值。4.2 三大经典问题的通用解法生产者-消费者、读者-写者、哲学家进餐这三个是同步问题的母题其他题目基本都是它们的变体。生产者-消费者的骨架是一个互斥信号量管缓冲区一个empty信号量记空位数一个full信号量记满位数。代码结构如下。semaphore mutex 1; semaphore empty n; semaphore full 0; producer() { while (1) { produce_item(); P(empty); // 先申请空位 P(mutex); // 再抢互斥锁 put_item(); V(mutex); V(full); // 通知有数据了 } } consumer() { while (1) { P(full); // 先看有没有数据 P(mutex); get_item(); V(mutex); V(empty); // 通知有空位了 consume_item(); } }读者-写者的核心是读读可并发、读写互斥、写写互斥。这里有个关键选择读者优先还是写者优先。如果读者源源不断写者可能一直等不到机会写者饿死。解决办法是加一个信号量控制排队让后来的读者在写者等待时也去排队。这个改动是区分高分的关键普通答案只写读者优先版想拿满分得知道写者优先怎么改。哲学家进餐的经典解法是限制同时拿筷子的哲学家数量或奇偶编号哲学家拿筷子的顺序相反。前者的思路是加一个初值为4的信号量最多只让4个人同时抢筷子破坏循环等待条件。这道题的价值不在代码本身而在于它让你理解死锁的四个必要条件怎么在代码层面被破坏。4.3 从信号量到管程一种更安全的抽象写完上面那些PV代码你会发现同步逻辑散落在各个进程里一个V放错位置就是灾难。管程就是来解决这个问题的。管程把共享数据和对它的操作包在一起进入管程自动加锁退出自动解锁进程在管程内部如果需要等待就调用条件变量的wait需要唤醒别人就调用signal。拿生产者-消费者用管程改写会清爽很多管程内部维护缓冲区、计数两个条件变量分别表示不满和不空。生产者进管程如果缓冲区满就wait(不满)否则放入数据并signal(不空)。整个过程看不到一个P/V出错概率大大降低。教材里管程常考的是为什么管程能避免死锁和同步错误。标准答案要点同步操作由系统自动完成程序员不用手动管理信号量减少了顺序错误和遗漏V操作的可能性。你把这个逻辑说清楚比死记代码更有价值。5. 死锁与银行家算法最能体现算得出答案的章节5.1 四个必要条件和处理策略死锁的四个必要条件是互斥、请求与保持、不可剥夺、循环等待。这四个必须同时满足才会死锁破坏任何一个就能预防。教材里对应的四种预防策略要能一一对应上破坏互斥把独占资源改造成可共享、破坏请求与保持一次性申请所有资源、破坏不可剥夺申请不到就释放已占有的、破坏循环等待给资源编号按序申请。除了预防还有避免银行家算法、检测与解除。这里最常见的概念题是区分预防和避免预防是静态地破坏条件、牺牲资源利用率避免是动态地在分配前判断这次分配安不安全只有安全才分配。银行家算法属于动态避免策略它的核心是每次分配前做一次安全性检查。5.2 手把手算一遍银行家算法的安全序列银行家算法看着唬人其实就是一套固定流程。我拿一道经典题带你走一遍你跟着算就会发现规律。设系统有三类资源A、B、C总量分别是10、5、7。当前各进程的Max和Allocation如下表。进程Max (A,B,C)Allocation (A,B,C)Need (A,B,C)P07,5,30,1,07,4,3P13,2,22,0,01,2,2P29,0,23,0,26,0,0P32,2,22,1,10,1,1P44,3,30,0,24,3,1第一步算Available。把已经分配出去的资源加起来A类分了023207B类分了100102C类分了002125。用总量减掉Available (10-7, 5-2, 7-5) (3,3,2)。第二步找Need不超过Available的进程。P1的Need是(1,2,2)(3,3,2)完全够选P1。执行完P1会释放它占的资源Available变成(32, 30, 20) (5,3,2)。第三步继续找。P3的Need是(0,1,1)(5,3,2)够选P3。释放后Available (52, 31, 21) (7,4,3)。第四步P4的Need是(4,3,1)(7,4,3)够选P4。释放后Available (70, 40, 32) (7,4,5)。第五步P0的Need是(7,4,3)(7,4,5)够选P0。释放后Available (70, 41, 50) (7,5,5)。第六步剩下P2Need是(6,0,0)(7,5,5)够选P2。得到安全序列 P1 → P3 → P4 → P0 → P2顺序不唯一。这道题有几个易错点。一是Need的计算必须是Max减Allocation千万别写成Allocation减Max。二是Available初始值是总量减所有已分配之和漏加任何一行都会错。三是安全序列不唯一只要找到一个就算安全实在找不到才判定为不安全。注意银行家算法题最大的失分点是漏算。我建议你养成固定习惯先列Need表再算Available然后每选一个进程就在草稿上把它划掉并更新Available。整个过程像做减法链一步错步步错草稿一定要工整。5.3 死锁检测与资源分配图的化简除了银行家算法资源分配图的化简也是常考点。规则是找出一个既不阻塞又非孤立的进程节点如果它申请的资源都有空闲或者能被满足就消去它的请求边和分配边让它变成孤立点。反复做如果最后能消去所有边说明没有死锁如果剩下一些边消不掉就存在死锁。化简的关键是先找最容易满足的进程——通常是那些只申请已有空闲资源的进程。这跟银行家算法找安全序列是同一个思路都是贪心地先满足最不挑剔的那个。理解了这层两道题其实是一回事。6. 内存管理地址转换和页面置换两个硬骨头6.1 分页、分段、段页式的地址计算存储器管理里地址转换是必考计算。分页系统里逻辑地址被拆成页号和页内偏移通过页表找到物理块号再拼上偏移得到物理地址。这里要记牢页内偏移的位数由页面大小决定。页面大小是2的k次方偏移就是k位。比如页面大小1KB2^10偏移10位剩下的高位才是页号。举个例子页面大小1KB逻辑地址是2500十进制。计算时先转成二进制或者直接除页号 2500 / 1024 2偏移 2500 % 1024 452。查页表把页号2映射到物理块号比如是5那物理地址 5 × 1024 452 5572。整个过程说白了就是页号换块号偏移不动。分段的区别在于段长不固定每个段从0开始编址段表里存的是段基址和段长。地址转换时要用段号查段表先检查段内偏移有没有超过段长越界检查没超才加上基址。为什么分段要做越界检查而分页不用因为分页每个页大小一样偏移天然不会越界分段各段长度不同必须显式检查否则会访问到别的段。这个差异是简答题高频点。段页式则是两者结合先按段分段内再分页。地址结构变成段号、页号、页内偏移三段。要查两次表一次段表一次页表所以访问一次数据要访存三次访问段表、访问页表、访问数据这也是它慢的原因。有个常考数字段页式系统每次取数据至少访问内存3次这个要记住。6.2 三种页面置换算法的缺页率实战虚拟存储器里的页面置换是计算题的重灾区。我用同一个引用串把FIFO和LRU算清楚你对照着就能掌握方法。引用串是7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1物理块设为3个。FIFO先进先出按排队顺序淘汰最早的页面逐个走一遍缺页的序列是7、0、1、2此时淘汰7、3淘汰0、0淘汰1、4淘汰2、2淘汰3、3淘汰0、0淘汰4、1淘汰2、2淘汰3、7淘汰0、0淘汰1、1淘汰2。数下来缺页15次缺页率15/2075%。LRU最近最久未使用淘汰最长时间没被访问的页面。走下来缺页12次缺页率60%。它在访问0、3、2这些重复页面时命中率明显更高因为FIFO会出现刚淘汰的页面马上又被访问的尴尬而LRU不会。两种算法的对比用一个生活例子就能记住FIFO像排队买饭先来的先走不管你饿不饿LRU像冰箱清理谁最久没动就扔谁明显更合理但实现成本也更高需要记录每个页面的访问时间。算法缺页次数缺页率特点FIFO1575%实现简单可能出现Belady异常LRU1260%命中率高硬件开销大OPT945%理论最优无法实现OPT是理论上的最优算法淘汰未来最长时间不会被访问的页面缺页9次。它没法真正实现因为要预知未来但常被用来当基准线考你某算法离最优差多少。FIFO还有个反常识的特性叫Belady异常——物理块增多缺页率反而可能上升这是它独有的毛病LRU和OPT都不会出现。这个点几乎每年都考记住只有FIFO会异常。7. 文件系统与磁盘调度性价比最高的一块7.1 文件分配方式与索引节点文件的物理结构有连续分配、链接分配、索引分配三种。连续分配速度快支持随机访问但要求连续空间容易产生外部碎片文件还不好扩展。链接分配解决了碎片问题但只能顺序访问找第n个块要顺着链走n次。索引分配用一张索引表记录所有块的地址既支持随机访问又便于扩展代价是要额外存储索引块。考试里最爱考多级索引的计算题。比如给一个索引节点有13个地址项前10个是直接地址第11个是一级间接第12个是二级间接第13个是三级间接块大小1KB每个地址占4字节。问支持的最大文件是多少。计算思路每个块能存1KB/4B256个地址。直接地址支持10×1KB一级间接支持256×1KB二级间接256×256×1KB三级间接256^3×1KB。加起来就是最大文件大小。这道题的核心是理解一个地址项指向一个块块里又能装256个地址像套娃一样一层层展开。7.2 磁盘调度算法的寻道时间计算磁盘调度考的是给定请求序列和当前磁头位置算总寻道距离。常见算法有FCFS先来先服务、SSTF最短寻道时间优先、SCAN电梯算法、CSCAN循环扫描等。拿一个例子磁头当前在100号磁道请求序列是55、58、39、18、90、160、150、38、184。FCFS就按顺序走寻道距离是每两个相邻请求的差的绝对值之和算出来很大。SSTF每次选离当前最近的从100出发就近选90再58、55、39、38、18然后跳到150、160、184总距离比FCFS小很多。SCAN按方向走比如先向磁道号小的方向一路服务到底再折返这样不会来回横跳。判断哪个算法好的标准就是总寻道距离越小越好因为寻道时间占磁盘访问时间的大头。SSTF看着好但可能让远处的请求饿死SCAN兼顾效率和公平实际系统用得多。这些结论性的对比在简答题里很值钱。8. 习题答案到底怎么用方法比答案本身重要一百倍8.1 答案不是用来背的是用来校准思路的我见过太多人把习题答案打印出来考试前疯狂背结果题目数字一换就懵。这套资料的正确用法是先自己完整做一遍做完再对照答案。哪怕做错了也先别翻答案把卡住的地方标记出来折腾十分钟再去看解析。为什么强调这个因为你卡住的那十分钟恰恰是大脑在建立问题模型的关键期直接看答案等于跳过了这个加工过程记忆根本不牢。对答案时也不是看个结果就完事。要逐步骤核对自己的推导链条是我概念错了还是计算粗心了还是解题顺序不对把错误分类记下来你会发现自己反复栽的往往是同一类坑——比如PV操作顺序错、Available漏算、页内偏移位数搞错。把这些高频错误列成一张清单贴在书桌前考前扫一眼比刷十套新题都管用。8.2 常见问题速查与避坑清单最后整理一份排查表都是我自己和带过的同学反复踩过的坑。现象可能原因正确做法PV题总是死锁P操作顺序颠倒先P资源信号量再P互斥信号量银行家算法结果不对Available算错或漏进程先算Need再算Available逐个划掉缺页率总是偏高页面淘汰时选错对象FIFO看进入时间LRU看最近访问地址转换越界偏移位数算错偏移位数log2(页面大小)磁盘寻道距离偏大漏算首段或末段距离从当前磁头位置开始算起概念题丢分忽视必须唯一等限定词答题先抓关键词再展开提示做计算题一定保留完整草稿不要在心算里跳步。我批改过很多卷子答案错但过程对的老师往往给步骤分答案对但过程缺失的反而容易被质疑。过程规范本身就是得分项。8.3 从习题走向真实的理解坦白说习题答案只是脚手架真正的目标是让你建立起对操作系统的整体直觉。等你把进程调度、内存管理、文件系统这几块串起来会突然发现它们都在解决同一个根本矛盾——有限的硬件资源怎么高效、公平、安全地分配给多个程序。进程调度是在分配CPU时间内存管理是在分配地址空间文件系统是在分配存储磁盘调度是在分配I/O带宽。你抓住了这条主线再看任何一道题都不是孤立的。我个人在复习这门课时最有用的一个习惯是每做完一章就画一张图把这一章的所有概念、算法、计算公式连成一张网看看它们之间是怎么依赖的。比如页面置换依赖于地址转换地址转换依赖于分页或分段的设计分页设计又和内存碎片问题挂钩。这张网画出来你的知识就不再是散落的点而是一个能互相支撑的体系。考试时遇到没见过的题你也能顺着这张网推理出大致方向而不是当场懵住。至于那些具体的习题答案我的建议是当工具书用遇到不会的再去查平时别把它当教材从头读到尾。真正值得反复读的是教材里那些定义和原理本身答案只是帮你确认我理解对了没有。这门课学到最后你会发现它考的不只是记忆而是你有没有真正理解一台计算机是怎么被组织起来运转的。想通这一点答案对你来说就不再是标准答案而是你自己推理能力的验证器。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。