☰
操作系统期末复习攻略:进程、死锁与内存管理考点全解析
2026/10/12 4:33:46 网站建设 项目流程

操作系统原理这门课,相信不少同学和当年的我一样,上课听得云里雾里,进程、线程、信号量、PV操作、页面置换、银行家算法……这些术语一个接一个砸过来,书翻了几页就头大。但等我真正把指定的《操作系统原理(第二版)》这本教材从头到尾捋过一遍,再对照历届真题摸了一遍规律之后,才发现期末卷面其实非常“诚实”:考点高度集中,题型套路固定,计算大题掰着手指头数也就四五个方向。期末复习拼的从来不是谁熬夜熬得久,而是谁先把“考点地图”画出来。

这篇文章不打算把整本教材照本宣科抄一遍,而是按照卷面上分值权重较高的模块,把进程管理、死锁、内存管理、文件与设备管理这几大块的核心概念、计算模板、常见陷阱和复习顺序一次讲清楚。不管你是平时听课少、期末全靠突击的“冲刺型选手”,还是想稳住成绩再冲高分的,建议先花半小时顺着这篇文章把框架搭起来,再回到教材对应章节做定点突破。下面直接上干货。

1. 先把“考点地图”画出来,再动手复习

1.1 教材章节不等于考点分布

《操作系统原理(第二版)》的内容编排走的是经典路线:前面介绍操作系统的定义、功能和发展历史,中间花大篇幅讲进程与线程、调度算法、同步互斥、死锁,后半部分讲内存管理、文件系统、设备和I/O,最后补一点安全和虚拟化相关的概论。如果逐章逐节背,既没效率,卷面也未必按这个比例出题。

我看过几所学校的期末卷子(也问过不同学校的同学),大家出题尽管风格有差异,但分值分布大致是这样一个规律:

模块常见题型大致占比
进程管理(进程、调度、同步)选择、填空、PV大题30%~40%
死锁与银行家算法计算大题、简答10%~20%
存储管理(分页、分段、虚拟内存)计算大题、选择填空20%~30%
文件与设备管理(含磁盘调度)选择、填空、磁盘计算10%~20%

除了四大模块,还会混入少量冷门概念题,比如操作系统的发展阶段、实时系统的特点、微内核与宏内核的差异等。这类题分值不高,但往往是选择题里拉开差距的地方。复习策略上,我强烈建议按“分值权重”安排精力,先啃进程管理,再攻内存和死锁,文件与设备管理可以放在后面,别平均用力。

1.2 期末卷面的常见题型拆解

操作系统这门课的大题高度模板化,我在复习时把它归成六个方向:

  • 调度算法计算:给出一组进程的到达时间和服务时间,算平均周转时间、平均等待时间。
  • PV操作设计:给一个并发场景(生产者消费者、读者写者、哲学家进餐),用信号量写出同步互斥代码。
  • 银行家算法:给资源总量和进程的最大需求、已分配资源,找一个安全序列或判断是否会进入不安全状态。
  • 分页地址转换:已知页表、页面大小、逻辑地址,求物理地址。
  • 页面置换:给一个页面引用串和物理块数,用FIFO、LRU、OPT算缺页次数。
  • 磁盘调度:给一组磁道访问序列和初始磁头位置,算总寻道距离或平均寻道长度。

把这六类题目练熟,计算题基本不会失分。后面的章节我就按这个顺序逐个展开,每个部分都会带上可直接照做的计算过程。

2. 进程管理:分值最重,也最容易出大题的模块

2.1 基础概念:程序与进程的区别,状态转换图

进程管理在期末卷上的地位就像高数里的导数,属于“承重墙”。选择题、填空题、简答题、大题都会从这里面出。第一个必背的知识点是“程序与进程的区别”,这几乎是简答题的常客。程序是静态的指令集合,保存在磁盘上,自己不会动;进程是程序的一次执行过程,是动态的,包含代码、数据和堆栈,还挂着一个数据结构叫PCB(进程控制块)。程序可以长期存在,进程则随着运行创建、随着结束消亡。

另一个高频考点是进程的状态转换。三态模型必须能画出来:就绪态、运行态、阻塞态。就绪到运行靠调度程序分配CPU;运行到就绪通常是时间片用完或被更高优先级的进程抢占;运行到阻塞是因为进程主动请求I/O或等待某事件;阻塞到就绪是等待的事件完成。要注意,阻塞态不能直接变成运行态,必须先回到就绪态重新排队。有的教材讲五态模型,多出来的两个是创建态和终止态,原理是一样的,考试不会太为难人。

提示:画状态转换图时,最容易写错的是“阻塞→运行”这个箭头。一定记得,这条边是不存在的,阻塞进程被唤醒后只能进入就绪队列。

2.2 PCB和线程:为什么它们也是考点

很多同学忽略PCB,觉得它只是个概念。其实PCB是理解整个进程管理的一把钥匙。它记录进程标识符、进程状态、程序计数器、寄存器保存区、调度信息、内存管理信息等。一个进程被中断后,现场恢复靠的就是PCB里保存的寄存器内容。考试如果出简答题,问你“进程为什么要引入PCB”,标准答法就是:PCB是进程存在的唯一标志,系统通过PCB感知和管理进程,进程切换的本质就是切换PCB并保存恢复现场。

线程是进程概念的自然延伸。线程是CPU调度的基本单位,进程是资源分配的基本单位。同一进程内的多个线程共享进程的地址空间、打开的文件等资源,但每个线程有自己的栈和寄存器上下文。考题经常问线程比进程开销小在哪,答案就是线程切换不需要切换地址空间和资源,不像进程切换那样要涉及大量页表和资源表的更新。

2.3 调度算法:横向对比加一套计算模板

调度算法的选择填空并不难,难的是计算题。常见算法有几个:先来先服务(FCFS)、短作业优先(SJF)、高响应比优先(HRRN)、时间片轮转(RR)、优先级调度、多级反馈队列。考试最爱考的是FCFS、SJF和RR这三种。

先说怎么算。题目会给你一张表,列出若干个进程的到达时间和服务时间。计算平均周转时间,周转时间=完成时间-到达时间;等待时间=周转时间-服务时间(从这里能看出,等待时间本质上是除CPU执行之外的所有时间)。FCFS最无脑,按照到达顺序依次执行即可。SJF要分抢占和非抢占,非抢占是先到先执行完一个再挑最短的,抢占式SRTN则是在每个新进程到达时重新比较剩余服务时间,谁短谁上。

我拿一个典型例子说明。假设有A、B、C、D、E五个进程,到达时间分别是0、1、2、3、4,服务时间分别是4、3、5、2、4。

FCFS的调度顺序是A→B→C→D→E,完成时间依次是4、7、12、14、18,周转时间分别为4、6、10、11、14,平均周转时间=(4+6+10+11+14)/5=9,平均等待时间=(0+3+5+9+10)/5=5.4。

非抢占SJF的调度顺序是A→D→B→E→C。原因是0时刻只有A,所以A先执行到4时刻;此时B、C、D、E全部到达,服务时间最短的是D(2),所以D接着执行到6;再看剩余进程,B最短(3),B执行到9;之后是E(4)到13;最后C(5)到18。完成时间依次是4、9、18、6、13,平均周转时间=(4+8+16+3+9)/5=8,平均等待时间=(0+5+13+1+5)/5=4.8。

你发现没有,平均等待时间从5.4降到了4.8,这就是短作业优先的优势。RR算法如果时间片取1,调度顺序会变成A、B、C、D、E、A、B、C、D、E……轮着来,它的平均周转时间通常比SJF高,但优点是响应快,适合分时系统。

注意:SJF在考试中有个潜规则,除非题目明确说“可抢占”,一般默认按非抢占处理。如果题目说“最短剩余时间优先”,那才用抢占式思路。

多级反馈队列也是选择填空常客。它把就绪队列分成多个优先级队列,新进程先进最高优先级队列,用尽时间片还没执行完就降到下一级。特点是能让短作业快速完成,同时兼顾长作业。

2.4 信号量与PV操作:大题的“门面担当”

信号量是好多人的噩梦,但一旦掌握了模板,反而是送分题。信号量本质是一个整数变量,配合P操作和V操作使用。P操作相当于申请资源,会让信号量减1,如果减完小于0,进程阻塞;V操作相当于释放资源,会让信号量加1,如果加完仍然小于等于0,说明有进程在等待,就唤醒一个。

考试里最常见的就是用两个信号量解决互斥和同步问题。标准套路是:用一个互斥信号量保护临界区,初始值为1;用若干资源信号量控制资源数量或同步关系,初始值根据资源数量或初始可用的条件来定。

2.5 生产者-消费者问题:一套代码通吃同类型题目

生产者-消费者问题是PV操作的题眼。背熟下面这套代码,思路自然就通了。

设一个缓冲区能放n件产品,定义三个信号量:mutex=1(互斥访问缓冲区)、empty=n(缓冲区空位数量)、full=0(缓冲区中产品数量)。

生产者进程:

while(1) { 生产一件产品; P(empty); // 申请一个空位 P(mutex); // 加锁,进入临界区 把产品放入缓冲区; V(mutex); // 解锁 V(full); // 产品数量加1,同时可能唤醒消费者 }

消费者进程:

while(1) { P(full); // 申请一个产品 P(mutex); // 加锁 从缓冲区取出一件产品; V(mutex); // 解锁 V(empty); // 空位数量加1 消费产品; }

我看到不少同学在写这道题时会犯一个顺序错误:生产者先P(mutex)再P(empty)。如果缓冲区已经满了,生产者拿着锁等空位,而消费者又进不了临界区取产品,就死锁了。所以务必记住一句话:资源信号量在前,互斥信号量在后;释放顺序无所谓,但申请顺序不能反。

读者-写者问题也常考,核心是允许多个读者同时读,但写者必须独占。解法用读者计数加信号量控制,代码比生产者消费者稍长,但思路一样。哲学家进餐问题考得频率低一些,主要考死锁防止思路,比如要求哲学家必须同时拿到左右两支筷子才能开吃,或者限制最多四只哲学家同时入座。

3. 死锁与银行家算法:把计算步骤练成肌肉记忆

3.1 死锁的四个必要条件

死锁这块知识框架很清晰,背住四个必要条件就算拿下一半:互斥条件、占有且等待条件、不可剥夺条件、循环等待条件。选择题常拿其中一个条件做干扰项,比如“没有互斥就不会死锁”这类说法判断题。

简答题如果问死锁的处理方式,分四层:预防、避免、检测、解除。预防是从四个必要条件下手,破坏其中一个。比如要求进程运行前一次性申请所有资源,就是破坏“占有且等待”;允许系统强行剥夺资源,就是破坏“不可剥夺”。避免策略靠算法在资源分配前判断安全性,典型的代表就是银行家算法。检测与解除属于事后处理,先让死锁发生,再通过资源剥夺或进程撤销来恢复。

3.2 银行家算法手算模板

银行家算法必须要会手算,因为它是计算大题中出现频率极高的题型。核心步骤分四步:

  1. 计算每个进程还缺多少资源(需求=最大需求-已分配)。
  2. 计算当前可用资源向量(可用=系统总量-所有进程已分配资源之和)。
  3. 找进程:它的剩余需求必须小于等于当前可用资源,优先满足它。
  4. 假设把资源给它,它执行完会归还全部已分配资源,更新可用资源,继续找下一个能完成的进程。

我直接上一个例子。系统中有5个进程P0到P4,资源A、B、C总量分别为10、5、7。已分配矩阵如下:

进程已分配(A B C)最大需求(A B C)还需求(A B C)
P00 1 07 5 37 4 3
P12 0 03 2 21 2 2
P23 0 29 0 26 0 0
P32 1 12 2 20 1 1
P40 0 24 3 34 3 1

所有进程已分配之和为(7, 2, 5),因此当前可用资源为(10-7, 5-2, 7-5)=(3, 3, 2)。

然后开始找安全序列。当前可用(3,3,2),检查谁能完成:P1需要(1,2,2),小于等于(3,3,2),可行。让P1运行完,归还它的已分配资源(2,0,0),可用变成(5,3,2)。再找下一个,P3需要(0,1,1),小于(5,3,2),可行;P3归还后可用变(7,4,3)。接着P4需要(4,3,1),可行,归还后可用变(7,4,5)。然后是P0需要(7,4,3),可行,归还后变(7,5,5)。最后P2需要(6,0,0),可行。所以安全序列可以是P1→P3→P4→P0→P2。

注意:写银行家算法时先把“还需求”这一列算对,这步错了后面全错。另外,安全序列可能不唯一,只要你能按上述规则找出一条完整的,就说明系统处于安全状态。

考试还可能升级一下:某个进程发出新的资源请求,要判断能否立即分配。处理方法是先假装把资源分配给该进程,更新它的已分配和还需求,同时减少当前可用资源,再重新执行安全性检查。如果检查通过,才能真的分配。

4. 内存管理与页面置换:理解抽象概念,掌握计算模板

4.1 分页、分段与段页式:三者对比不混淆

内存管理这块概念多,容易记混。核心是把三种管理方式的关系搞清楚。

分页是把物理内存切成固定大小的页框,把进程的逻辑地址空间也切成同样大小的页,然后通过页表映射。特点是内存利用率高,碎片小,但一个进程的页面在物理内存中可以不连续。分段是按程序的逻辑结构(代码段、数据段、栈段)划分,段的大小可以不同,便于共享和保护,但会产生外部碎片。段页式则结合两者,先按逻辑分段,再在每段内部分页,地址转换要查两次表。

选择题常见考法:问“分页系统的逻辑地址由什么组成”,答案就是页号和页内偏移;问“分段系统的逻辑地址由什么组成”,答案是段号和段内偏移。还有个易错点,分页由系统自动完成,对程序员透明;分段对程序员可见,因为它对应程序结构。

4.2 逻辑地址到物理地址的换算流程

分页地址转换是必考计算题,套路特别固定。题目一般给你页面大小、逻辑地址、页表内容,让你求物理地址。

举个例子。页面大小为4KB(4KB=2的12次方,所以页内偏移占12位)。有一个逻辑地址十六进制为0x1A2B。先把逻辑地址拆开:0x1A2B的偏移部分取低12位,即0xA2B;剩余高位是页号,这里是1。查页表,假设页号1对应的页框号是5。物理地址=页框号×页面大小+页内偏移=5×4KB+0xA2B=0x5A2B。

考试时如果用十进制给地址,优先转成二进制或十六进制再拆分,不容易错。页内偏移就是逻辑地址对页面大小取余数,页号就是整除的结果。例如页面大小1024,逻辑地址4500,页号=4,偏移=404,查页表找页号4对应的页框号,再算物理地址就好。

易错点:如果题目给的是页表项从0号页开始,查表时别把页号当索引从1开始,一定要从0开始数。

4.3 页面置换算法:FIFO、LRU、OPT缺页次数怎么算

页面置换大题通常给一个页面引用串和物理块数,让你分别用FIFO、LRU、OPT算出缺页次数。

FIFO,先进先出,淘汰最早进入内存的页面。LRU,最近最久未使用,淘汰最长时间没有被访问的页面。OPT,最佳置换,淘汰未来最长时间不会被访问的页面(这是理论算法,实际不可实现,但考试用来比较性能上限)。

我拿引用串“7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1”配合3个物理块,这是教材里最经典的对比题。直接列表会很长,但考试的解题思路是先画一张表,每一列是一次访问,每个物理块占一行,访问缺页就填上新页号,缺页次数记一次。FIFO在这个引用串下会表现出所谓Belady异常:物理块增加到4块,缺页次数反而比3块时候更多。这个是选择填空的常客,知道“FIFO可能出现Belady异常,LRU和OPT不会”就够了。

手算时容易出错的点在于:LRU要在内存里按访问时间排序,记下每页最近一次被访问的位置;OPT要往后看引用串,找到每个页下一次出现的位置,选最远的那个淘汰。画表时,建议每行标明“缺页”或“命中”,最后数缺页数量。我在练习时发现,最稳的办法是先抄几遍教材例题,再拿其他题自练,练到看到引用串就能下意识反映谁被淘汰。

4.4 虚拟存储、页面分配和“抖动”

虚拟存储这块简答题和概念题偏多。核心思想是:程序只需部分装入内存就能运行,其余部分驻留在磁盘,运行时按需调入(请求调页)。好处是逻辑地址空间可以大于物理内存,多道程序并发度提高。

必背的两个名词:缺页率,指访问页面不在内存中的概率,缺页率太高会导致系统频繁换页;抖动(颠簸),指系统忙于调页、真正执行程序的时间极少,CPU利用率骤降。产生抖动的原因是物理块分配不足,系统给进程分配的页面数太少,进程频繁缺页。解决办法是增加工作集、改善局部性、适当增加分配块数。选择题常让你识别哪种情况属于抖动,记住关键词“频繁缺页”“系统效率急剧下降”就不会选错。

5. 文件系统、I/O与磁盘调度:小题常客,但也有固定计算题

5.1 文件物理结构与目录结构

文件系统这一章通常以选择题和填空题为主,但其中磁盘调度可能是计算题。物理结构三种:连续分配、链接分配、索引分配。连续分配实现简单、读写快,但会产生外部碎片,文件扩展困难;链接分配用指针串联不连续块,解决碎片问题,但只能顺序访问,且链接指针会占额外空间;索引分配把每个文件的盘块号集中放在索引块中,既支持随机访问又便于扩展,但索引块本身要开销。当前主流文件系统普遍采用索引或类似多级索引的结构,考概念时说出优缺点就能得分。

目录结构偶尔考树形目录和多级目录的优点:便于分类管理、路径解析快、支持文件重名。常配合绝对路径和相对路径出个小计算题,只要分清“从根目录出发”和“从当前目录出发”的区别即可。

5.2 盘块分配与位示图

磁盘空间管理最常见的考题是位示图。位示图用一串二进制位表示每个盘块是否空闲,1表示已分配,0表示空闲。题目常给出盘块总数、字长(如16位或32位),让你算某盘块号在第几个字、第几位。公式很简单:盘块号从1开始计数,则它在这个字中的位置=(盘块号-1)取模字长+1,所在的字=(盘块号-1)整除字长+1。这种题就是套公式,考前花十分钟记公式,考试两分钟拿分。

5.3 磁盘调度算法计算:SSTF、SCAN、C-SCAN

磁盘调度算法是容易被轻视的计算题。先记住算法思路:FCFS按请求顺序服务;SSTF优先服务离当前磁头最近的那个请求;SCAN(电梯算法)朝一个方向移动,沿途服务所有请求,到端点或最后一个请求再反向;C-SCAN,循环扫描,单向服务,到端点后快速回起点继续扫描。

考试给一组磁道请求序列和初始磁头位置,让你算总寻道距离。举个例子,磁头初始在53,请求队列为98、183、37、122、14、124、65、67。

FCFS寻道顺序就是请求的顺序:53→98(45),98→183(85),183→37(146),37→122(85),122→14(108),14→124(110),124→65(59),65→67(2),总寻道距离=45+85+146+85+108+110+59+2=640。

SSTF需要每次选择最近的一个:从53出发,最近的是65(12),接着67(2),接着37(30),接着14(23),接着98(84),接着122(24),接着124(2),接着183(59)。总距离=12+2+30+23+84+24+2+59=236。看,SSTF明显比FCFS高效很多。

SCAN会规定一个初始方向,比如向磁道号增大的方向。那么服务顺序是65、67、98、122、124、183,然后反向处理37、14。第一次从53到183的距离是130,反弹到14距离是169,总距离=130+169=299。计算时一定要先明确方向,不然顺序全错。

提醒:SCAN和C-SCAN的边界条件,不同教材对“到端点还是到最远请求后反向”有细微差别。考试时按教材的写法来,如果题目只给了“SCAN”没给方向,默认沿磁道号增大的方向。

5.4 I/O控制方式与设备分配

I/O这章的概念题偶尔出现在选择题里:程序直接控制方式、中断驱动方式、DMA方式、通道方式。要记住:程序直接控制是CPU忙等,效率最低;中断驱动让CPU在I/O期间可以做其他事,但每次传输一个数据都要中断一次;DMA按块传输,只在开始和结束时中断CPU,能直接在外设和内存之间搬运数据;通道是一个专门执行I/O指令的处理器,能独立管理多台设备。

设备分配相关的名词有设备独立性(用户程序使用逻辑设备名,而不直接面对物理设备)、逻辑设备表(LUT)映射等。考简答题的话,“什么是设备独立性,为什么引入”就是标准答案:让用户程序与物理设备解耦,提高可扩展性和易用性,系统通过设备映射表完成逻辑到物理的转换。

6. 考前一周的实操安排

6.1 复习节奏怎么定:先框架,后刷题,再查漏

如果距离期末考试只剩一周,建议按“3-2-1-1”的节奏安排:前3天过教材重点章节,按我上面整理的框架,每天完成一个模块的阅读和笔记;接下来2天集中刷计算大题,重点练PV操作、银行家算法、页面置换和地址转换,每天至少各做两类,做完对照答案看自己的步骤是否规范;第6天做一套完整的往年卷子,严格限时,模拟考场状态;第7天只看错题和背诵型知识点,比如进程状态图、死锁四个条件、各种调度算法优缺点。

刷大题特别要强调“过程”两个字。操作系统计算题给分按步骤来,就算结果错了,只要中间的画表、公式、判断过程在,也能拿大半分。所以平时练习就要养成把每一步写清楚的习惯,尤其是银行家算法,安全序列找错了没关系,但要让老师看得到你的判断过程。

6.2 根据个人经验,最后提醒三个容易翻车的点

第一个,PV操作不要死记生产者和消费者的代码,要理解信号量里“P申请、V释放”的本质,考试很可能换个场景,比如吸烟者问题、理发师问题。只要先把信号量的初始值定对,再用“资源信号量在前、互斥信号量在后”的口诀,就能稳住。

第二个,页面置换算法画表时,不要把物理块编号和页面号搞混。表的第一行是页面访问序列,下面若干行是内存里的物理块,标“缺页”那一列才是计时器。我见过不少同学表画得很大却数错了缺页次数,就因为在表格头部忘了区分“访问的页面”和“换入的页面”。

第三个,银行家算法里“剩余需求”必须用最大需求减去已分配,很多人直接用题干给的Max判断,忘了先算Need矩阵,导致整个安全序列崩掉。这个步骤一分钱一分货,先把表补完整,再往后走。

操作系统复习从来拼的不是天赋,而是你有没有把它当成一门“有规律可循”的课。概念题靠理解加反复记忆,计算题靠模板加刻意练习。把这些模块按分值排好优先级,每天推进一小块,期末卷子发下来的时候,你会发现那些曾经吓人的大题,不过都是换汤不换药的套路题。我最后再说一个亲测有效的小技巧:把所有算法都亲手在草稿纸上完整走三遍以上,尽量不要只看答案。写得多了,考场上真的会形成肌肉记忆,看一眼条件,手就知道下一步该干嘛。

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

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

立即咨询