备考408的时候操作系统这门课一度让我非常头疼。它不是单纯的背诵也不是纯粹的数学推导而是介于“偏理的逻辑”和“偏文的记忆”之间需要把抽象概念落到具体机制上。尤其是绪论和进程管理这两块绪论看似简单选择题里却暗藏不少细节进程管理更是整门课的重中之重调度、同步、死锁每一章都能单独拉出来出大题。这篇笔记我会按照自己的复习逻辑来梳理重点放在“考点怎么考”和“做题时容易错在哪”。不是教材的复读机更像是一个踩过坑的人把关键路径给你标出来。适合正在跟王道或汤小丹教材过一轮的同学也适合复习到中后期想快速回顾重点的人。1. 绪论章节容易被忽视的“送分题”与“拉分题”很多同学复习操作系统上来就直奔进程管理觉得绪论没啥好看的。实话讲绪论在408里的直接分值确实不高但它决定了你对整门课的底层理解。尤其是中断、系统调用、内核态与用户态这几块后面学到文件管理和设备管理时处处都要用到。1.1 操作系统的四个特征并发、共享、虚拟、异步这四个特征几乎年年都有选择题涉及但考法很灵活。不是让你默写定义而是给你一个具体场景问你体现了哪个特征。我一开始就老在这里栽跟头后来才总结出区分要点。并发和共享是操作系统存在的基础两者互为存在条件。并发强调“在一段时间内多个程序同时处于运行状态”注意这里说的是宏观上的同时微观上单核CPU同一时刻只能执行一个程序。共享则分为互斥共享和同时访问两种比如打印机就是互斥共享的设备磁盘文件就是可同时访问的资源。虚拟和异步的考点相对隐蔽一些。虚拟技术是把一个物理实体映射为多个逻辑实体比如虚拟内存、虚拟处理器。异步则是指进程以不可预知的速度向前推进因为进程随时可能被中断或调度走。做题时如果看到“多个程序交替执行”“速度不可预知”这类描述基本就是在考异步。提示四个特征里并发和共享是最常搭配考的一对容易和“并行”这个概念混淆。并发是逻辑上的同时并行是物理上的同时。单核CPU永远无法实现并行只能实现并发这个点一定要记牢。1.2 中断与系统调用理解内核态的一把钥匙中断是操作系统内核“夺回控制权”的核心机制也是区分内核态和用户态的关键。每次中断发生后CPU会从用户态切换到内核态执行完中断处理程序后再返回用户态。这个切换过程涉及保存现场、执行处理、恢复现场三个步骤画图理解比死记硬背要快得多。按触发方式中断可以分为内中断异常和外中断。内中断包括自愿中断系统调用和强迫中断硬件故障、缺页等外中断主要指来自CPU外部的信号比如I/O设备完成中断、时钟中断。做题时一个高频陷阱是trap指令触发的是内中断int指令触发的也是内中断而时钟中断是外中断。系统调用是操作系统给应用程序提供的“合法入口”用户程序不能直接访问内核资源只能通过系统调用来请求服务。注意区分系统调用和库函数库函数在用户态执行可以封装系统调用但不是所有的库函数都会触发系统调用比如printf会调用write系统调用而strlen完全在用户态完成。我复习的时候整理过一张对比表做题时反复对照准确率提升很明显对比项内中断异常外中断中断触发来源CPU内部执行指令产生CPU外部设备发出典型例子除零、缺页、系统调用时钟中断、I/O完成中断触发时机指令执行过程中任意时刻异步发生是否可屏蔽除严重故障外一般不可屏蔽可屏蔽中断可以通过屏蔽字屏蔽1.3 操作系统的发展历程从串行到多道发展历程这个考点看起来是“背史纲”实际考的却是“为什么”。手工操作阶段没有操作系统用户独占全机CPU等待人工操作资源利用率极低。批处理阶段引入了监督程序但单道批处理仍然只能串行执行CPU和I/O设备交替空闲利用率上不去。多道批处理系统才是操作系统真正成型的阶段。它允许内存中同时存放多道程序当一个程序因I/O等待时CPU立即切换去执行另一个程序。这种“中断通道”的技术让CPU和I/O设备并行工作资源利用率大幅提升。但多道批处理不提供交互能力用户无法干预程序执行于是又催生了分时系统。分时系统把CPU时间划分为时间片轮流分配给各个终端作业让每个用户都能“感觉自己独占了一台计算机”。实时系统则强调及时性和可靠性常用于工业控制、航天系统等场景。408在这部分的考题通常会问“某一特性属于哪个阶段”记住每个阶段的核心目标和关键技术就能应对。2. 进程与线程408的“半壁江山”从概念开始进程管理是操作系统考研的核心章节大题小题都爱在这里做文章。我刚复习的时候觉得概念好理解一做题就发现细节特别多。进程的定义、进程控制块PCB、进程状态切换、进程控制每一个点都能延伸出不少考法。2.1 进程实体与进程控制块进程存在的唯一标志进程是程序的一次执行过程是资源分配的基本单位。注意“进程是动态的”“程序是静态的”这个对照题目里经常用“程序是进程的静态文本”这类说法来考概念辨析。一个进程实体进程映像由程序段、数据段、进程控制块PCB三部分组成其中PCB是进程存在的唯一标志。PCB里存了什么进程标识符PID、处理机状态通用寄存器、程序计数器、进程调度信息优先级、状态、进程控制信息资源清单等。创建进程时创建PCB撤销进程时回收PCB内核就是通过PCB来感知和管理每一个进程的。没有PCB的程序只是一段静态代码谈不上“进程”。在408中PCB还常和“进程上下文切换”结合考。进程切换是指CPU从执行一个进程切换到执行另一个进程这个过程需要保存当前进程的上下文即PCB中的处理机状态信息并恢复下一个进程的上下文。这里容易混淆的是“进程切换”和“线程切换”的代价对比同一进程内的线程切换不需要切换地址空间所以代价更小不同进程间的切换必须切换地址空间代价更大。2.2 进程状态的转换谁在什么时候触发切换操作系统教材里经典的“三态模型”是就绪态、运行态、阻塞态王道还会补充创建态和终止态。就绪态表示进程已具备运行条件但等待CPU运行态表示进程正在CPU上执行阻塞态表示进程因等待某事件如I/O完成而暂停执行。状态转换关系要熟到闭着眼睛都能画。就绪态到运行态是调度程序分配了CPU运行态到就绪态是时间片用完或被更高优先级进程抢占运行态到阻塞态是进程主动请求I/O或等待某资源阻塞态到就绪态是等待的事件已经发生。这里有个送分点也容易错运行态可以直接变阻塞态但阻塞态只能先变就绪态不能直接变运行态。创建态和终止态也要留意。进程创建完成后进入就绪态而不是直接运行。终止态是进程执行完毕或被撤销此时系统会回收资源并清除PCB。题目如果问“进程从创建到运行经历的状态序列”完整答案是创建态 → 就绪态 → 运行态。2.3 线程调度的基本单位资源拥有的基本单位引入线程后进程变成资源分配的基本单位线程成为CPU调度的基本单位。同一个进程内的多个线程共享该进程的地址空间和资源但每个线程有自己的线程ID、程序计数器、寄存器集合和栈。这样设计的好处是线程切换开销小线程间通信方便不需要进入内核态就能完成。从考点的角度看线程引入后最常考的还是“进程与线程的对比”。例如进程拥有独立的地址空间一个进程崩溃不会影响其他进程同一进程内的线程共享地址空间一个线程非法访问内存可能会导致整个进程崩溃。再比如进程间通信需要借助内核提供的机制管道、消息队列、共享内存而线程间通信可以直接通过读写共享变量完成。用户级线程和内核级线程的对比也是408偏好。用户级线程对用户透明线程管理由用户空间的线程库完成不依赖内核但一个线程阻塞会导致整个进程阻塞。内核级线程由内核管理线程阻塞不影响其他线程但线程切换需要在核心态进行开销较大。了解这三种多线程模型多对一、一对一、多对多的优缺点选择题基本就稳了。2.4 进程控制fork、exec、exit背后的操作进程控制主要涉及进程的创建、终止、阻塞、唤醒等操作。在Linux中fork()是创建进程的核心系统调用它通过复制父进程的PCB来创建子进程返回两次在父进程中返回子进程的PID在子进程中返回0。exec系列系统调用则是让子进程“改头换面”加载一个新的程序替换当前进程映像。进程阻塞是进程自身主动执行block原语将运行态变为阻塞态。进程唤醒则是由协作进程执行wakeup原语将阻塞态变为就绪态。这两个原语是成对出现的阻塞和唤醒只能由进程自己和相关进程发起调度程序无法强行将运行态进程变成阻塞态。注意复习进程控制时容易忽略“原语”这个概念。原语是原子操作执行过程中不可被中断操作系统内核用关中断指令来实现原子性。PV操作、进程阻塞唤醒都是基于原语实现的后续信号量部分会反复用到。3. 调度算法选择题和大题的“常客”进程调度这块知识本身不难难点在于每个算法的调度逻辑和性能指标计算。408既会考你“哪种调度算法适合哪种场景”也会给你一串进程到达时间和服务时间让你算平均等待时间、平均周转时间。3.1 调度的三个层次高级、中级、低级调度分为高级调度作业调度、中级调度内存调度、低级调度进程调度三个层次。高级调度从外存的后备队列中选择一个或多个作业调入内存决定哪些作业可以进入内存发生频率最低。低级调度从就绪队列中选择一个进程分配CPU发生频率最高。中级调度则是根据内存空闲情况把暂时不运行的进程调到外存挂起以缓解内存紧张。做题时判断题常问“某个场景属于哪种调度”。例如一个进程因内存不足被换出到外存这是中级调度一个新作业从磁盘调入内存准备执行这是高级调度从就绪队列中选一个进程上CPU运行这是低级调度。三种调度的层次关系和发生频率对比需要反复记忆。3.2 常见调度算法的核心逻辑与选择场景先来梳理最常见的一批调度算法。先来先服务FCFS最简单按进程到达的先后顺序调度非抢占式对长作业有利对短作业不利。短作业优先SJF选择预计运行时间最短的进程先运行可以显著降低平均等待时间但可能导致长作业饥饿。SJF有两种形式非抢占式SJF是等当前进程运行完再调度抢占式SJF也叫最短剩余时间优先SRTF当新进程的运行时间比当前进程剩余时间更短时立即抢占CPU。时间片轮转RR是分时系统的核心每个进程最多运行一个时间片时间片用完后排到就绪队列尾部。时间片的大小设置是个经典考点时间片太大算法退化成FCFS时间片太小进程切换开销占比过大CPU有效利用率下降。一般要求时间片略大于一次典型的交互所需时间使大多数进程能在一个时间片内完成。优先级调度算法可以给每个进程设置优先级高优先级的先运行。这里要注意静态优先级和动态优先级的区分静态优先级创建时确定运行中不变动态优先级运行中会调整比如等待时间越长优先级越高可以避免饥饿。优先级调度可能是抢占式的也可能是非抢占式的题目会明确说明。多级反馈队列调度是综合性的算法设置多个就绪队列每个队列优先级不同、时间片不同新进程先进入最高优先级队列时间片用完后降级。它的特点是既照顾了短作业短作业在高层队列快速完成又能让长作业在低层队列获得CPU时间还能兼顾I/O密集型进程。408大题中如果出现“结合多级队列计算调度顺序”本质上是按时间轴推演建议动手画甘特图来辅助。3.3 调度性能指标平均周转时间怎么算调度算法的性能评价指标包括CPU利用率、系统吞吐量、周转时间、带权周转时间、等待时间、响应时间。最重要的两个计算指标是平均周转时间和平均带权周转时间。周转时间 作业完成时间 - 作业提交时间。带权周转时间 周转时间 / 服务时间运行时间。平均周转时间 所有作业周转时间之和 / 作业数量。做题时的最大坑点是搞混“到达时间”和“开始时间”特别是SJF调度下短作业不一定先执行——只有到达了才能被调度如果长作业先到达了短作业还得等它执行完非抢占式。我复习这一块时踩过一个很典型的坑计算SJF的平均等待时间时忘记考虑进程的到达时间直接按运行时间从短到长排序。实际上一个进程的等待时间是从它到达的那一刻算起的。如果一个短作业在t5才到达而长作业t0就到达了那么t0到t5之间CPU不可能空等它会先执行长作业的一部分。换句话说非抢占式SJF调度的是“在就绪队列里的最短作业”而不是“全局最短作业”。心得碰到调度算法计算题先画时间轴把每个进程的“到达-运行-完成”时间线画出来再填表计算准确率会高很多。我后期做题全部采用这个方式计算错误明显减少。4. 同步与互斥大题的核心得分区如果说进程管理是一棵大树同步与互斥就是树冠最密集的部分。408的大题经常在这里出“信号量 PV操作”的题目分值高、区分度高是拉开差距的关键。4.1 临界资源与临界区四个准则必须烂熟于心多个进程并发访问同一份数据时可能出现数据不一致的问题。我们把那些一次只允许一个进程访问的资源称为临界资源访问临界资源的代码区域称为临界区。访问流程是进入区检查可否进入→ 临界区访问资源→ 退出区解除占用→ 剩余区其他处理。同步与互斥是两种不同的关系。互斥是指多个进程不能同时使用同一个临界资源同步是指多个进程的执行顺序有先后要求比如“生产者生产后才能消费”“读者读完写者才能写”。解决临界区问题需要满足四个准则空闲让进临界区空闲时允许一个进程进入、忙则等待临界区有进程时其他进程必须等待、有限等待等待进程能在有限时间内进入临界区、让权等待进程等待时应放弃CPU不能忙等待。这四个准则做选择题时经常给出一个反例问你违反了哪条。4.2 信号量与PV操作P减V加但别只背口诀信号量是一种特殊的变量只能通过两个原语来操作P操作wait申请资源和V操作signal释放资源。P操作执行时信号量值减1如果结果小于0则阻塞当前进程V操作执行时信号量值加1如果结果不大于0则唤醒一个等待进程。很多同学背“P减V加”就以为会了其实做题时真正的难点在于“信号量初始值设置”和“P、V操作的位置”。初始值通常表示资源的数量互斥信号量初始为1资源信号量初始为资源可用数量。P操作一般放在进入临界区之前V操作放在退出临界区之后。同步关系则要看“等待发生在哪里”——等一个事件发生时就需要在事件发生后执行V操作在等待事件的位置执行P操作。经典的生产者-消费者问题是必须掌握的。用一个互斥信号量mutex保护缓冲区用两个同步信号量empty空位数量和full产品数量来控制生产与消费的顺序。生产者先P(empty)再P(mutex)消费者先P(full)再P(mutex)这样能避免死锁。如果P操作顺序是生产者先P(mutex)再P(empty)就可能出现缓冲区满时生产者占着mutex等待empty而消费者无法进入临界区的死锁局面——这种细节就是大题拉开分数的关键。除了生产者-消费者读者-写者问题和哲学家进餐问题也是常见考法。读者-写者问题的核心是多个读者可以同时读但写者必须独占。用count变量计数读者数量再用一个互斥信号量保护count本身。哲学家进餐则涉及多个资源同时申请的问题核心是防止“每个人拿一只筷子然后等待别人放下”的死锁。4.3 管程与协程408大纲外的加分理解管程是高级同步机制把共享资源和操作封装在一起同一时刻只能有一个进程在管程内活动。它解决信号量操作分散、易出错的问题。管程内部用条件变量来支持进程等待和唤醒相比信号量更结构化不容易写出死锁。408统考对管程的考查主要是概念层面但理解管程能帮你更好地理解Java的synchronized和并发包的设计思想。协程则是用户态的轻量级线程由程序自身控制切换不需要内核参与切换所以切换成本比线程更低。协程适合大量I/O密集型的并发场景比如高并发网络服务。虽然408考纲没把协程列为重点但近几年的计算机保研面试和复试经常提到复习之余了解一下“协程为什么比线程轻”“协程如何实现用户态调度”等基础概念对拓宽知识面很有帮助。5. 死锁必要条件的判断与处理策略死锁在408里的考查方式相对固定选择题考死锁的必要条件和预防策略大题考银行家算法的安全性判断。这部分内容如果吃透了原理属于性价比很高的得分点。5.1 死锁的四个必要条件缺一不可死锁是多个进程因竞争资源而互相等待导致都无法继续推进的状态。发生死锁需要同时满足四个条件互斥条件资源一次只能被一个进程使用、请求并保持条件进程持有资源的同时还能请求新资源请求不到也不释放已有资源、不可剥夺条件进程已获得的资源不能被强行剥夺、循环等待条件存在一个进程的循环等待链每个进程等待下一个进程占用的资源。这四个条件的考法通常是“给出一个场景判断是否可能死锁”或“给出一种破坏措施判断破坏了哪个条件”。例如允许进程强制抢占资源破坏的是不可剥夺条件要求进程一次性申请全部资源破坏的是请求并保持条件给资源编号并要求按序申请破坏的是循环等待条件。注意死锁和饥饿的区别。死锁是多个进程谁也走不了饥饿是某个进程长期得不到调度而无法推进但其他进程可以正常运行。死锁必然是循环等待饥饿不一定有循环做题时这两个概念经常放在一起混淆。5.2 处理死锁的四种策略预防、避免、检测、解除死锁的四种处理策略是递进的关系。死锁预防是通过破坏四个必要条件之一来杜绝死锁属于静态策略代价较高比如资源利用率低。死锁避免是在资源分配前判断这次分配是否安全不安全就不分配最典型的算法是银行家算法。死锁检测是允许死锁发生但系统定期检测是否出现死锁发现后采取措施解除。死锁解除的常用方法有资源剥夺法从其他进程剥夺资源分配给死锁进程、撤销进程法直接终止部分死锁进程、进程回退法让进程回退到死锁发生前的状态。银行家算法是408计算大题的经典考法核心逻辑是系统在分配资源前检查这次分配后系统是否处于安全状态。判断安全的方法是尝试找出一个安全序列使得每个进程都能依次获得所需的全部资源并顺利执行完毕。做题时要维护三个表最大需求矩阵、已分配矩阵、还需资源矩阵再结合现有的可用资源数来推演。我一开始做银行家算法题总是漏算进程的“已完成释放资源”环节。正确步骤是假设按某个顺序执行进程当前进程执行完后会释放它占用的全部资源然后这些资源可以分给下一个进程。每次分配都要更新Available再看有没有进程的Need小于等于Available。如果所有进程都能按某种顺序完成系统就是安全的。5.3 避免死锁的代码级思考加锁顺序与超时重试虽然408笔试不考实际的并发编程技巧但我建议备考的同学从代码角度理解一下死锁这能反向加深对理论的理解。在实际多线程开发中最常见的死锁场景是两个线程互相持有对方需要的锁。解决思路有三个方向固定加锁顺序所有线程都按同一顺序获取锁、加锁超时获取不到锁时释放已有锁并重试、使用更高级的同步工具如Java中的ReentrantLock、Semaphore。这种“从理论到实践”的联想对做理解性选择题很有帮助。比如考题问“为什么破坏循环等待条件可以有效防死锁”如果你写过按序加锁的代码就很容易理解所有线程都按同一顺序申请锁就不会出现A等B、B等A的环形等待。6. 常见误区与备考心得这些坑我替你踩过了写到这里我想把复习操作系统时常踩的坑集中梳理一下也算是对前面内容的补充。这些坑有的是做题时暴露的有的是和同学讨论时发现的值得单独拎出来说说。6.1 误区一把并发和并行混为一谈“并发”和“并行”在408卷面上是严格区分的。并发是同一时间段内多个进程交替执行逻辑上同时并行是同一时刻多个进程同时执行物理上同时。在多核CPU上可以既并发又并行每个核心上并发执行多个进程多个核心之间并行执行。选择题一旦出现“单核CPU上多个进程同时运行”这种描述直接判错因为单核只能并发不能并行。6.2 误区二PV操作的P/V位置摆放随意P/V操作的位置是信号量大题的重点考察点。P操作放错位置可能会导致死锁、资源占用异常V操作漏写则会让其他进程永远阻塞。我在做生产者-消费者练习题时最常犯的错误是把P(empty)和P(mutex)的顺序写反。记住一个原则先申请“资源类信号量”再申请“互斥信号量”。这样可以避免一个进程占着临界资源却等不到其他资源的情况。还有一个容易被忽略的细节V操作可以放在临界区内部或外部通常建议放在外部减少临界区执行时间。如果临界区执行时间过长其他需要进入临界区的进程等待时间会变长影响并发性能。6.3 误区三只看不练不动手画图和写代码验证操作系统复习最忌讳“眼睛会了手上不会”。进程状态转换图、调度甘特图、银行家算法推演表一定要亲自在纸上画一遍。调度算法的计算题尤其要多练练到“看到进程到达表就能条件反射地画时间轴”。如果是非科班跨考的读者建议再配合Linux系统做一些小实验比如用top命令观察进程状态用ps命令查看PID和进程优先级甚至写几行C代码调用fork、wait、exec来感受进程控制的实际效果。理论结合实践之后那些抽象的概念一下就落地了。6.4 备考节奏建议第一轮重理解第二轮重计算第一轮复习绪论和进程管理时不要急着刷题先把王道或汤小丹教材的对应章节读完配合思维导图梳理框架。这一轮的目标是“理解”即能用自己的话讲清楚什么是PCB、什么是时间片、什么是临界区。第二轮开始再集中刷选择题和计算题发现薄弱点后回到教材精准补漏。408的复习资料我比较推荐王道系列它的知识点总结和真题分类很适合应试。如果时间充裕还可以搭配汤小丹《计算机操作系统》补充一些细节推导。历年真题是最好的训练材料进程管理相关的选择题和大题建议反复做两遍以上。最后分享一个我在实际复习中的体会操作系统这门课最怕“松散地努力”。每天翻几页书、看几个视频感觉都懂了但关上书什么都说不出来。强烈建议每看完一个章节就拿一张白纸凭记忆画出这一章的知识结构再标注每个知识点的常考题型。这个方法帮我建立了完整的知识网络做题时定位考点快了很多你也试试看。