资讯动态

操作系统第三章进程管理复习精讲:状态图、高频考点与易混淆概念

发布时间:2026/10/17 10:28:34 来源:尧图企业网站定制
每次翻开《操作系统——精髓与设计原理》第三章的复习题和习题我都会先合上书给自己五分钟在白纸上画一遍进程状态转换图。这不是玄学而是我啃过不少操作系统教材和真题之后总结出来的习惯第三章的复习题看起来都是概念题实际上考的是你对进程模型有没有形成一张动态图。如果你现在也在准备操作系统考试或者正在补进程管理这块基础这篇内容就是为你整理的我会把第三章复习题和习题的高频考点拆开讲清楚每类题怎么答、答题时容易在哪丢分以及我自己反复踩过的坑。1. 复习第三章前先在白纸上画出这张状态转换图1.1 为什么第三章是整本操作系统的分水岭很多人复习操作系统时有一个误区觉得第三章讲的是进程这样一个孤立概念只要记住定义就能应付复习题。实际上第三章是整个操作系统的分水岭。后面讲内存管理必须知道进程地址空间怎么分配讲调度算法前提是理解进程在就绪队列里怎么排队讲并发与同步更是直接把进程之间如何互相影响当作唯一主线。换句话说第三章的进程描述和控制是后面所有章节的地基。第三章引入的进程概念有一个关键点程序是静态的进程是动态的。一个程序文件放在磁盘上它只是一个指令序列当用户请求执行操作系统把它加载进内存分配资源调度它上CPU这时候才形成一个进程。同一个程序可以被多个用户同时运行产生多个进程它们共享同一份代码但各自拥有独立的数据、栈和进程控制块。这一点几乎是第三章复习题中出镜率最高的一句话但很多人答得不完整只写了动态和静态的区别没有把共享代码、独立数据补上。1.2 进程的控制要素从程序代码到进程控制块要回答第三章大部分复习题离不开一个核心对象进程控制块。操作系统之所以能管理进程靠的就是每个进程都带一个PCB。PCB中记录了操作系统需要知道的关于这个进程的一切信息。用C语言伪代码描述一个简化版PCB大概是这样的typedef struct pcb { int pid; // 进程标识号 char name[32]; // 进程名 int state; // 当前状态就绪/运行/阻塞/挂起 int priority; // 优先级 unsigned long *regs; // 通用寄存器保存区 unsigned long *sp; // 栈指针 unsigned long *pc; // 程序计数器 int mem_base; // 内存基址 int mem_limit; // 内存边界 void *resources; // 资源清单 struct pcb *next; // 队列指针 } pcb_t;PCB里的信息可以归为三类第一类是进程标识信息包括pid、进程名、用户标识等用来区分不同进程第二类是处理器状态信息包括程序计数器、寄存器、栈指针、处理器状态字这一部分是进程切换时必须在现场保存的内容第三类是进程控制信息包括调度状态、优先级、事件等待信息、内存指针、资源清单等供操作系统做调度和资源管理。我在做题时发现复习题如果问进程控制块包含哪些信息标准答案必须是分类作答而不是罗列字段。先给出三个分类再在每个分类下各举两三个例子得分结构就完整了。反过来讲如果一个同学只背下了字段名却说不清处理器状态信息在进程切换时为什么必须保存那这道题在换一种问法时还是会丢分。1.3 状态转换图是整个第三章的地图第三章的知识点再多最后都能浓缩到一张进程状态转换图里。经典的模型至少包含五个状态创建态、就绪态、运行态、阻塞态、退出态。引入挂起概念后还要把挂起作为一种附加状态加到就绪和阻塞上形成七状态模型。我建议你用下面这张表来检验自己是否记住了转换关系原状态新状态触发事件说明创建态就绪态进程创建完成已具备运行条件加入就绪队列就绪态运行态被调度程序选中占用CPU运行态就绪态时间片到/被更高优先级抢占总让出CPU但不缺资源运行态阻塞态等待I/O或某种事件发生进程主动等待阻塞态就绪态等待的事件发生或I/O完成重新具备运行条件运行态退出态正常完成或异常终止回收资源撤销PCB运行态就绪挂起内存不足进程被换出状态里叠加挂起标记画状态转换图时一定要把挂起和阻塞区分开。挂起是进程被换到外存不一定缺资源只是暂时不在内存阻塞是进程等待某个事件可能还在内存里。这两条转换线如果画错后面的习题基本全错。2. 复习题不只是背答案高频问题的答题结构与得分点2.1 操作系统对进程管理的职责是什么这类题的答题框架第三章复习题第一个高频题就是让考生概括操作系统在进程管理方面的职责。这道题看似宽泛其实有固定的答题框架。我通常按五个功能点展开进程的创建与撤销、进程的调度、进程的同步与进程间通信、内存与资源分配、进程切换时的现场保护与恢复。先讲创建与撤销操作系统收到用户运行程序的请求后会分配PCB加载代码和数据初始化状态然后把进程插入就绪队列进程结束时负责回收内存和外设资源注销PCB。再讲调度就绪队列中同时有很多进程操作系统按照调度策略选出一个进程上CPU并把控制权交给它。接着是同步与通信多个进程可能共同访问同一份数据操作系统提供锁、信号量等机制保证互斥同时提供管道、共享内存、消息队列等机制让进程间传递数据。很多同学在答这道题时只写了负责分配CPU和内存丢了很多分。原因就是没有站在整个进程生命周期的角度去答。我的经验是答题前先在草稿上画一条生命周期线从创建到运行到退出问自己在每一个阶段操作系统必须做什么然后按这个顺序组织答案基本上不会漏点。2.2 状态转换问答题答题不能只给名词另一类高频复习题是状态转换型比如进程从运行态转换为阻塞态的原因是什么从阻塞态转换为就绪态又是什么原因这类题如果只写等待I/O和I/O完成能拿到一半分丢掉的另一半在于没有说明场景。完整的答题方式要结合例子。比如运行态到阻塞态典型场景是进程执行到read系统调用需要从磁盘读取数据而磁盘I/O速度远低于CPU进程如果继续占用CPU只能空转于是操作系统把它转为阻塞态让出处理机。再比如阻塞态到就绪态典型场景是磁盘控制器完成数据读取发出中断中断处理程序发现这个进程一直在等待这次I/O于是把它的状态改为就绪并放入就绪队列等待调度程序再次挑选它运行。我自己的作答习惯是先定义、再触发条件、最后举例三步走。尤其在考试时举例能显著提升答案的区分度因为批改者最想看到的就是你能不能把抽象状态迁移落到具体事件上。第三章复习题不是考名词默写而是考你对进程行为全过程的理解。2.3 上下文切换与模式切换谁切换什么必须说清楚第三章复习题里几乎必有一道题问模式切换和进程切换的区别。这道题是丢分重灾区因为很多同学以为用户态切到核心态就是进程切换。先厘清概念。模式切换是CPU运行模式的变化发生在中断、陷入或系统调用时。最典型的例子进程A在用户态执行执行到一条需要操作系统介入的指令或发起系统调用CPU就切换到核心态执行内核代码处理完后再切回用户态。注意这个过程中进程A依然是当前进程只是运行模式变了现场信息没有改变。进程切换则不同它意味着CPU从执行进程A切换到执行进程B。这时必须做完整的上下文切换保存进程A的PC、寄存器、栈指针等信息到进程A的PCB再从进程B的PCB恢复它上次保存的现场。进程切换一定会发生模式切换但模式切换不一定导致进程切换。我在做复习题时会专门用一个表格来对比它们比较项模式切换进程切换本质CPU运行特权级变化CPU执行的进程对象变化触发原因中断、系统调用、异常调度程序选择新进程现场保存不一定需要简单保存后返回必须保存和恢复完整上下文开销较小较大涉及PCB读写是否改变当前进程否是答这道题时只要先把进程切换必然涉及模式切换但模式切换不一定是进程切换这句话写出来再展开说明原因这道题的分数基本就能拿满。2.4 进程间通信从消息传递到共享内存第三章复习题还会涉及进程间通信的基本概念。常见的通信方式有管道、共享内存、消息传递和套接字等。复习题问得比较多的是消息传递方式和共享内存方式各自的优缺点。我的答题思路是先说共享内存的实现逻辑。多个进程映射到同一块物理内存区域一个进程写入另一个进程直接读取。它最大的优势是速度快减少了数据复制缺点是多个进程同时访问时需要同步机制否则会出现数据竞争。再说消息传递的逻辑进程间通过系统调用发送和接收消息数据由内核搬运不需要共享地址空间。优点是安全适合分布式环境缺点是每次传递都要经过内核有复制开销。这两个概念如果只答优缺点还是显得单薄。我建议再补一句现代操作系统往往同时提供多种方式因为它们适用的场景不同。共享内存适合性能敏感的单机进程间通信消息传递适合结构更松散、需要隔离保护的通信场景。把这句收尾加上答题的完整性会明显不一样。3. 习题拆解状态图补全、进程行为计算与设计题3.1 状态图补全题先找事件再连箭头第三章习题里很常见的一种题是给出一张不完整的状态转换图让你补齐状态之间的转换路径或者给每条边标注触发事件。我做这类题时有一个固定的分析顺序先把所有状态节点列出来再列出所有可能发生的事件最后把每个事件映射到正确的转换路径上。举个例子。假设题目给出的状态有运行态、就绪态、阻塞态和退出态已有三条转换边运行到就绪、运行到阻塞、阻塞到就绪。要补充的通常包括就绪到运行、运行到退出、以及各状态在创建和终止时对应的边。就绪到运行的转换事件是调度程序选中该进程运行到退出的触发事件是进程执行完最后一条指令或发生致命错误创建态到就绪态的触发事件是初始化完成进程已被操作系统完全建立。注意创建态是一个很特殊的状态它只出现在进程尚未完全建好的那一段短暂时间里很多同学做题时直接把创建态忽略了。完整答这类题还有一个隐藏得分点指出从阻塞态能不能直接回到运行态不能必须先变就绪。原因是阻塞态的进程不具备运行条件只有等待的事件发生后才重新可运行而调度只能从就绪队列选进程。这一句话往往是区分答案有没有真正理解状态模型的分水岭。3.2 进程执行与I/O交互的计算题用时间线模型解题第三章习题里还有一些简单的计算题核心是计算一个进程或者多个进程交替执行时的CPU利用率和等待时间。这类题看起来不复杂但很容易在时间线的画法上出错。我总结了一个通用解法称为按段拆时间。假设一个进程的行为是运行5毫秒进行I/O操作10毫秒再运行5毫秒。题目让你计算在单进程环境下和双进程环境下各自的CPU利用率。单进程环境很直接CPU先工作5毫秒然后进程阻塞等待I/O 10毫秒这期间CPU空闲之后CPU再工作5毫秒。总时间20毫秒CPU工作时间10毫秒利用率50%。双进程环境下两个进程同类型的执行序列就可以错开进程A做I/O的时候进程B正好可以上CPU运行。时间线排一下0到5毫秒进程A运行5到10毫秒进程B运行10到15毫秒进程A的I/O完成开始第二个CPU段同时进程B做I/O如此交替CPU几乎不会空闲。利用率的计算就变成了总工作量除以总时间。关键是画时间线时要把每个进程的CPU段和I/O段分别排列并检查有没有CPU空闲段。这类题的得分点不在于算得快而在于在草稿上把时间线画对。我在做题时会把CPU段用实心方块标记把I/O等待段用空心方块标记两个进程分两行对齐看很多坑一眼就能发现。3.3 进程创建题四步回答法习题里还有一种问法描述操作系统创建一个新进程的过程。这道题在教材配套练习题里出现的频率极高而且答案很固定一般按四个步骤作答。第一步申请一个空白的PCB为这个新进程分配一个唯一的进程标识号第二步在新进程的地址空间中加载程序代码和数据如果程序已经在内存里就只需建立映射关系第三步初始化PCB包括初始化各寄存器、程序计数器、栈指针、状态字段和优先级第四步把PCB插入就绪队列等待调度程序调度。我在复习时会把每一步都对应到前面讲的PCB信息分类里第一步对应标识信息第二步对应内存映射第三步对应处理器状态和控制信息。这样四步就不需要死记而是顺着先建立档案、再加载实体、再填档案、最后排队的逻辑自然推导出来。考试时如果题目还问子进程和父进程的关系就补一句创建者称为父进程被创建的称为子进程子进程可以继承父进程的某些资源但拥有独立的PCB和地址空间。4. 这些容易混淆的成对概念做题时一定要分开4.1 进程和程序最容易被误认为是一回事复习题喜欢问进程和程序的主要区别。很多人只记得进程是动态的程序是静态的到了习题里遇到同一个程序被执行两次会产生什么这样的问题就懵了。完整理解应该分几层。第一层程序是存储在介质上的指令集合进程是程序在数据集合上的一次执行过程。第二层程序可以长期保存进程的生命周期有限创建后存在执行完毕就消亡。第三层一个程序可以对应多个进程比如多个用户同时打开同一个编辑软件操作系统会创建多个进程实例反过来一个进程在执行过程中也可以动态加载不同程序段所以程序和进程不是一一对应。答这类题时我建议举一个贴近生活的例子程序就像菜谱进程就像按照菜谱做菜的过程。菜谱可以反复使用每次做菜都是一次新的过程过程中产生的结果不同过程结束菜谱还在。这个类比写进答案里作为辅助说明批改者通常会很认可。4.2 阻塞和挂起状态模型里最常搞混的两个状态第四章之前阻塞和挂起是两个很容易被混为一谈的状态。阻塞态是指进程等待某事件而不能运行但进程仍然在内存中挂起态是指进程被换到外存暂时不参与调度可能因为内存不足、用户请求或操作系统调试需要。做题时要注意一个关键区别阻塞态是缺少某个运行条件挂起态是暂时不让它运行。一个阻塞中的进程如果被挂起就变成阻塞挂起它所等待的事件发生后转为就绪挂起只有当它被重新调入内存才回到就绪态等待调度。我常用一个比喻来区分阻塞相当于人在食堂窗口排队打饭虽然没轮到你但你人在食堂挂起相当于你被叫去操场等通知人已经不在食堂了。这个比喻在答题时不需要写出来但能帮你自己快速判断。4.3 并发和并行概念边界的精确说法并发和并行也是一到复习题必考的高频词。并发的准确定义是两个或多个事件在同一时间间隔内发生强调的是逻辑上的同时推进并行的准确定义是两个或多个事件在同一时刻发生强调的是物理上的同时执行。单核CPU上多个进程通过快速切换实现并发但任何时刻只有一个进程真正运行所以不是并行。多核CPU上不同核上的进程可以真正并行。答题时如果只写一个CPU上也可以并发这句话是对的但最好补一句并发需要处理机在进程间切换并行需要多个处理机同时工作这样概念边界更清楚。4.4 用户态和核心态直接关系到你能否回答模式切换用户态和核心态的区别本质上是对CPU指令执行权限和内存访问权限的划分。用户态下进程只能执行普通指令不能直接执行涉及系统资源管理的特权指令核心态下操作系统内核可以执行全部指令包括修改寄存器、设置时钟、启停I/O设备等。进程处于核心态时仍然是当前进程只是具备更高权限。所以用户态到核心态的切换并不会改变当前进程是谁这个事实。这个知识点是第2.3节里模式切换判断的底层依据。复习时我习惯把这两个模式画成两个同心圆内核在内圈用户程序在外圈任何用户行为想要碰内圈资源必须通过系统调用这扇门。5. 我复习第三章时踩过的坑与最终采用的方法5.1 第一个坑把状态转换条件背串了我最开始复习状态转换时把所有触发事件列成一张表硬背结果一做习题就出问题。比如我把时间片到写成从运行态到阻塞态但标准答案是运行态到就绪态。时间片到了进程并不缺任何资源只是本次分给它的CPU时间用完了所以它是从运行态回到就绪态等待下一次调度而不是去阻塞。这个坑的根源在于我没有理解每个转换条件对应的资源状态。我改进的方法是每一条转换边都问自己一个问题目标状态比原状态缺什么、多了什么。运行态到就绪态缺的是CPU阻塞态到就绪态补上的是等待的事件运行态到阻塞态缺的是除CPU外的某个资源或事件。把资源角度想通之后就再也没背串过。5.2 第二个坑做计算题不画时间线凭空想象做进程行为计算题时我最初总想在脑子里直接算出结果。后来发现只要进程数量到三个纯心算就一定会漏掉某个CPU空闲段。我后来强迫自己每题都在草稿纸上画两行时间线一行CPU工作段一行I/O等待段然后把不同进程的交错重叠标注出来。这个习惯帮我避免了至少三分之一的计算失误。画时间线时还有一个细节要注意I/O设备数量是否有限制。如果题目假设只有一个I/O设备那么两个进程同时进行I/O操作时其中一个必须排队等待I/O设备这时候时间线会更复杂。教材配套习题里经常暗中加这样的限定审题时必须圈出来。5.3 第三个坑复习题只看答案不追问为什么复习题和习题最大的区别在于复习题答案常常短习题则要综合应用。如果复习课本时只把复习题答案抄一遍就完事等做习题就会暴露出概念不牢的问题。我的做法是拿到每道复习题先不看答案口头用一分钟讲一遍讲不清楚的地方标记出来回到正文里把相关段落重新读一遍。这种输出式复习比反复阅读有效得多。比如操作系统为什么要提供两种模式这道题如果我只能说为了防止用户程序破坏系统其实还没到点子上需要补充说明核心态和用户态的分界线在哪以及哪些指令必须由核心态执行这才算真正掌握。5.4 我的三轮刷题安排结合上面这些经验我整理了一套适用于第三章复习题和习题的三轮安排供你参考。第一轮是把全章知识表格化。我用的工具很简单就是一张A4纸横过来分栏左边写状态中间写PCB字段右边写转换事件。整理完再对照教材目录检查自己有没有遗漏小节。第二轮是合上书刷复习题只写关键词和答题提纲重点训练能不能想起来。第三轮是限时做习题每道大题控制在十五到二十分钟重点训练状态图补全和计算题的时间线画法。三轮做完之后我通常会在最后一天把所有做错过的题目再看一遍重点关注第一次做错时是什么思维导致的。比如我经常把阻塞和挂起混在一起后来就在错题旁边用红笔写下阻塞缺事件挂起被换出下次再遇到这类题时第一反应就是对照这句话判断。最后再分享一个个人体会第三章的复习题和习题本质上是在从不同角度反复考同一件事——操作系统如何把一个程序变成可运行的进程又如何在多个进程之间切换和协调。每做完一道题我都建议回到那张状态转换图上对应一下看看这道题落在哪个节点上。你如果也这样做就会发现第三章并不枯燥反而像在拼一张逐渐完整的地图。等这张地图拼好后面再学调度和内存管理时很多问题都会迎刃而解。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑