☰
操作系统课后习题刷题指南:前七章核心考点与解题思路
2026/9/29 10:25:09 网站建设 项目流程

带操作系统这门课,我前前后后带了快十年。办公室桌上常年放着一本翻得脱胶的《计算机操作系统》(第四版),主编汤小丹。这本书在很多高校是本科核心教材,也是不少计算机考研专业课的指定参考书,地位基本属于“操作系统方向人手一本”。它的课后习题覆盖很广,概念题、计算题、设计题都有,很多学生问我的第一个问题都是:“老师,课后习题答案去哪找?”我一般会回一句:“答案能找,但思路得自己搭。”

这篇博文就把我这些年带学生刷这本书前七章习题的经验整理一遍。内容覆盖操作系统引论、进程描述与控制、处理机调度与死锁、存储器管理、虚拟存储器、输入输出系统、文件管理,适合正在期末复习、考研备考,或者单纯想把这门课学扎实的同学参考。我不会把答案原封不动搬出来,而是把每个章节“到底在考什么”“解题的切入点是什么”“哪些地方最容易翻车”讲透。你能把这篇看完,再回去翻课后题,会发现大部分题目其实不用背答案也能推出来。

1. 先看清教材整体脉络,再动笔做题

1.1 七章内容是一条完整的逻辑链

很多人学操作系统觉得散,今天讲进程,明天讲内存,后天讲文件,知识点相互之间好像没什么联系。其实这本书前七章的设计逻辑非常清晰:它先把操作系统当成一个“管理者”来介绍,接着按它管理的核心资源展开,每种资源的管理方式单独成章,最后再用接口和用户态收口。

第一章操作系统引论是总纲,回答的是“操作系统是什么、有什么特征、能干什么”。第二章到第七章,本质上是“操作系统如何管理CPU、内存、外设、文件”这几类核心资源。第二章和第三章管CPU:进程是CPU调度的基本单位,信号量机制解决并发中的同步与互斥,处理机调度算法决定哪个进程先上CPU,死锁则是资源分配不当造成的极端情况。第四章和第五章管内存:先看在物理内存里怎么放程序,再看内存不够时怎么用虚拟存储技术给程序“画饼”。第六章管设备,解决CPU和外设速度不匹配的问题。第七章管文件,解决数据怎么组织、怎么存、怎么共享保护的问题。这个脉络理清之后,你再去看每一章的课后题,就会发现题目都围绕“某类资源用什么数据结构描述、用什么算法分配、遇到冲突怎么解决”这三件事展开,答题的时候思路会清晰很多。

为什么一定要先讲脉络?因为操作系统这门课的课后习题有一个特点:很多题目表面上在考某一章,实际上在考你能否跨章节调用知识。比如第五章虚拟存储器里的“抖动”概念,如果不回看第一章的“虚拟”特征,就很难理解为什么抖动是虚拟存储技术的副作用;再比如第七章文件的共享与保护,如果不理解进程间的互斥与同步,就很难明白文件锁为什么要分成共享锁和排他锁。先建立整体框架,再逐章填细节,是少走弯路的前提。

1.2 每章的核心考点和题型分布

课后习题大致分三类。第一类是概念简答题,比如“操作系统有哪些基本特征”“死锁的必要条件是什么”,这类题考记忆,但记忆要建立在理解上,不然换个问法就懵。第二类是计算题,比如调度算法求平均周转时间、页面置换算法求缺页次数、磁盘调度求总寻道时间,这类题考公式和流程,步骤写清楚就能拿分。第三类是综合设计题,比如用信号量描述一个生产者消费者问题、设计一个管理空闲空间的数据结构,这类题考建模能力,也是很多学生觉得最难的部分。

我统计了一下前七章习题里,第二、三、五章计算题和设计题占比最高,第一、七章偏概念和综合,第四、六章计算量也不小。你复习的时候如果时间紧,优先把第二章的信号量题、第三章的调度算法与银行家算法、第四章的地址转换与页面置换算法、第六章的磁盘调度、第七章的位示图全套算熟,基本就能覆盖大部分分值。

还有一点要提醒:第四版教材的课后题数量不算少,但千万不要“平均用力”。同一道题如果已经练过三遍,再刷也只是熟练度提升;反而是那种第一遍完全没思路的题,才是真正的提分点。我建议每章做完后给题目标个难度等级,第一遍不会做的题做上记号,第二遍复习时优先看记号题,否则很容易陷入“会做的反复做、不会做的永远跳过”的陷阱。

2. 基础篇:第一到第三章习题怎么破

2.1 第一章引论:概念题要“会串”

第一章的题大多不难,但很多同学栽在“答不全”上。比如“操作系统有哪些基本特征”这道题,标准答法是并发、共享、虚拟、异步四个特征,并且每个特征都要展开一句:并发是指多个程序在同一时间间隔内交替运行,共享是指系统中的资源可供多个进程共同使用,虚拟是指将一个物理实体映射为多个逻辑对应物,异步是指进程以不可预知的速度向前推进。有的同学只写四个词,不看题目里“解释”二字,阅卷时很难给分。

这里有个技巧:凡是遇到“特征”“功能”“作用”这类题,把概念还原到“它解决了什么问题”去答。并发对应单CPU上多道程序的推进问题,共享对应资源有限而进程众多的问题,虚拟对应物理资源不足的问题,异步对应系统内事件发生的不确定性。这样答既不会漏点,又能显示出你是真懂,而不是在背词条。

第一章里还有个高频题是“操作系统的主要功能”,教材从处理机管理、存储器管理、设备管理、文件管理、用户接口五个角度展开。我建议你把这五个功能与后面章节做对应:处理机管理就是第二、三章的内容,存储器管理就是第四、五章的内容,设备管理就是第六章,文件管理就是第七章。到期末复习时,你只需要记住“五件事”,后面每一章都是这五件事的细化。

要特别提醒的是,第一章有些简答题喜欢“反着问”。比如题目问“操作系统为什么需要中断机制”,有些同学只回答“中断是CPU与外设通信的方式”,这就漏掉了一半。操作系统引入中断,首先是为了让CPU从低速的I/O等待中解放出来,提高系统效率;其次是为了应对程序运行中的异常情况,比如除零、越界、缺页等。回答这类题时,最好从“提高效率”和“处理异常”两个维度各写两三句,覆盖面就完整了。

2.2 第二章进程:信号量题的关键套路

第二章是整本书的分水岭。进程概念、状态转换、PCB(进程控制块)这些内容靠理解加记忆就能搞定,真正难的是信号量机制的PV操作题。这类题的通用做法可以归纳成四步:一是找同步关系,也就是哪些进程之间有先后顺序;二是找互斥关系,也就是哪些资源同一时刻只能被一个进程使用;三是为每一类关系定义一个信号量,并确定初始值;四是在代码适当位置加上wait和signal操作。

以经典的“生产者消费者问题”为例,生产者和消费者共享一个有界缓冲区。缓冲区是临界资源,需要一把互斥锁;另外“缓冲区有空位”和“缓冲区有产品”这两个条件是同步关系,分别用两个信号量表示。于是至少需要三个信号量:mutex初始值1负责互斥,empty初始值为缓冲区大小表示空位数量,full初始值为0表示产品数量。很多同学会漏掉mutex,或者把empty和full的初始值搞反,结果程序跑起来就死锁。

我给一个检查办法:代码写完后,把所有wait操作都读一遍,凡是wait后紧接着wait另一个信号量,就要警惕这两个信号量之间的耦合会不会造成互相等待;再验证信号量的初始值是否等于资源的初始数量。能过这两步,大部分同步题都能避免低级错误。

第二章课后习题里还有一类“为什么引入进程”“PCB的作用是什么”的简答题,看起来简单,但阅卷时很看重关键词。答“进程引入是为了描述程序并发执行时的动态特征”,要能点出“程序本身是静态的,只有进程才能反映动态执行过程”;答“PCB是进程存在的唯一标志”,一定要提到“系统通过PCB感知进程的存在,进程被创建时建立PCB,进程消亡时回收PCB”。这些关键词就是得分点,丢了就扣分。

如果你做PV操作题总出错,我建议先用“前驱图”练手。教材在绪论部分引入了前驱图,很多同学觉得它只是画图游戏,其实它是信号量题的图形化解法。把每个任务画成一个节点,任务间的先后依赖画成有向边,那么每条边就是一个信号量,边的起点执行完后signal,边的终点执行前wait。把前驱图吃透,生产者消费者、读者写者、哲学家进餐这些经典问题都会变得直观很多。

2.3 第三章调度与死锁:计算题要规范写步骤

第三章的调度算法题属于“方法知道就会做,方法不知道就全错”的类型。FCFS(先来先服务)、SJF(短作业优先)、RR(时间片轮转)、优先级调度这四种算法,要求能从给定的一组进程到达时间和服务时间,计算出完成时间、周转时间、带权周转时间和平均周转时间。

我批改作业时看到最多的问题,是时间轴画错。SJF在做非抢占式调度时,要特别注意“当前进程执行完后,从已到达的进程里选出服务时间最短的那个”,而不是单纯按顺序排。很多同学上来就把所有进程按服务时间排序,完全忽略到达时间。进程2可能在第4分钟到达,你还在等进程3完成,结果整个调度序列从头错到尾。正确做法是像排班一样,只在“当前可以选的候选池”里选最短的。RR调度则要画好时间片轮转表,每个时间片结束时检查是否有新进程到达,未完成的进程排到队尾。写答案时,建议把每一步的时间点都列出来,这样即使最后平均周转时间算错,过程分也能保住。

死锁部分的重点有两个。一个是死锁的四个必要条件,分别是互斥、请求并保持、不可剥夺和循环等待,考试常考“破坏哪个条件对应哪种方法”,要能和死锁预防、避免、检测与解除对应起来。另一个是银行家算法,这种题分值高、套路固定。做题时依次判断每个进程的需求量是否小于当前可用资源,能分配就分配,并假设进程执行完释放资源,把这种“试探性分配”迭代下去。如果能找到一个让所有进程都完成的序列,即安全序列,系统就处于安全状态;否则就存在死锁风险。千万别在中间步骤省略,银行家算法最值钱的就是那张安全序列推导表。

还要提醒一个细节:计算平均周转时间时,如果题目要求的是“带权周转时间”,公式是周转时间除以服务时间。很多同学套公式时忘记除以服务时间,直接把周转时间当带权周转时间用,结果数值全对但概念全错。做题时把每个公式先写在草稿纸最上方,再开始代数据,能有效避免这类问题。

3. 内存篇:第四、五章习题怎么算才稳

3.1 第四章存储器管理:地址转换是核心

第四章的课后计算题主要围绕连续分配、分页存储、分段存储和段页式存储展开。最基础也最常考的是“将逻辑地址转换为物理地址”的计算。以分页系统为例,逻辑地址分为页号和页内偏移两部分。做题第一步是拿逻辑地址除以页大小,商是页号,余数是页内偏移;第二步查页表得到该页对应的物理块号;第三步用“物理块号乘页大小加页内偏移”算出物理地址。

很多同学在这类题上丢分,不是因为不会除,而是没注意单位换算。题干给的程序长度可能是KB,逻辑地址却以十进制或十六进制给出,页大小是4KB,有的同学直接拿十进制地址去除,忘了先统一单位。我建议你拿到题先圈出所有数字的单位,全部换算成字节,尤其涉及十六进制地址时,先把每个地址转换为二进制,按页大小拆分成高位的页号和低位的页内偏移,再查页表,基本不会错。

这里有个非常容易忽略的步骤:越界检查。分页系统里,逻辑地址的页号如果大于页表长度,就会产生越界中断。很多同学在地址转换题里从不写这一步,直接查表算物理地址,结果题目特意给了一个超大页号,目的就是考察你有没有“越界”意识。规范答题顺序应该是:先求页号,判断页号是否越界;再查页表,判断物理块号是否为空;最后才能计算物理地址。分段系统的换算逻辑类似,区别是段号对应的段长和段基址都在段表里,偏移量不能大于段长,否则触发越界中断,这也是常考点。

第四章还会考外部碎片和内部碎片的概念。连续分配方式会产生外部碎片,分页方式会产生内部碎片(也叫页内碎片),分段方式又会产生外部碎片。判断题里经常挖坑:“分页管理完全没有碎片”,这显然是错的,分页只是消除了外部碎片,但最后一页不可能总是恰好装满,内部碎片依然存在。这类概念题靠语句的严谨性给分,你在复习时多留意教材里“完全”“一定”“所有”这些绝对化表述。

3.2 第五章虚拟存储器:页面置换算法要手推

第五章是虚拟存储,最重要的计算题是页面置换算法下的缺页次数统计。考试常用的算法有最佳置换算法OPT、先进先出FIFO、最近最久未使用LRU,以及Clock置换算法。OPT是理想算法,选择将来最长时间不被访问的页面换出,它无法在实际系统中实现,但常拿来做理论下限对比。FIFO实现最简单,但可能出现Belady异常,也就是分配物理块数增多,缺页次数反而增加。LRU利用“最近的过去”近似“最近的将来”,性能接近OPT,但需要硬件支持计时或栈。

做这类题时,我强烈建议画一个“内存页面状态表”,一行是一个物理块,一列是一次页面访问。每访问一个页面,把内存中当前的页面集合标出来,如果发生缺页就单独打标记。表格画完后,缺页次数一目了然,也不容易漏算。FIFO很简单,换出最早进入的页即可;LRU要盯住“最近最久未被使用”,比如访问序列是1、2、3、4、1、2、5,当访问5时发生缺页,哪个页面被换出?要倒着往前看:最近访问过1和2,再往前是4、3,所以3比4更久没被访问,换出3。不少同学在这里习惯性按顺序换,结果LRU算成了FIFO,整道题崩盘。

Clock算法则是给每个页面一个访问位,发生缺页时沿着环形链表找访问位为0的页,遇到访问位为1就置0并继续向下找。这类题画好几个环的滚动状态,比背公式有效。记住Clock算法只是LRU的一种近似实现,它不保证换出的一定是“最久未使用”的页,只是找到一个“最近未被访问过的页”,这两个概念在简答题里经常被对比着考。

第五章还有一个高频简答题是“什么是抖动(thrashing)”,怎么解决。答案核心是:进程频繁缺页,系统大部分时间都花在换页上,CPU利用率反而下降,这种现象叫抖动。解决思路包括采用局部置换策略、引入工作集模型、把物理块分配控制在合理范围内。答题时如果能顺手写出“工作集是进程在一段时间内实际访问页面的集合”,得分会更高。另外,磁盘交换区的大小、程序局部性的好坏、页面置换算法的优劣,都会影响抖动的严重程度,这类题容易出成“多选式”的简答,复习时要把相关因素一并记住。

4. 设备与文件:第六、七章习题怎么答

4.1 第六章输入输出系统:磁盘调度计算题

第六章的内容多而杂,但习题计算题主要集中在磁盘调度上,包括FCFS、SSTF(最短寻道时间优先)、SCAN(电梯算法)和C-SCAN(循环扫描)几种算法的寻道长度计算。这类题给定当前磁头位置和请求序列,要求依次列出磁头移动顺序,再计算总寻道长度或平均寻道长度。

做磁盘调度题,我只有一个建议:先把数轴画出来,把所有请求位置按从小到大标好,再把磁头当前位置标出来,最后按算法规则一步步移动。SSTF是每次都找离当前磁头最近的请求;SCAN是让磁头先按某个方向一直走,走到最边端或直到没有更远的请求,再反向。很多同学会把SCAN和SSTF混淆,在SCAN过程中看到旁边有个更近的请求就想拐弯,这是错的,电梯算法在换向之前必须沿原方向走到底。

如果题目限定“移臂方向由外向内”或“由内向外”,务必按限定方向走,不要自己随意改方向。计算总寻道长度时,只累计磁头移动的距离,不统计请求之间的绝对距离,这个细节也容易让结果差出一个数量级。举个例子,磁头在100道,请求序列是23、68、189,SSTF第一步移动32道来到68,第二步再移动45道到23,第三步移动166道到189,总寻道243道。这三个数字每一步都要在草稿上写出来,别心算,心算最容易错。

第六章还常考SPOOLing技术,问“SPOOLing系统由哪些部分组成”“它如何实现虚拟设备”。答法要抓住关键:SPOOLing由输入井、输出井、输入进程、输出进程组成,利用磁盘上的缓冲区模拟独占设备,把一个独占设备改造成可共享的设备。考试时还要说明它提高了I/O速度,把独占设备变成了共享设备,实现了虚拟设备功能。这里的“虚拟”要和第一章讲的虚拟特征呼应起来,答题时能点出“多个进程通过SPOOLing共享一台打印机,从用户角度看就像每人都有一台打印机”,这就是虚拟设备最通俗的注脚。

4.2 第七章文件管理:位示图和目录结构是重头

第七章文件管理,课后习题题型比较固定,高频考点有三个:文件逻辑结构与物理结构的对应、目录结构的组织方式、存储空间管理算法。

存储空间管理里最常考的是位示图法。一个磁盘被划分为若干物理块,位示图中每一位对应一个物理块,1表示已分配,0表示空闲。做题时给定位示图的行列数,要求计算某个盘块号对应的字号、位号,或者反过来由字号位号求盘块号。这类题纯粹是换算,但特别容易在公式上翻车。我总结了一个通用办法:先搞清楚位示图是按行还是按列编号。如果题目说“位示图有m行n列,行列号从1开始,盘块号从1开始,按行排列”,那么盘块号b对应的行号i = (b-1) / n + 1,列号j = (b-1) % n + 1,这里的整除和取余都要基于b-1而不是b,因为盘块号从1开始。反过来,由行号i、列号j求盘块号,b = (i-1) * n + j。

不少同学问“为什么是b-1不是b”,你拿b=1代入试试:第1块应该对应第1行第1列,用b-1才成立。理解了这一点,位示图题就能举一反三。如果题目把行列号或盘块号从0开始编号,公式又不一样,这时不论序号从几开始,都有一个通用的笨办法:先明确“第几行第几列”对应的是物理块的计数顺序,再去套公式,比死记一个版本更可靠。

文件目录习题里,最常问的是“引入索引节点(inode)有什么好处”。标准答法是:将文件名和文件属性分开,目录项里只保留文件名和指向索引节点的指针,这样在查找文件时,只需要把文件名部分读入内存,减少磁盘I/O,加快检索速度。另一个高频题是“多级目录结构有什么优点”,要提到它解决了文件重名问题,提高了目录检索速度,也便于实现文件的共享和保护。答题时如果能用具体例子说明,比如两个用户都可以在自己的子目录里建立名为test的文件,互不干扰,就能让答案更有说服力。

第七章还有一个容易出计算题的位置:文件物理结构的盘块计算。比如一个文件系统盘块大小为4KB,每个盘块号占4字节,索引节点中共有多少直接块、一级间接块、二级间接块,求一个文件最大能有多大。这类题本质是乘法估算,关键是把“一个盘块能装多少个盘块号”算对:盘块大小除以盘块号占用字节数,得到每个间接块能容纳的指针数量,再逐级相乘并乘以盘块大小。很多同学会把多级间接块的最大文件容量算成一个单级结果,题目里“一级”“二级”这些字眼一定要先圈出来。

5. 刷题避坑与备考节奏心得

5.1 我批改作业时最常看到的几个错误

刷完上面这些题,我再把学生作业和考试里反复出现的问题集中列出来,你可以当个自查清单。

第一,信号量初始值乱设。mutex类信号量初始值一定是1,资源计数类信号量初始值是资源数量,同步类信号量的初始值要能体现“当前有多少个可用条件”。第二,银行家算法只判断不推导。题目问“系统是否安全”,很多同学直接写安全或不安全,不给安全序列,这种答案在考试里通常只能拿一半分。第三,分页地址转换忽略越界检查。分页系统里逻辑地址的页号如果大于页表长度,就会产生越界中断,这一步一定要写在答题过程中。第四,LRU和FIFO混淆。FIFO看进入内存的时间,LRU看被访问的时间,这两个“时间”不是一回事。第五,磁盘调度SCAN和SSTF混淆。SCAN按固定方向移动,SSTF按最近距离移动,判断依据是“算法规则”而不是“看起来更优”。

还有一个很隐晦的坑:很多题目里“平均周转时间”和“带权周转时间”会混着问。平均周转时间是所有进程周转时间的算术平均,带权周转时间是周转时间除以服务时间再取平均,两者的分母完全不同。做题时先看清题目要哪个量,再决定用哪套公式。

另外,概念题里“动态重定位”“静态重定位”也是一对易混点。静态重定位是在程序装入内存时一次性完成地址变换,程序运行过程中不能再移动;动态重定位是在程序执行过程中,每次访问内存前通过重定位寄存器计算物理地址。很多同学把两者记反,这里可以简单记成:静态是“装完就定死”,动态是“边跑边算”。

5.2 我的刷题节奏建议:两遍法

最后,说说我给学生推荐的刷题节奏。我个人比较推荐“两遍法”。第一遍在学完每一章后立刻做,不查书,硬做,做不完也要把卡住的地方标记出来,这一遍的目标是暴露问题。第二遍在全部七章学完后做题型汇总,把所有计算题按类归拢在一起,比如调度算法放一起、页面置换放一起、位示图放一起,集中刷。你会发现很多题虽然题目变了,但计算套路完全一样,第二遍刷起来速度会快很多。

遇到实在不会的题,我建议先看答案的结论,再看思路,然后把答案合上自己重推一遍。只看答案不动手,等于没做;能独立推出正确答案,这道题才算真正拿下。很多同学问我为什么看懂了答案还是不会做题,原因就在这里:看懂是别人替你走了一遍逻辑,独立推出来逻辑链才是你自己的。

网上流传的答案版本很多,偶尔会有印刷错误或表述不一致。做完题后如果要核对,尽量结合教材正文和课件去验证关键步骤,尤其是计算题,自己推导的结果如果和答案不一致,不要急着怀疑自己,先检查单位、初始值、边界条件这几个最容易出错的点。毕竟做课后题的核心目标不是把答案背下来,而是通过一次次推导把操作系统的机制内化成自己的知识结构。教材例题和习题里反复出现的PV操作、地址转换、页面置换、银行家算法,都是后面复试、面试里高概率被追问的内容,现在花时间把每一步想清楚,后面会省很多事。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询