简介:南京航空航天大学操作系统复习笔记是一份面向计算机考研与期末复习的浓缩资料,系统梳理了操作系统核心概念、五大类型、设计目标、基本功能与主要特征,并按章节摘录进程管理、PCB、状态转换等关键考点,适合备考南航及同类院校操作系统课程的读者快速巩固。资源共1个PDF文件,压缩包大小1.15MB,内容精炼便携,适合打印或手机随时翻阅。笔记从批处理、分时、实时到网络与分布式系统均有覆盖,同时详解进程实体、并发执行条件、内核与用户态划分等易考点,内容预览显示其中包含完整知识点框架与记忆要点。目前已有1331人学习浏览,这份笔记可帮助读者建立操作系统整体脉络,免去大量抄录整理时间,是一份性价比很高的考前冲刺资料。
1. 操作系统复习为什么总在“背了又忘”和“算了看不懂”之间反复横跳
南京航空航天大学的操作系统课程,期末复习的痛点和别校不太一样。一是课时紧张,很多院系把操作系统压缩在 32 到 40 学时里讲完,进程管理、内存管理、文件系统、设备管理四大块全塞进去,老师上课只能挑重点讲,剩下全靠自学;二是南航的考题风格偏“应用题驱动”,PV 操作、银行家算法、页面置换、磁盘调度这些计算型大题占了 50 分以上,纯背概念根本拿不到分;三是教材用的是汤小丹那本《计算机操作系统》,课后题量大,但考试真正考的变形题和课后题不完全重合,照着课后题刷容易翻车。这门课不像数学有明确公式链,也不像网络有清晰分层,它的知识点像一张网——进程和内存纠缠、文件和设备纠缠,复习时如果只看单点,做综合题必死。这篇笔记按南航考试的出题权重来组织,把每个高频考点的原理、做题步骤、踩坑记录拆开讲,目标是让你合上书能自己推一遍完整流程,而不是对着笔记背一遍然后上考场现挂。
2. 进程与线程:南航卷面上占比最大的一块,先分清“状态”再谈“调度”
2.1 五状态模型与七状态模型:画图能救你半道题的分
进程状态转换是南航选择题和简答题的常客,而且喜欢在“就绪→运行”“运行→阻塞”之间挖坑。最基础的五状态模型——创建、就绪、运行、阻塞、终止——必须闭着眼睛能画出来。但考试真正拉分的是七状态模型,多了“挂起就绪”和“挂起阻塞”两个状态,引入挂起状态的目的是缓解内存不足:当内存紧张时,把阻塞队列里的进程整批换到外存,变成挂起阻塞;如果内存还是不够,再把就绪队列的进程也换出去,变成挂起就绪。
做题时容易混淆的点:挂起就绪和就绪的区别在于是否在内存中,前者在外存,后者在内存;挂起阻塞和阻塞同理。调度器只能从内存中的就绪队列挑选进程,不能直接调度外存里的挂起就绪进程——必须先激活(换入内存)。南航 2021 年考过一道 8 分简答,画七状态模型图并说明各状态转换的触发条件,很多人把“挂起就绪→挂起阻塞”画反了,实际转换关系是:挂起就绪只能被激活变为就绪,挂起阻塞可以被激活变为阻塞,也可以因为等待的事件发生直接变为挂起就绪——注意,事件发生在挂起状态下时,进程不会直接进入就绪队列,它还在外存里,必须先激活才能被调度。
2.2 进程控制块与上下文切换:别把“切换开销”当成纯理论
进程控制块(PCB)是操作系统中最重要的数据结构,没有之一。PCB 里存什么?进程标识符、处理机状态(通用寄存器、程序计数器、程序状态字)、进程调度信息(优先级、状态)、进程控制信息(通信信息、资源清单)。南航喜欢考“PCB 由谁创建和撤销”——答案是操作系统内核,不是进程自己。进程自己只能创建子进程,不能创建自己的 PCB;子进程的 PCB 由父进程通过系统调用触发内核创建。
上下文切换的开销是这几年反复出现的考点,题型从“下列哪项不是上下文切换开销”到“计算切换时间占比”都有。上下文切换的本质是保存当前进程的 CPU 现场(寄存器、PC、PSW)到它的内核栈或 PCB,再恢复下一个进程的现场。题目常见陷阱:把用户态和内核态的切换等同于进程上下文切换——不对,系统调用发生时是模式切换,不一定会切换进程;模式切换开销远小于进程切换,因为它不涉及保存整个进程现场。有一道经典计算题:CPU 时间片为 10ms,上下文切换需要 0.1ms,问切换开销占比——答案是 0.1 / (10 + 0.1) ≈ 0.99%,不是 0.1/10 = 1%,很多人漏了切换过程本身也占用 CPU 时间。
2.3 调度算法比较:先会算平均等待时间,再谈“哪个算法好”
调度算法这块,南航近五年考过三次大题,间歇性地考一次小题。需要熟练掌握的算法有六个:先来先服务、短作业优先、高响应比优先、时间片轮转、优先级调度、多级反馈队列。前三个面向批处理,时间片轮转和优先级面向交互式,多级反馈队列是综合题的高频素材。
计算平均等待时间是基本功,但南航不满足于让你算一个普通 FCFS,它喜欢把“短作业优先的抢占式版本”——最短剩余时间优先——混进来。有个容易错的细节:SJF 非抢占式的平均等待时间一定不差于 FCFS,但如果是抢占式,可能产生“长作业饥饿”问题。高响应比优先的公式必须记牢:响应比 = (等待时间 + 要求服务时间) / 要求服务时间,每次调度时重新计算所有就绪进程的响应比,选最高的。它的好处是兼顾长短作业,但每次调度都要重新计算,开销比 FCFS 大。
多级反馈队列的规则要能默写:多个就绪队列,优先级从高到低,时间片从短到长;新进程先进最高优先级队列;队列内用时间片轮转;低优先级队列的进程只有高优先级队列全空才能被调度;进程用完时间片没执行完,降级到下一队列。南航 2023 年考过一道综合大题,给出了三队列多级反馈队列、每队列时间片分别为 2、4、8,给了五个进程的到达时间和服务时间,要求画出调度甘特图并计算平均周转时间。这种题没有捷径,只能按时间轴一步一步推,最容易出错的地方是“进程在哪个队列被抢占”——比如进程正在第一队列执行,时间片还没用完,此时第二队列来了一个进程,不抢占,第一队列的进程继续执行;但如果进程在低优先级队列执行时,高优先级队列来了新进程,必须立刻被抢占。
2.4 进程同步与 PV 操作:南航大题的“钉子户”,答题格式比答案更重要
PV 操作是南航操作系统试卷里最稳定的大题,几乎每年必考,分值在 10 到 15 分之间。题型集中在三类:生产者-消费者变体、读者-写者变体、哲学家进餐变体。但南航的题目通常不是原题,而是在场景上做了包装——比如“某医院有挂号窗口和取药窗口,病人必须先挂号再取药”,本质还是生产者-消费者;比如“某停车场只有一个入口和一个出口,管理员每放行一辆车入口闸机抬起一次”,本质是资源信号量控制。
写 PV 操作题,必须养成固定答题格式:先定义信号量并说明初值,再写每个进程的代码,代码里 P、V 操作必须成对出现,注释写明每个 P 操作等的是什么资源。这里有个血泪经验:不要在代码里只用 P 操作而不用 V,也不要在一个进程里连续 P 两个信号量时不考虑死锁风险——经典错误是先 P 互斥信号量再 P 资源信号量,如果资源为 0,会把自己阻塞在临界区里,其他进程也无法进入,形成死锁。正确顺序是先 P 资源信号量再 P 互斥信号量。
有一个南航高频变体值得单独说:缓冲区大小为 n 的环形缓冲生产者-消费者。定义三个信号量:mutex = 1(互斥访问缓冲池)、empty = n(空缓冲区数)、full = 0(满缓冲区数)。生产者:P(empty) → P(mutex) → 放入数据 → V(mutex) → V(full)。消费者:P(full) → P(mutex) → 取出数据 → V(mutex) → V(empty)。注意,这里的 empty 和 full 的 P 操作顺序不能互换——如果先 P(mutex) 再 P(empty),当缓冲区满时,生产者占据互斥锁等待 empty,消费者没法进入临界区取数据,死锁。南航有一年把缓冲池大小从 n 换成了 1,问还需不需要 mutex——答案是缓冲区大小为 1 时,mutex 可以省略,因为 empty 和 full 已经天然互斥,但写上也不扣分,考试时建议写上以保格式完整。
2.5 死锁:银行家算法要按表格推,死锁定理要会找循环等待
死锁这块,南航考过银行家算法大题、死锁必要条件简答、死锁检测的选择题。银行家算法的题目特征是给一张表格——各进程的 Allocation(已分配)、Max(最大需求)、Available(可用资源),让你判断系统是否安全,并给出安全序列。
做题的正确打开方式是画一个安全判断表:每轮找出 Need(Max - Allocation)≤ Available 的进程,假设分配给它,运行完释放 Allocation,更新 Available,继续下一轮。这里有个易错点:Need 矩阵要在第一步就算好,不要在推导过程中临时算,否则容易算错。另一个易错点是:Available 初始值不等于资源总数,而是资源总数减去所有进程 Allocation 之和。如果题目给的表格里 Available 有明确值就直接用,没有的话才自己算。
死锁的四个必要条件是互斥、请求并保持、不可剥夺、循环等待,简答题经常要求“说明如何破坏每个条件”——互斥条件很难破坏(有些资源必须互斥,比如打印机),可以通过 SPOOLing 技术把独占设备虚拟化为共享设备来缓解;请求并保持可以通过“一次性申请所有资源”来破坏;不可剥夺可以通过“申请不到就释放已有资源”来破坏;循环等待可以通过“资源有序分配法”来破坏。南航对第四点的考察频率最高,要能说清楚有序分配法为什么能破坏循环等待:给所有资源类型编号,规定每个进程只能按编号递增的顺序申请资源,就不会形成环形链。
死锁检测和死锁避免的区别也常考:死锁避免(银行家算法)是在分配前判断这次分配是否会导致不安全状态,不会则不分配;死锁检测是允许分配,周期性检查是否已有死锁,发现后用撤销进程或资源剥夺的方式解除。死锁检测的资源分配图化简是小题常客——逐步消去不阻塞的进程,如果能消去所有边,则无死锁;否则死锁。
3. 内存管理:从连续分配到页面置换,南航计算题的第二大分仓
3.1 连续分配与伙伴系统:外部碎片的成因要说清
连续分配方式包括单一连续、固定分区、动态分区。固定分区的缺点是内部碎片——进程装入分区后没用完的空间无法被其他进程使用;动态分区的缺点是外部碎片——内存中存在大量不连续的小空闲块,每个都小于进程所需大小。
动态分区的分配算法有首次适应、最佳适应、最坏适应、邻近适应。南航考的多的还是前两个,要记住它们的性能对比:首次适应算法按地址递增顺序找第一个满足要求的空闲分区,优点是偏向利用低地址部分、查找开销小,但会形成许多碎片;最佳适应算法选能满足要求的最小空闲分区,碎片最小但可能产生大量无法使用的小碎片,而且每次都要遍历全部空闲分区。选择题的经典问法是“哪种算法最容易产生大块空闲区”——最坏适应,因为它每次都选最大的空闲分区分配,剩余空间仍然可能较大。
伙伴系统的计算题偶尔出现:请求分配 2^k 大小的内存块,若没有恰好匹配的空闲块,则不断分裂,直到产生足够大的块。释放时若伙伴块空闲则合并。伙伴系统的合并条件是两个块大小相同、地址连续、且由同一块分裂而来——判断“是否由同一块分裂”的标准是两个块地址互斥,即除了大小位以外地址位完全相同。做题时画二叉树最快,每次分裂产生左右孩子,释放时检查同父节点的兄弟是否空闲。
3.2 分页存储管理:页表项的计算必须零失误
分页是南航计算题的重灾区,每年至少有一道关于页表大小、逻辑地址转换、有效访问时间的计算题。公式不多,但必须精确掌握换算:逻辑地址结构 = 页号 + 页内偏移,页内偏移位数 = log2(页面大小),页号位数 = log2(页数)。物理地址 = 块号 × 页面大小 + 页内偏移,注意这里的页内偏移和逻辑地址的页内偏移完全一样,不需转换。
经典计算题:某系统页面大小为 4KB,逻辑地址为 32 位,则页内偏移占 12 位,页号占 20 位,最多支持 2^20 = 1M 个页面,若页表项占 4B,单级页表最大占用 1M × 4B = 4MB。如果内存物理地址为 36 位,页面大小 4KB,则物理地址空间有 2^24 个页框,页框号占 24 位。页表项里除了页框号,还要放有效位、访问位、修改位等标志,所以页表项通常不止 4B——这是南航喜欢埋的陷阱:题目问“页表项最小是几字节”,你要根据页框号位数向上取整加标志位。
有效访问时间 EAT 的计算公式要背熟:EAT = (1 - p) × 访存时间 + p × 缺页处理时间,如果有快表(TLB),则分两种情况——快表命中和快表缺失。典型公式:EAT = 命中率 × (TLB 查询 + 访存) + 缺页率 × (缺页处理) + (1 - 命中率 - 缺页率) × (TLB 查询 + 两次访存),这里“两次访存”是因为页表在内存中,逻辑地址到物理地址的转换要读一次页表。做题时注意快表命中时只需一次访存。
3.3 页面置换算法:手推 FIFO、LRU、OPT 的口诀和易错点
页面置换算法是南航计算题的最爱,和 PV 操作并称“两道送分题”——说送分是因为规律性强,说容易翻车是因为手推过程容易数错页面。
先进先出(FIFO):用队列模拟,换出最早进入内存的页面。注意 Belady 异常——内存块数增多时缺页率反而可能上升,这是 FIFO 特有的现象,问答题常考。
最近最久未使用(LRU):每次换出最长时间未被访问的页面。手推时用“栈”法——每访问一个页面,把它提到栈顶,换出栈底。南航的题目喜欢把 LRU 和“访问局部性”联系起来,简答题要能说出 LRU 利用了局部性原理,但实现开销大,需要硬件支持访问时间的记录。
最佳置换(OPT):换出未来最长时间不会被访问的页面。只能用于理论分析,不能实际实现。做题时先看当前页面在后面的访问串中哪个最晚出现,换它就行。
Clock 置换算法(第二次机会算法):南航近年开始考。用环形链表管理页面,每个页表项有访问位,缺页时检查指针指向的页面,访问位为 0 则换出,为 1 则清 0 并移动指针。做题时关键是要按环形顺序逐个检查,不能跳。
手推步骤口诀:先画内存块,逐行填访问序列,每缺页一次计数加一;OPT 要往后看,LRU 要往前看。最容易错的点是:当访问的页已在内存中时,FIFO 不改变队列顺序,LRU 要更新该页的访问时间(提到栈顶),OPT 什么都不用做——很多人在这里数错缺页次数。
3.4 分段与段页式:段表不像页表,段长是变量
分段管理的逻辑地址是二维的——段号 + 段内偏移,段表项包含段长和段基址。和分页最核心的区别是:页的大小固定由硬件决定,段的大小由用户程序决定,所以每个段表项必须记录段长,地址转换时需要检查偏移量是否越界——段内偏移 ≥ 段长则产生越界中断。
选择题常考“分页和分段的主要区别”:分页是物理单位,对用户透明;分段是逻辑单位,对用户可见。分页易产生内部碎片,分段易产生外部碎片。分页是一维地址空间,分段是二维地址空间。
段页式结合两者:先分段,每段内再分页。地址结构是段号 + 页号 + 页内偏移,访问一个数据需要三次访存——查段表、查页表、访问数据。如果加 TLB,则命中时一次访存。南航如果考段页式的计算,大概率只考“几次访存能取出数据”,答案为:无快表 3 次,有快表且命中 1 次,有快表但缺失 3 次。
3.5 虚拟内存与缺页处理:局部性原理是理解一切的钥匙
虚拟存储器的理论基础是局部性原理——时间局部性(刚访问的数据很快会被再次访问)和空间局部性(访问了某个地址,附近的地址也可能被访问)。基于局部性原理,只把进程的部分页面装入内存就能运行,其余页面在需要时按需调入。
缺页中断的处理流程要会按顺序默写:CPU 访问的逻辑地址在快表中未命中 → 查页表 → 页表项有效位为 0 → 触发缺页中断 → 操作系统检查内存是否有空闲页框 → 有空闲则装入页面;无空闲则按置换算法选页面换出 → 若被换出的页面被修改过(修改位为 1),要先写回磁盘 → 更新页表和快表 → 重新执行被中断的指令。这里有个坑:缺页中断是内部中断(陷阱),不是外部中断;缺页中断处理过程中可能再次发生缺页——因为处理缺页的代码本身可能不在内存中。
驻留集大小与抖动是简答题考点。抖动(颠簸)指进程频繁缺页,系统大部分时间花在换入换出上,CPU 利用率反而下降。解决办法是采用局部置换策略——每个进程只能从自己的页面中选置换对象,或者引入工作集模型——保证每个进程的驻留集不小于其工作集。工作集的定义要记牢:进程在时间窗口 Δ 内访问的页面集合。南航题型常是“给定访问序列和窗口大小,求工作集”——按窗口滑动取页面集合,去重即可。
4. 文件系统与磁盘调度:把 FAT、索引节点和电梯算法一起串起来记
4.1 文件的物理结构:三种分配方式的对比表是送分题
文件的物理结构决定了文件数据在磁盘上的组织方式,南航选择题必考,简答题偶尔结合计算一起出。三种方式:连续分配、链接分配、索引分配。
连续分配是每个文件占用一块连续的磁盘空间,优点是读取速度快、支持随机访问,缺点是产生外部碎片、文件不能动态增长。链接分配用指针串联每个块,文件可以分散存储,但只能顺序访问,且指针占用存储空间——南航问答题的一个变体是“一个链接分配的块大小为 512B,其中 4B 存指针,实际数据只有 508B,求文件最大长度”,答案是块数 × 508B。
索引分配为每个文件建一个索引块,存所有块的指针,支持随机访问。单级索引的问题是大文件要多个索引块,解决方式是链接索引或多级索引(二级索引:索引块的块号本身存在另一个索引块中)。UNIX 的混合索引分配是南航计算题经典考点:inode 中有 13 个地址项,前 10 个直接地址,第 11 个一级间接,第 12 个二级间接,第 13 个三级间接,每个磁盘块大小为 1KB,每个地址项占 4B。计算时先算每个块能存多少地址项:1KB / 4B = 256 个。一级间接可指向 256 块,二级间接可指向 256×256 = 65536 块,三级间接可指向 256^3 块。然后问文件最大长度、某个偏移量落在哪一级——这种题必须分情况讨论,先减掉前 10 块,再进入一级间接、二级间接区间。
4.2 目录实现与磁盘空闲空间管理:位示图题要会算字号和块号
目录的实现方式有线性表和哈希表。线性表简单但查找慢,哈希表查找快但需要处理冲突。文件控制块 FCB 包含文件基本信息、存取控制信息和使用信息。南航简答题喜欢对比 FCB 和索引节点的区别:FCB 包含文件名和索引节点号,查找目录时要把所有 FCB 读入内存匹配;而 Unix 把文件名与文件元数据分离,目录项只存文件名和 inode 号,元数据在 inode 中,这样查找时只需读入文件名列表,减少了磁盘 IO。
空闲空间管理有四种方式:空闲表、空闲链表、位示图、成组链接。南航最爱考位示图计算。典型题目:字长为 32 位,位示图第 i 行第 j 列对应盘块号为 (i-1) × 32 + j(若从 1 开始编号),或 i × 32 + j(若从 0 开始编号)。考试时必须先看清楚题目编号是从 1 还是从 0 开始——这个陷阱每届都有人踩:题目写“字长为 32 位,行号和列号均从 1 开始编号”,位示图的第 3 行第 5 列对应块号是 (3-1) × 32 + 5 = 69;如果从 0 开始编号则不同。反过来,给块号求行列位置也同理做逆运算。成组链接是 UNIX 使用的方式,把空闲块分组,每组用一个空闲块记录下一组的信息,用于大容量磁盘。
4.3 磁盘调度算法:电梯算法的手推过程最忌“到边才回头”
磁盘调度算法是南航计算题之一,通常是给一个当前磁道号和访问序列,让你分别算 SSTF、SCAN、CSCAN 的寻道顺序和总寻道长度。
最短寻道时间优先(SSTF):每次选离当前磁道最近的请求。注意可能出现“磁臂粘着”——离当前磁道近的请求不断到达,远处的请求一直等,造成饥饿。
扫描算法(SCAN,电梯算法):磁头朝一个方向移动,遇到该方向上的请求就服务,直到该方向没有请求,才反向。手推时的关键:一开始要先判断磁头移动方向,题目通常会说明“目前磁头正在向磁道号增大的方向移动”,没说明的按默认向增大的方向移动。每到一个请求磁道就停下服务,然后继续沿原方向走,直到当前方向上没有更远的请求才回头。最容易翻车的点是“磁头是否需要移动到最内/最外侧才回头”——SCAN 只需要移动到该方向最后一个请求所在磁道即可回头,不需要到物理边界,除非题目明确说“移动到边界再回头”;而 C-SCAN 循环扫描则通常是移动到边界后直接回到另一端的边界,全程单向服务。
假设当前磁道为 100,方向向大号端,请求序列为 23、67、120、12、150、38。SCAN 的服务顺序是:120 → 150 →(150 之后无更大请求,反向)→ 67 → 38 → 23 → 12。总寻道长度 = |100-120| + |120-150| + |150-67| + |67-38| + |38-23| + |23-12| = 20 + 30 + 83 + 29 + 15 + 11 = 188。C-SCAN 的顺序:120 → 150 →(回到最小端,这段不算服务)→ 12 → 23 → 38 → 67,总寻道长度 = 20 + 30 + (150-0) + 12 + 11 + 15 + 29 = 267——这里端到端的跳跃距离也计入总寻道长度,南航的评分标准是看最终数字和顺序,跳跃距离算不算总分要按题目要求,但顺序绝对必须对。
4.4 文件系统可靠性:文件备份与一致性检查常见考点
这里不是考试重点,但南航偶尔在选择题里带一两个名词。文件系统的一致性检查涉及块一致性检查——对比空闲块表和目录中的块,找出既在空闲表中又在文件中的块(数据冗余)或在空闲表中但未被任何文件使用的块(丢失块)。日志文件系统的基本思想是在写磁盘之前先把操作写入日志,崩溃后可以根据日志重放或撤销操作,保证元数据一致性。考试最多考名词解释或判断题,不需要深究实现细节。
5. 输入输出与设备管理:伪代码不常考,但这几处概念年年丢分
5.1 I/O 控制方式与中断处理:四种方式的演进史就是一条线索
I/O 控制方式从程序直接控制到中断驱动、DMA、通道,演进的核心是减少 CPU 参与 I/O 的程度。程序直接控制方式(轮询):CPU 不断检查设备状态是否就绪,忙等,浪费 CPU。中断驱动方式:CPU 发出 I/O 命令后继续执行其他任务,设备就绪后发中断通知 CPU,CPU 在中断处理程序中完成数据传输——但每次传输一个字节或一个字都要中断一次,频繁中断仍是开销。DMA 方式:DMA 控制器直接在外设和内存之间搬运数据块,搬运完成才发一个中断通知 CPU。通道方式:通道是一个专门处理 I/O 的处理器,能执行通道程序,独立完成较复杂的 I/O 操作,CPU 只需发起 I/O 请求和接收完成信号。
南航选择题高频陷阱:“DMA 方式下,CPU 在数据传输开始时做什么,结束时做什么”——开始时 CPU 初始化 DMA 控制器(设置内存起始地址、传输字节数、设备地址、操作方向),之后 CPU 完全不管传输过程,传输结束时 DMA 控制器发中断给 CPU。陷阱在于,有人认为 DMA 传输过程中 CPU 被阻塞,实际 DMA 方式下 CPU 可以继续执行不与内存总线冲突的指令,但 DMA 和 CPU 争用内存总线时 CPU 会暂停——不是完全独立。
中断处理流程的题也很常考,顺序必须背下来:保存现场(程序计数器、程序状态字等)→ 分析中断原因,找到中断处理程序入口 → 执行中断处理 → 恢复现场,返回断点继续执行。南航常考的变体是“中断和系统调用的区别”——系统调用是用户进程主动请求操作系统服务,是内中断(陷阱或异常);外部中断是设备等外部事件触发,两者处理流程相同但来源不同;异常是内部错误(缺页、除零),处理完后可能终止进程也可能重新执行指令。
5.2 SPOOLing 技术与虚拟设备:为什么打印机可以“共享”
SPOOLing(假脱机)是设备管理里最常考的概念,南航简答题问过“如何将独占设备改造为共享设备”。SPOOLing 的核心是在磁盘上建立输入井和输出井,在内存中建立输入缓冲区和输出缓冲区,由 SPOOLing 进程统一管理。以打印机为例:多个进程要打印时,只需把打印数据送到输出井,SPOOLing 进程按顺序把数据送给打印机打印。从进程角度看,它独占了一台“虚拟打印机”,而打印机本身被多个进程共享了,现实是打印数据在磁盘排队,真正打印是串行的。
做题时容易混淆的点是:SPOOLing 是在磁盘上缓冲,不是在内存在缓冲;输出井是磁盘空间,不是缓冲区。系统调用 write 返回时数据还没真正写到打印机,只到了输出井。南航问答题如果给一个“多个用户同时打印”的场景,要答出三点:磁盘输出井缓冲数据、SPOOLing 进程统一调度、进程获得的是虚拟设备(逻辑设备),通过设备独立性把逻辑设备映射到物理设备。
5.3 缓冲技术:单缓冲和双缓冲的计算题有固定套路
缓冲技术里,单缓冲、双缓冲、循环缓冲的计算题是南航比较喜欢的小题。这类题有个标准模型:设备把数据放入缓冲区,CPU 从缓冲区取数据,设设备写入一个数据块的时间为 T,CPU 处理一个数据块的时间为 C,缓冲区传输时间为 M(通常忽略或单独说明)。
单缓冲:设备先填缓冲区(耗时 T),填满后 CPU 开始处理(耗时 C),同时设备继续填下一个块到同一缓冲区——但设备需要等 CPU 用完缓冲区才能写入下一块,所以处理 n 块数据的总时间是 n × max(T, C) + M(第一块还需 M 时间传入 CPU)。如果 T > C,则每块都是 T,总时间约 nT;如果 C > T,则每块都是 C,总时间约 nC。
双缓冲:设备先填 A(T),填满后 CPU 处理 A 中的数据(C),同时设备填 B(T)。处理 n 块总时间为 n × max(T, C) + M。双缓冲能骗过 CPU 和设备之间的大部分等待——当 T > C 时总时间约 (n+1)T,当 C > T 时约 nC + T。实际上双缓冲的核心价值是允许设备和 CPU 并行工作,南航只要出这种题,画时间轴就能解,别硬背公式,画图最可靠。
6. 南航操作系统的避坑指南:复习阶段最容易翻车的四个细节
提示:以下每一条都是往届考生用分数换来的教训,如果你只想看一遍就过考场,建议对照自查。
6.1 现象:PV 操作题最后忘了 V 操作,或者 V 了错误的信号量。
原因:写代码时只关注 P 操作(申请资源),没有形成“P 和 V 必须成对出现”的肌肉记忆。尤其在生产者和消费者两个进程各写一个函数时,最后返回前漏掉 V 操作是重灾区。
解决:写完每个进程代码后,立刻检查三个点——每个 P 都有对应的 V(可以不在同一进程中,但必须存在);V 操作释放的信号量跟 P 操作的逻辑对应;缓冲区临界区要同时 P 和 V 互斥信号量。另外,把信号量定义、初值说明放在代码块开头,这样阅卷时第一眼就能看到你的资源建模是否正确。
6.2 现象:页面置换算法手推时,把“访问已在内存中的页面”也当成缺页计算。
原因:手推页面置换时注意力全在换出换入上,忽略了一个前提——页面已在内存中时,不产生缺页中断,也不需要置换。
解决:每访问一个页号,先在当前驻留集里查一遍。查到就标记命中,不计数,只更新该页的访问状态(LRU 要更新为最新,FIFO 不做变化,OPT 也不做变化)。查不到才计缺页数,并按算法换页。用表格逐行手推时,每行先写“是否命中”,再写置换动作,能有效避免连续缺页计数错误。
6.3 现象:银行家算法找安全序列时,选了一个 Need ≤ Available 的进程后,忘了在下一轮更新 Available,或者把 Allocation 和 Max 搞混。
原因:银行家算法的推导表有多个矩阵——Allocation、Max、Need、Available,手推时容易盯着一个矩阵而忽略另一个。尤其 Need = Max - Allocation 这个关系要在推导前先算好列在纸上,不能每轮临时心算。
解决:按四列表格画:进程名 | Allocation | Max | Need(预填)。每轮找一个满足 Need ≤ Available 的进程,在 Available 列加上它的 Allocation。多选出的安全序列一般不是唯一的——考试时只要写出一组合法序列就得分,不必纠结最优。如果找不到满足条件的进程,说明系统进入不安全状态,要回答“找不到安全序列,系统可能死锁”。
6.4 现象:磁盘调度 SCAN 题,磁头方向判断错了,整道题全军覆没。
原因:SCAN 算法的手推依赖初始移动方向,题目如果给“当前磁道 53,方向向小号端”,而你按默认大号端推,路由顺序完全不同。
解决:拿到题第一步先在草稿纸上标出磁头当前位置和移动方向箭头。如果题目没提方向,默认是向磁道号增大的方向移动。移动时要注意,SCAN 的反向点是“该方向上的最后一个请求”,不是磁盘物理最外侧磁道——只有题目明确说“到最外/最内磁道后反向”才那样算。
7. 考前三天最有用的冲刺法:按题型做“输出式复习”,而不是再翻一遍笔记
最后这段时间,不要再从头到尾读笔记了。南航试卷的题型结构相对固定,按题型去刷效率最高:
7.1 把每个算法当成“不看笔记能白手推”的标准
找个白纸,不要看任何参考资料,按顺序默写以下内容:进程五状态图(标全转换条件);生产者-消费者 PV 操作完整代码(含信号量定义);银行家算法推安全序列的四列表格流程;FIFO、LRU、OPT 各推一个长度为 10 的访问序列;SCAN、C-SCAN 各推一个寻道序列。每一个都能在白纸上独立完成,才叫真复习过。
7.2 背答案不如背“答题框架”
南航的简答题,阅卷是按点给分。以“死锁的四个必要条件”为例,不只要写四个名词,要写清每个条件的含义——互斥:资源一次只能被一个进程使用;请求并保持:进程持有资源又申请新资源;不可剥夺:资源只能被持有者主动释放;循环等待:存在进程-资源的环形等待链。以“分页和分段的区别”为例,答三点:单位性质不同(物理/逻辑)、地址空间维度不同(一维/二维)、碎片特点不同(内部/外部)。框架记住了,考题换任何描述都能套。
7.3 做错题要用“现象→原因→修正”三步记录
这个习惯是我在南航复习时养成的:每做错一道计算题,在错题本上写三行——错的答案、为什么会错(是公式记错,还是初始条件看漏)、正确的做法。比如“银行家算法的 Available 初值算成了资源总数”,修正为“Available = 资源总数 - 所有进程 Allocation 之和”。回头看,大部分错误不是不会做,而是初始条件没看清。
最后一句个人教训:操作系统这门课,最怕的就是“看懂了例题”和“能自己做出来”之间的差距。看例题以为自己会了,一动手就卡壳——这是我在复习中反复翻车的根源,后来改用上面这套“白纸默写法”,每天抽一个知识点不看笔记完整推一遍,效果远比通篇翻书好。希望帮到你,考场见。
本文还有配套的精品资源,点击获取