news 2026/9/30 1:12:59

汤小丹《计算机操作系统》课后题全解析:从进程调度到页面置换

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
汤小丹《计算机操作系统》课后题全解析:从进程调度到页面置换

1. 为什么汤小丹《计算机操作系统》的课后题值得一刷再刷

很多同学学操作系统,上来就啃源码、看论文,结果被进程调度、虚拟内存、文件系统一堆概念绕得晕头转向。我当年也是这样,直到把汤小丹这本《计算机操作系统(第四版)》的课后习题完整过了一遍,才真正把知识点串成了一张网。这门课不像高数有固定的解题套路,它的题目往往把一个概念揉进一个小场景里,比如给你几个进程的到达时间和服务时间,让你算各种调度算法的平均周转时间,或者给你一个页表,让你模拟地址变换过程。这种题光看书是看不出来的,必须亲手算一遍。

这本书的经典之处在于,它几乎覆盖了国内高校操作系统课程的全部核心考点:进程管理、处理机调度、死锁、内存管理、虚拟存储器、文件系统、磁盘管理、I/O系统。每一章的课后习题都紧扣正文知识点,难度梯度从"直接套公式"到"需要综合分析"都有。很多人觉得课后题和考试题差距大,其实恰恰相反,考研408的真题里很多大题,本质上就是这本书课后题的变形或组合。比如那道经典的"银行家算法判断安全性"的题,书上习题里就有完整的推导过程。

我把这本书的课后题完整做了一遍之后,最大的体会是:题目本身是死的,但解题背后的思维链是活的。你不需要背答案,你需要的是建立一套操作系统分析的思维框架。下面我按章节拆解一下每类习题的核心考点、常见陷阱和解题思路,以第四版为准,题目序号可能有微调,但知识点脉络是稳定的。

2. 进程管理与调度:先厘清并发模型,再下手做题

2.1 进程描述与控制中的高频概念题

第一章和第二章的习题主要集中在进程的概念、进程和程序的区别、进程状态转换、PCB的作用、进程的同步与互斥。这类题看起来是简答题,其实最容易丢分,因为概念表述不严谨就会被扣分。

做题时,我建议你自己先画一张进程状态转换图,把"创建→就绪→运行→阻塞→就绪"以及终止的箭头都标清楚,然后对照习题里给的场景,判断某个进程处于什么状态。有一道题是这样的:"一个进程在运行过程中,请求打印机,但打印机正被另一个进程占用,问该进程的状态。"答案是阻塞态。很多同学会答成就绪态,因为觉得"它在等待一个资源"。这就是对阻塞和就绪本质区别没吃透:就绪态是等待CPU,阻塞态是等待除CPU以外的其他资源。这个区分在后面的信号量、管程题目里会反复用到。

还有一个高频题:进程和程序的主要区别。标准答法有三点:动态vs静态、并发vs顺序、生命周期是否存在(进程有创建和撤销,程序是持久存在的)。但书上的答案比这更细,它特别强调了一点——进程是程序在一个数据集合上运行的过程,所以同一个程序跑在不同的数据集合上,就是两个不同的进程。这个点在后来的线程引入、进程通信题目里会被引申。

2.2 信号量机制习题:从原理到代码实现的一步之遥

进程同步互斥的题目,是操作系统课后题里的重头戏,也是很多人的噩梦。第四章的信号量机制题,往往是给你一个经典的生产者消费者、读者写者、哲学家进餐场景,让你写出信号量定义和P/V操作。

我做这类题的经验是:先不要急着写代码,先把"资源"梳理清楚。一个信号量对应的是一类资源,P操作是申请资源(资源数减一,若减后小于0则阻塞),V操作是释放资源(资源数加一,若加后仍小于或等于0则唤醒一个阻塞进程)。这里有一个特别容易错的地方:V操作唤醒的条件。书上说的是"若加后仍小于等于0,说明还有进程在等待,则唤醒一个"。很多初学者写成"若加后等于0则唤醒",那就把语义搞错了。

读者写者问题的习题是另外一个经典坑。题目会要求你用信号量实现"写者优先"或"读者优先"。读者优先的经典解法是引入一个readcount变量和一个互斥信号量mutex来保护readcount,再加一个写者用的信号量wrt。核心逻辑是:第一个读者到来时要执行P(wrt)锁住写者,最后一个读者离开时要执行V(wrt)释放写者。这个方案在第四版课后题里被反复变体,比如"写者优先"要加一个额外的信号量,让后来的读者在写者等待时不能插队。这个变体值得特别推敲。

这里我强烈建议,把每一道信号量题都画成流程图来理解。不要看着伪代码硬背,画出P/V操作的时序图,理清"谁等谁"、"谁唤醒谁",做题速度和准确率都会上一个台阶。

2.3 处理机调度算法:计算题必须亲手算,别只背结论

调度算法这一节,课后题的计算量是最实在的。典型的题型包括:先来先服务(FCFS)、短作业优先(SJF,分抢占和不抢占)、优先级调度、时间片轮转(RR)的平均周转时间、平均带权周转时间计算。

做题时有一个关键习惯:画甘特图(Gantt Chart,即调度时序图)。比如时间片轮转算法,如果不画时间轴,调度顺序很容易交错出错。书上有一道经典习题:三个进程A、B、C,到达时间分别是0、1、2,服务时间分别是3、6、4,时间片大小为2,要求计算时间片轮转算法下的各进程完成时间和周转时间。这道题我第一次做时直接口算,结果把第6个时间片后的调度顺序搞混了。后来老老实实画甘特图,把每个时间片哪个进程在运行标出来,一下就清爽了。

FCFS和SJF要注意的一个陷阱是:SJF在非抢占模式下,指的是在进程到达后,从当前已到达的进程里选服务时间最短的,而不是把所有进程按服务时间排好序再执行。这一点书上习题专门有一道题,进程到达时间不同,导致按纯短作业排序的结果和实际调度结果完全不一样。很多人在这里丢分。

还要注意带权周转时间的定义:带权周转时间 = 周转时间 / 服务时间。它是衡量调度算法公平性的一个重要指标。做完计算后,可以顺手比较一下这几个指标:FCFS的带权周转时间通常不如SJF短,但SJF可能造成长作业"饿死"。这种对比性的思考,考试简答题经常考。

3. 死锁:银行家算法和安全序列的判断逻辑

3.1 死锁产生的四个必要条件与处理方法

死锁这一章,课后题常见的题型有三类:判断某场景是否可能死锁、给出破坏死锁四条件的方案、以及银行家算法的安全性检查。死锁的四个必要条件是互斥、请求并保持、不可剥夺、循环等待。书上的习题会给你几个资源分配的例子,让你判断是不是死锁,并说明理由。

这种题的核心是:死锁的四条件是必要条件,不是充分条件。也就是说,即使四个条件同时成立,系统也不一定发生死锁。做题时要逐个条件对照。有一道题我印象很深:一个系统中有两台打印机和一台扫描仪,两个进程各持有一台打印机,同时申请扫描仪,问是否可能死锁。答案是可能死锁,因为互斥(打印机、扫描仪都不可共享)、请求并保持(各自拿着打印机不放手还要扫描仪)、不可剥夺(打印机不能被强行拿走)、循环等待(每个进程都在等对方可能获取的资源)都成立。

另一类题是"如何破坏死锁条件"。比如使用spooling技术,把打印机虚拟化,让进程不再独占打印机,就是从根上破坏互斥条件或请求并保持条件。这道题在习题里出现过,很多同学答不到spooling这个层面,只会说"让进程一次性申请所有资源"。知道两套答案的区别,考试时就能多拿分。

3.2 银行家算法的完整手算流程

银行家算法是死锁章必考的大题。它的核心是安全性算法:系统按某种顺序分配剩余资源后,检查是否存在一个进程序列,使得每个进程都能在某个时刻获得足够的资源,顺利完成并释放资源。

做题步骤我建议固定下来:

  1. 根据题目给出的Allocation(已分配)、Max(最大需求)、Available(可用)矩阵,先计算出Need矩阵(Need = Max - Allocation)。
  2. 设定Work = Available,Finish数组全部置为false。
  3. 反复扫描,寻找满足Finish[i] = false且Need[i] <= Work的进程,找到了就把Work += Allocation[i],Finish[i] = true。
  4. 如果所有进程Finish都为true,则系统处于安全状态,找出的进程序列就是一个安全序列。

课后题有一道典型题:系统里有5个进程、3类资源,Available = (3,3,2),给出了Max和Allocation矩阵。第一次做时要注意,安全序列可能不止一个,题目问的是"找一个安全序列即可",但你最好把所有可能的序列都找出来,因为这能帮你验证自己的逻辑是否正确。我做完后整理出了两个合法序列,这比只写出一个要保险得多。

这里的隐藏考点是:安全性算法找进程时,优先推进哪个进程不影响最终安全性的判断,但不同的推进顺序可能导致不同的序列。如果有一轮扫描发现没有任何进程能满足Need <= Work,就直接判定为不安全状态,无需继续。

银行家算法还有一个变体:题目会问"如果进程此时请求资源,系统能否分配"。这时候要先做一个预分配检查:请求的资源数是否小于等于Need,是否小于等于Available。只有两个条件都满足,才做一个资源分配试探,然后运行安全性算法。如果安全就分配,不安全就不分配。这个流程在习题中出现率极高,务必熟练。

4. 内存管理:从连续分配到页面置换的连环扣

4.1 动态分区分配与首次/最佳/最坏适应算法

内存管理章节的习题,由浅入深分为三块:连续分配方式(动态分区)、页式管理、段式管理。

动态分区的经典题型是:给定内存空闲分区表,给出若干作业的内存请求,让你按首次适应、最佳适应、最坏适应算法,分别画出分配后的空闲分区情况。这类题做起来不难,但有一个细节容易忽视:每次分配后空闲分区表要重新排序(按地址或按大小),并且格式要统一。如果题目要求按地址排序,你按大小排序,整道题就都错了。

有一道题:空闲分区按地址从低到高排列,分别是20KB、10KB、50KB、30KB,作业依次申请15KB、25KB、20KB。首次适应算法下,15KB分给了20KB的分区,剩下5KB碎片;25KB只能找50KB分区,剩下25KB;20KB继续找剩下的25KB,最终剩5KB。而最佳适应算法下,15KB先给最小的10KB不够,给20KB,剩5KB;25KB给50KB,剩25KB;20KB给30KB,剩10KB。看起来两者结果类似,但中间的空闲区形态完全不同。这种题就是考你能不能把分配过程一步步写清楚。

这里我再补充一个实操经验:做这类题时,每分配一个作业,就在纸上重新画一张内存分区图,不要在原图上涂改。原图保留,新图画新图,这样检查时一目了然,也避免自己看错。

4.2 页式管理中的地址变换题目

页式管理的计算题,核心是逻辑地址到物理地址的变换。题目会给出页表、页面大小(比如4KB),要求你计算某个逻辑地址对应的物理地址,或者判断访问某个地址时是否发生缺页中断。

解题步骤四步走:

  • 首先,将逻辑地址除以页面大小,得到页号和页内偏移量;
  • 其次,查询页表,获取该页号对应的物理块号;
  • 然后,物理地址 = 物理块号 × 页面大小 + 页内偏移量;
  • 最后,根据页表项的"状态位"判断是否缺页,如果缺页,则需要先处理缺页中断。

这里最容易翻车的是进制转换。题目给逻辑地址时可能用十进制,也可能用十六进制。十六进制时,如果页面大小是4KB = 2的12次方,那么逻辑地址的最低12位就是页内偏移量,剩下的高位就是页号。熟练掌握这个快速拆分方法,能省下大量计算时间。

还有一个考点是关于页表结构的:多级页表、页表项的大小、页表级数与页面大小的关系。有一道题问"4GB逻辑地址空间,4KB页面,页表项4字节,需要几级页表",这类题的本质是拿逻辑地址位数除以页内偏移位数。如果一级页表恰好能覆盖所有页表项,就不需要多级,否则要逐级分解。这类题的训练核心是让你理解页表本身也占内存,多级页表是为了减少页表占用的连续内存空间。

4.3 页面置换算法:OPT是理想,LRU是重点,Clock是热点

虚拟存储器这一章节,页面置换算法的计算题是考研和期末考试的重灾区。常见算法有:最佳置换算法(OPT)、先进先出(FIFO)、最近最久未使用(LRU)、Clock算法(NRU)。

做题框架是这样的:给出一个页面访问序列(比如7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1),内存块数固定为3,计算缺页次数和缺页率。必须以给定的访问顺序为时间轴,每一列列出一个时刻的页面占用情况。

OPT算法是要往后看,找将来最晚被访问的页面换出。它是理论上的最优解,现实中不可实现,但题目会拿来和其他算法对比。LRU算法则是往前看,找最近最久没被访问的页面。注意,LRU考的是"最近的访问状态",随着时间推移,每个页面的"上次访问时间"都在变化。

一个高频陷阱题是:FIFO算法在分配的内存块数从3增加到4时,缺页次数反而增加了(Belady异常),而LRU和OPT都不会出现这种现象。这说明FIFO的调度依据是"进入内存的时间",它完全不考虑页面使用频率,可能导致刚被频繁访问的页面被换出。习题里会专门让你验证Belady异常,这时要画一个对比表,把内存块3和内存块4下的缺页次数并列计算,得出结论。

Clock算法(时钟置换算法)是LRU的近似实现,它用一个"使用位"简化了LRU对时间戳的维护。做Clock题时,要特别注意指针移动的规则:访问一个页面时,把使用位置为1;发生缺页时,指针顺时针移动,找到使用位为0的页面换出,走过的页面使用位置0。这个"扫一圈"的过程,很多同学会因为指针初始位置不同而算错结果,建议做题时在每行旁边标出指针位置,避免混淆。

4.4 段式管理与段页式混合管理的习题思路

段式管理的核心逻辑是"逻辑地址由段号和段内偏移组成,段表记录每段的基址和界限"。习题通常给你段表,让你判断一个逻辑地址是否越界,并计算出物理地址。

这类题的关键步骤是先检查段内偏移是否小于段长(界限寄存器),如果大于等于段长,就发生越界中断;没越界才能用段表中的基址+偏移得到物理地址。很多同学容易漏掉这个越界检查,直接相加。第四版习题里专门有一道关于"非法地址访问"的题,就是要让你识别越界情况。

段页式管理则是"先按段查段表,找到该段对应的页表起始地址,再按页号查页表,得到物理块号,最后加上页内偏移"。做题时核心是分两步走,不要试图一步到位。一个凌乱的段页式地址变换图,是容易算错的,建议按层来,每层一行,清晰标注。

5. 文件系统与磁盘管理:从目录结构到调度算法的大杂烩

5.1 文件逻辑结构与物理结构的映射关系

文件系统章节的习题类型比较杂,但有一个核心主题:文件的物理结构(连续、链接、索引)如何影响文件的访问方式。

连续分配的题目通常给你文件长度和磁盘块大小,让你计算文件的起始块号或者访问文件末尾内容需要几次磁盘I/O。这类题只要理解"连续分配类似数组,块号可以直接计算"就没问题。

链接分配的题目往往涉及FAT(文件分配表)的优化意义。有一道题是:假设一个磁盘块4KB,盘块号占4字节,一个FAT表项最多能管理多大文件?如果不引入FAT的"簇"概念,文件的大小会受限于块号字段的长度。FAT把磁盘块组合成簇来管理,能有效减少文件分配表项数量。习题中还会有间接索引的问题:比如混合索引方式(直接索引10个地址,一级间接索引、二级间接索引),每种索引能访问的最大文件大小分别是多少。这类题本质上是连乘和连加。

做题时建议先把"索引块大小=磁盘块大小"、"每块盘块号个数=块大小/盘块号大小"这两个基础公式写清楚,再把各个级别的索引范围列出来,逐段相加即可。

5.2 磁盘调度算法:先来先服务、最短寻道时间优先、SCAN与C-SCAN

磁盘调度的典型题目是给你一个磁道请求序列(比如55, 58, 39, 18, 90, 160, 150, 38, 184),初始磁头在某个磁道(比如100),磁头移动方向给定,让你计算每一种调度算法下的磁头移动总磁道数。

FCFS最简单,严格按照请求顺序移动磁头,关键是把相邻两个请求的磁道差求绝对值,累加即可。

SSTF(最短寻道时间优先)每次选择离当前磁头最近的请求。它最大的问题是"饿死"远处的请求,所以实际系统中要加老化机制。计算时每次找最小的绝对值差,然后更新当前位置。

SCAN(电梯算法)的解法是先确定磁头当前的移动方向,沿着该方向服务所有请求,直到到达该方向的终点,然后反向继续。做这类题有一个易错点:如果题目说"磁头目前正在向磁道号减小的方向移动"或者"向磁道号增大的方向移动",你只能在当前方向上服务请求,不能中途反向,否则就不是SCAN了。

C-SCAN(循环扫描算法)则规定磁头只在一个方向服务请求,返回起点时快速归位,归位途中不服务请求。它的优点是响应时间更均匀,但代价是寻道距离不一定最小。有一道课后题让比较SCAN和C-SCAN两种算法的平均寻道距离,结论是SCAN往往更短,但C-SCAN的方差更小,各请求的等待时间波动更小。

5.3 文件系统空闲空间管理:位示图和成组链接法

空闲空间管理这块,课后题常考位示图(bitmap)。题目给你一个位示图,问某个盘块的空闲状态,或者反过来,需要在某个分区申请若干盘块,问哪些位要置1。

位示图的索引计算是:盘块号 → 字号和位号。假设位示图按行存储,每个字16位,物理盘块号从1开始编号(有的题从0开始),则盘块号i对应的字号j = (i - 1) / 16取整,位号k = (i - 1) % 16。反过来,第j字第k位的盘块号 = j × 16 + k + 1。这一对转换公式,是做题的骨架。

成组链接法主要出现在UNIX文件系统里,把空闲块分组,组内用链表串联。习题会考"分配和回收一个盘块时,如何修改空闲块号和栈顶指针"。这类题不算难,但需要把图看明白,答题时把栈顶指针的变化按步骤写出来即可。

6. I/O系统与设备管理:中断、DMA和Spooling的考点挖掘

6.1 中断与DMA的对比理解

输入输出系统的习题,多数围绕三种I/O控制方式:程序查询方式、中断方式、DMA方式。这类题很少要求大计算,风格更偏向概念辨析。

程序查询方式的特点是CPU忙等,在等待I/O完成时,CPU不能执行其他任务,效率较低。中断方式引入后,CPU可以发完I/O命令后去做别的事情,等设备中断到来再处理。但中断方式每传送一个数据单位(通常是一个字节或一个字)都要发生一次中断,中断次数多,CPU开销仍然很大。

DMA方式则把数据传输从CPU手中接管过来,由DMA控制器直接完成内存和外设之间的数据块传输,只在传输开始和结束时打扰CPU。课后题一旦问"为什么DMA方式适合块设备交互",答案核心就是"减少了中断频率"。

做题时很容易混淆的考点是:中断处理程序的执行流程(保存现场、分析中断源、执行对应的中断服务程序、恢复现场)以及中断屏蔽的意义。有一道题专门问"中断屏蔽和中断嵌套的关系",其实要答的是:在执行某个中断服务程序时,持锁屏蔽同级或低级中断,可以让高优先级的中断打断低优先级,从而形成嵌套。

6.2 Spooling技术的习题:为什么虚拟设备能打破独占瓶颈

Spooling(假脱机)技术在课后题中经常以"打印机共享"的例子出现。它的本质是在磁盘上建立输入井和输出井,把低速设备的数据先缓存到高速磁盘上,进程看来,自己独占了一台打印机,实际上多个进程的打印任务被排队到磁盘上的输出井里,由Spooling进程统一调度打印。

做题时,如果题目问"为什么有了Spooling技术,打印机这种独占设备就可以被多个进程共享",关键要答出三层:一是输出井在磁盘上,多个进程可以把数据同时写入磁盘的不同输出井区域,不必直接竞争物理打印机;二是Spooling进程负责按队列逐次把数据送往打印机;三是从进程的视角看,它打开的是一个逻辑设备,不是物理设备,因此逻辑设备可以并发访问。

我也在习题里见到一种变形:让你描述Spooling系统由哪些部分组成(输入井、输出井、输入进程、输出进程),并说明各自的职能。这类题不需要背长篇大论,抓住"井(磁盘缓存)+进程调度"这个本质就能把分数拿全。

6.3 缓冲管理习题:单缓冲、双缓冲、环形缓冲

缓冲区计算题是I/O章里少有的计算型题目。常见的命题形式是:某设备每传送一个数据块耗时T,CPU处理该数据块耗时C,单缓冲和双缓冲下的系统吞吐量分别是多少。

单缓冲的关键是,CPU和设备不能同时访问同一个缓冲区,所以处理器处理第一个数据块前有一个T的等待,之后每个周期取max(T, C)或(T + C)(视题目模型而定)。双缓冲则可以利用两个缓冲区交替,让设备和CPU的工作尽量重叠,周期是max(T, C)。做题时注意题目是"T > C"还是"T < C",决定最终吞吐量的瓶颈。

环型缓冲(多缓冲)在习题中出现率较低,但一旦出现,往往结合中断机制。它不考大计算,而是考指针变化逻辑。答题时,把"Nexti"(输入指针)、"Nextg"(提取指针)的变化路径标清楚就行。

7. 典型综合题一:经典PV操作题型的递进式解法

将前面的知识点串起来,最典型的题型就是综合性的PV操作题。这类题在第四版课后题里往往不止一道,它们像一个梯度训练,从一两个信号量的简单互斥,到多个信号量的复杂协作。

综合题第一类:生产者-消费者变体。比如有一个仓库可以放N件产品,有M个生产者、K个消费者。这时代码模板是:

semaphore mutex = 1; // 保护仓库访问 semaphore empty = N; // 仓库剩余空间 semaphore full = 0; // 仓库中的产品数量 // 生产者 producer() { while (true) { 生产产品; P(empty); // 申请一个空位 P(mutex); 把产品放入仓库; V(mutex); V(full); // 产品数量加一 } } // 消费者 consumer() { while (true) { P(full); // 申请一个产品 P(mutex); 从仓库取产品; V(mutex); V(empty); // 释放一个空位 消费产品; } }

这里有一个约定俗成的规则:多信号量嵌套时,P操作的顺序不能随意颠倒,尤其是"先资源后互斥锁"。如果先P(mutex)再P(empty),一旦仓库满了,生产者拿着锁等空位,消费者想取产品又进不来,就会死锁。课后题专门有一道"如果把P(empty)和P(mutex)互换会发生什么"的思考题,答案就是可能发生死锁。这个知识点不仅在选择题里考,在信号量编程大题里考得更狠。

综合题第二类:三个进程之间的同步。比如进程A从输入设备读数据,进程B处理数据,进程C打印结果。它们之间的关系是典型的流水线型。这样就需要两组信号量:s1表示A与B之间的同步(缓冲区是否有数据可处理),s2表示B与C之间的同步(结果缓冲区是否有数据可打印),再加上各自缓冲区的互斥锁(如果缓冲区是多缓冲区,可能不需要锁,但单缓冲区必须有)。做这种题的核心是找到"前驱关系",把每一步的V操作写在下游进程的P操作之前。

综合题第三类:读者-写者升级版。如果把读者和写者增加优先级限制,写者优先的实现就需要额外的信号量。整个模型在书后习题里反复出现。我建议动手实现一遍,最好能运行验证,这比干看答案强得多。可以用C语言的pthread库,把信号量换成互斥锁和条件变量,一旦跑通,你会发现对PV操作的理解完全不一样。

8. 典型综合题二:地址变换和缺页中断的组合题

除了PV操作,另一类综合大题是把"逻辑地址转物理地址"和"缺页中断"组合起来。这类题的场景一般是一个请求分页系统,给出某个进程的页表,页表项里有物理块号、状态位、访问位、修改位等,然后给出一连串逻辑地址的访问序列,要求你:

  1. 依次计算每个逻辑地址对应的物理地址;
  2. 如果发生缺页,按给定置换算法换页;
  3. 如果页表项修改位为1,换出时还要考虑是否写回磁盘。

解这种题最怕的是乱七八糟地计算。我的习惯是先建立一张大表,表头固定为:访问序号、逻辑地址、页号、页内偏移、页表状态、物理块号、物理地址、缺页与否、换出页号(如果缺页)。然后一行一行填。不要跳步,不要心算,每一行都按公式走。

有一个细节经常坑人:页表中"状态位"表示该页是否在内存中,但有的题会加入"访问位"和"修改位",用来配合改进的Clock算法。如果你没注意这两个位,就不知道换出时脏页要不要写回磁盘,从而导致后面的磁盘I/O次数计算错。所以拿到题目先浏览一遍页表的所有字段,把它们各自编程了再动笔。

这种综合题的另一个坑是"页面大小不整除逻辑地址"或者"逻辑地址的进制不一致"。页内偏移位数 = log2(页面大小),页号 = 逻辑地址右移偏移位数。做题时,先把这两个值标在草稿纸最显眼的位置,再开始算。

9. 备考策略与经验总结

9.1 按题型归类复习,别逐题硬啃

这本课后习题一共十几章,逐题硬啃效率极低。我建议先把书上的例题逐题吃透,再做每一章的课后习题。做题时,按题型归类:概念简答题、计算题、信号量编程题、综合设计题。归类后你会发现,计算题的套路高度固定,信号量编程题的模型也就十来个,刷起来会越来越快。

举个例子,页面置换算法题目,当你做过第五道类似题之后,基本形成肌肉记忆:先看序列、再分内存块数、画表、数缺页次数。所以说,复习的重点不是"做过的题会不会",而是"没见过的题是不是也能套上已知的框架"。

9.2 错误记录比答案本身更宝贵

我复习时有一个专门的错题本。每一道做错的题,不只要写正确答案,还要写下当初错误的原因:是概念不清、计算粗心还是公式记混。比如我在FCFS和SJF的到达时间上栽过两次跟头,后来就在错题本上大字标注:"SJF非抢占模式,不是全局最短作业优先,而是当前时刻已到达进程中的最短作业"。这个一句话总结,比抄十遍答案都管用。

9.3 做旧题、看新题:用真题检验熟练度

课后题全部做完之后,建议找近五年的考研408真题做一遍。原因很简单:408真题的命题风格和这本教材高度一致,有些题目直接就是课后题的难度升级版。尤其是进程管理、内存管理的大题,基本是把书上的模型放进新的场景里。当你课后题做熟之后,再看真题会觉得自己站在一个更高的视角,看到的是"这道题其实是考LRU换页,只是换了一个壳"。

9.4 对照第四版与其他版本的知识点差异

汤小丹教材有多个版本,第三版和第四版在有些概念描述上有差异。如果你使用的是第四版,务必注意它在新版中对"管程""协程""虚拟化"等概念的补充。OS课程现在越来越关注现代操作系统的进展,比如协程和管程的对比,在面试和考研复试里出现的频率也在上升。

管程(Monitor)是一种高级同步机制,把共享资源和对它的操作封装在一起,进程只能通过管程定义的入口访问资源。它和信号量的区别在于,管程由编译器和运行时保证互斥,不需要程序员手动写P/V操作;条件变量配合wait和signal操作,用来处理进程间的同步等待关系。协程(Coroutine)则是一种用户态并发调度方式,它的切换不需要操作系统内核介入,因此开销远小于线程切换。做题时如果遇到"管程和信号量的对比"或"协程与线程的差异"这类简答题,先把定义写清楚,再做对比表,得分率会很高。

9.5 时间投入建议

如果目标是期末考及格,课后题做一遍,重点做计算题和经典信号量题,十个晚上基本够。如果目标是考研,建议至少把这本书的课后题系统做两遍:第一遍按章顺序做,第二遍按题型做。第二遍要以"看到题目看一眼就知道思路"为标准。我做完整本书大约花了三周,每天两小时左右,之后再看408真题,明显轻松很多。

10. 最后的实操心得

分享一个我自己的小习惯:每章课后题做完后,我会写一段"本章习题挑战最大的一道题是什么、难在哪、怎么突破的"。不要小看这些零散的复盘笔记,它们是你考前三小时快速翻阅的救命稻草。

还有一点要提醒:网上流传的"课后习题答案完整版"质量参差不齐,有的答案有明显笔误,个别极难题的解答也未必是唯一正确解法。所以我的建议是:答案可以参考,但一定要自己推导一遍,尤其是银行家算法、页面置换、信号量这三类题,自己手算的结果比背答案可靠得多。如果发现自己的答案和参考答案不一致,不要急着改,先检查参考步骤有没有漏洞,再对照教材上的定义确认,往往能发现参考答案本身的问题。

以上是我在这本教材上完整刷完课后题后的全部心得体会。操作系统这门课,难就难在知识点多且相互纠缠,但它的好处恰恰也在这里——一旦你把每一类题目的分析框架建立起来,整个操作系统的骨架也就立住了。祝每一步都能算清楚、每道题都能理明白。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 1:12:59

PLC现场调试实战:从IO点表到PID调节的14条生存法则

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 1:09:49

计算机网络笔试题高效训练指南:从概念到实战的完整路径

简介&#xff1a;这份计算机网络笔试题文档面向准备计算机基础课程考试、校招笔试或考研复试的在校学生与求职者&#xff0c;聚焦网络原理核心知识点的自测与查漏补缺。内容以填空与单项选择两大题型为主&#xff0c;覆盖OSI七层参考模型、局域网与广域网划分、总线型/环形/星形…

作者头像 李华
网站建设 2026/9/30 1:09:49

Linux USB摄像头驱动开发:V4L双URB与双帧缓冲实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 1:09:48

嵌入式开发吃青春饭吗?从裸机到驱动的职业路径与经验壁垒

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华