考研的人应该都听过一句话:得数学者得天下,但408统考的成败,往往卡在操作系统这门课上。原因很简单,数据结构考的是“逻辑”,组成原理考的是“硬件”,而操作系统是把软硬件串起来的那根线,概念抽象、动态过程多、知识点细碎,还动不动就和计算机组成原理交叉出题。这份操作系统笔记【全-408统考】就是冲着这几个痛点来的,把考纲范围内的知识点按章节整理成体系,再配合思维导图建立整体观,让复习不再是一盘散沙。
先说这份笔记适合谁。第一类是正在备考408的考生,不管你是第一轮过基础,还是第二轮强化整理,这套按考纲搭建的框架都能直接用;第二类是计算机专业本科在读、准备期末考或者考研入门的人,操作系统这门课在本科教学里往往讲得偏理论,但408统考的考查风格更偏向“懂原理、会计算、能分析”,这份笔记刚好补充了这块;第三类是非科班跨考、想系统补基础的人,思维导图可以帮助你快速建立知识地图,不至于一头扎进细节里出不来。
我在整理笔记和带复习的过程中反复体会到一个事实:操作系统不是靠“背”能搞定的科目,而是靠“串”。下面就把这份笔记的设计思路、章节拆解、导图使用方法和实操避坑经验全部分享出来。
1. 为什么说操作系统是408里最容易“看书全会、做题全废”的科目
1.1 操作系统在408统考中的真实分量
408统考一共四门:数据结构、计算机组成原理、操作系统、计算机网络,满分150分,操作系统占35分左右。从分值上看好像占比不高,但它的题目风格非常“阴险”——选择题喜欢抠细节,大题喜欢考综合。比如一道关于页面置换算法的题,表面上考内存管理,实际还牵扯到虚拟内存、缺页中断、甚至和组成原理里的Cache映射做对比。
更麻烦的是,操作系统的内容横跨“策略”和“机制”两个层面。策略是设计思想,比如各种调度算法、页面置换算法、磁盘调度算法;机制是具体实现,比如进程状态怎么切换、页表怎么组织、中断怎么处理。408统考特别爱把这两层混在一起考,如果只是背结论、背定义,题目稍微变个场景就懵了。
我见过太多同学的复习状态是:王道视频看了一遍,书也画得花花绿绿,一到做题就原形毕露。原因不是不努力,而是操作系统不像数据结构那样有稳定的“套路”,它的每个知识点都是一环扣一环的,前面的概念没真正理解,后面的计算题和大题根本无从下手。
1.2 这门课难在三个地方:抽象、动态、零散
抽象体现在操作系统管理的是“资源”,CPU、内存、磁盘、I/O设备这些东西你都看不见摸不着,全是靠抽象概念在脑子里建模。比如进程和线程,你在课本上背了定义、区别、优缺点,但你脑子里有没有“进程是资源分配的单位,线程是CPU调度的单位”这种动态画面?没有的话,一到“多线程模型”的题目就会犯迷糊。
动态体现在操作系统本身就是一套“运行中”的系统,状态会变、队列会换、资源会申请和释放。最典型的就是进程状态转换图:创建、就绪、运行、阻塞、终止,五个状态之间哪条线连哪条线,每条线背后的触发条件是什么,死记硬背很容易记串,但如果你能从“CPU就一个,进程很多个,谁在用谁在等”这个场景出发,状态转换一下就通透了。
零散体现在知识点的分布太散,而且章节之间互相纠缠。进程管理里讲的同步互斥,到了文件管理里又变成对文件资源的互斥访问;内存管理里的逻辑地址和物理地址转换,到了I/O管理里又和缓冲区管理挂钩。如果只是线性地一章一章学,学完后面忘前面是必然的。
我当初整理这份笔记的时候,最核心的思路就是:用“资源管理”作为贯穿全部章节的主线,把每一章的零散知识点挂到这条主线上。你学的不是一个一个孤立的定义,而是“操作系统怎么管CPU、怎么管内存、怎么管磁盘、怎么管I/O设备”这四个大问题。这样学完一章,你就能说清楚这一章在整门课里扮演什么角色。
2. 笔记整体架构:一条主线、三个核心、两个视角
2.1 一条主线:从“程序怎么跑起来”说清楚操作系统要干什么
很多人学操作系统学得晕,是因为一上来就陷入了各种术语里,完全没有建立起“这门课到底在解决什么问题”的全局观。我在笔记里反复强调的主线是:你写了一个程序,怎么让它跑起来?
回答这个问题,需要一层一层往下拆。程序编译之后是存储在磁盘上的一个文件,要运行它,得先把它的代码和数据加载到内存里,然后CPU从内存中取指令、执行指令,执行过程中可能需要读写文件、访问外部设备,最终输出结果。这个完整的链条里,每一个环节都需要“管理者”,而这个管理者就是操作系统。
沿着这条主线,操作系统的几大功能模块就自然浮现出来了:管理CPU的模块(进程与线程、调度、同步与互斥、死锁)、管理内存的模块(内存管理、虚拟内存)、管理磁盘和文件的模块(文件系统、磁盘调度)、管理I/O设备的模块(I/O控制方式、设备管理)。这四大模块,就是408统考操作系统考纲的四大板块。
把这个主线写在笔记第一页,就是让读者在开始深入学习之前先装一个“地图”。后面学任何一章,都能回头看看自己在整条链路中的位置,而不是迷失在细节里。
2.2 三个核心资源:CPU、内存、文件,理解操作系统的“管理思维”
主线建立之后,下一步是理解操作系统管理的核心对象。注意,这里我说的是“三个核心资源”,不是四个。因为文件系统和I/O管理在408里通常合并成一个大块,而且两者本质都是在处理“数据和设备之间的流转”。
CPU是操作系统里最宝贵的资源,进程和线程的引入就是为了“公平且高效”地分配CPU。内存是程序的立足之地,操作系统要用最少的内存跑最多的程序,所以才有分区管理、分页、分段、虚拟内存这些层层递进的设计。磁盘是持久化的存储,文件系统解决的是“数据怎么组织、怎么存取、怎么保护”的问题。
有了这三个核心资源的概念,你再去看操作系统里面的各种术语,就会发现它们全是围绕“资源”展开的:PCB是进程的资源清单,页表是内存的资源映射,文件描述符是I/O资源的句柄,信号量是并发资源的计数器。用“资源”这个视角去学操作系统,比死记硬背每一个术语的定义要高效得多。
我在笔记里给这三个核心资源各配了一张思维导图,把相关知识点全部挂进去。比如说内存管理的导图,根部是“内存管理要解决什么问题”,然后分出“内存分配方式”“地址转换”“虚拟内存”三个分支,每个分支再往下细化,这样知识点之间的关系一目了然。
2.3 两个视角:用户态与内核态,理解系统调用和中断的本质
如果说主线是“操作系统管什么”,那么这两个视角就是“操作系统怎么管”。用户态和内核态是贯穿操作系统全部章节的一对核心概念。
用户态是应用程序跑的空间,权限受限,不能直接访问硬件;内核态是操作系统跑的空间,可以执行特权指令,管理硬件资源。从用户态到内核态,唯一合法的通道就是系统调用和中断/异常。这四个字——系统调用、中断、异常——几乎是每年408的必考点,而且经常放在选择题里抠细节。
系统调用是主动的,比如你想读文件、申请内存、创建线程,都得通过库函数调用到内核;中断是被动的,比如硬盘DMA传输完成之后通知CPU“我干完了”;异常是出错了,比如除零、缺页。这三者的区别和联系,我在笔记里用一张对比表整理得清清楚楚,考试前直接看表复盘就行。
很多同学不理解“为什么要分用户态和内核态”这个底层问题,我习惯用一个类比:用户态和内核态的关系,相当于旅客和机场安检的关系。旅客可以自由走动,但只有通过安检才能进入隔离区,操作系统里的“安检”就是系统调用这个唯一入口。理解了这一点,你就能明白为什么系统调用有开销、为什么用户态切换内核态需要保存现场这些衍生知识了。
3. 核心知识点逐章拆解:这些内容必须吃透
3.1 进程与线程:操作系统的基础,也是大题的高频区域
进程与线程这一章,是操作系统里占比最高、最核心的一章,408统考基本每年都有一道大题落在这里。复习这一章,最重要的不是背定义,而是把“进程的状态转换”“进程控制块PCB”“进程的通信方式”“线程模型”这几个核心问题搞透。
进程状态转换图是必须能自己画出来的。就绪态是万事俱备只欠CPU,运行态是CPU正在为你服务,阻塞态是你在等某个事件(比如等待I/O完成)。最容易错的地方是“运行态可以直接变就绪态”这个转换——这是由时间片耗尽引起的,不需要经过阻塞。很多题就在这里挖坑。
进程通信是另一个高频考点,分为共享存储、消息传递、管道通信三大类。注意,这里的“管道”和Linux命令里的“管道”是同一个概念,本质是一个特殊的文件缓冲区。408常考的点在于:管道只能半双工通信、容量有限、读写同步等问题,命题人非常喜欢把这些细节放进选择题。
线程这一块,重点掌握用户级线程和内核级线程的区别,以及多线程模型(多对一、一对一、多对多)。理解的关键在于“调度单位”和“资源分配单位”这两个概念的区别:进程是资源的拥有者,线程是CPU调度的实体。用户级线程对内核透明,内核级线程才是真的被内核调度。
3.2 处理机调度:算法的对比和计算题技巧
处理机调度这一章的核心是几个经典算法,408几乎每年选择题都会考一道计算,比如给定一批进程的到达时间和服务时间,让你算FCFS、SJF、RR算法下的完成时间、周转时间、带权周转时间。这类题不难,但是很容易算错,关键要掌握“时间轴画图法”。
我的方法是拿到题目先画一条时间轴,然后一个事件一个事件往上填。FCFS最简单,按到达顺序服务就行;SJF要注意是“抢占式”还是“非抢占式”,非抢占式的经典陷阱是“当CPU空闲时选择最短作业”,而不是“一旦有短作业就立刻抢占当前作业”;RR时间片轮转的话,关键是“时间片结束的瞬间,新到的进程排到队尾还是队首”。
除了计算题,调度算法各有各的评价指标,比如FCFS的周转时间不一定是最优的,SJF的平均等待时间最短但对于长作业不友好,时间片大小的选择会直接影响系统响应时间和吞吐量。更容易考的是多级反馈队列调度算法,这是本书最综合的一个算法,它结合了先来先服务和时间片轮转,而且“动态调整优先级”的特性经常成为大题的背景。
关于各种调度算法适合什么场景,我总结了一个口诀式记忆方式:批处理系统适合FCFS和SJF,交互式系统适合RR,实时系统适合EDF(最早截止时间优先),混合场景用多级反馈队列。这样应试的时候反应快很多。
3.3 同步与互斥、死锁:最抽象也最拉分的一章
同步与互斥这一章,是操作系统里公认“听课能懂、做题不会”的重灾区。核心要解决两个问题:互斥是多个进程同时访问临界资源,同一时间只允许一个进程进入临界区;同步是多个进程的执行有先后顺序要求,比如生产者必须等消费者拿走商品之后才能继续生产。
信号量和PV操作是实现同步互斥的核心机制。P操作是“申请资源”,S减1,如果S小于0就阻塞;V操作是“释放资源”,S加1,如果S小于等于0就唤醒一个等待进程。这个定义必须滚瓜烂熟。在此基础上,经典同步问题——生产者消费者、读者写者、哲学家进餐——是408大题的题库源头。
复习PV操作题,我的经验是:不要背代码,要背“套路”。套路一,互斥问题一定有一对PV操作包住临界区;套路二,同步问题要在“事前”做P操作、“事后”做V操作;套路三,多个资源的时候,每个资源设一个信号量,先做同步的P再做互斥的P,否则可能死锁。掌握这三条,大部分PV题都能对付。
死锁这一节,关键考点四个:死锁产生的四个必要条件(互斥、不剥夺、请求并保持、循环等待)、死锁预防(破坏四个必要条件)、死锁避免(银行家算法)、死锁检测和解除。其中银行家算法每年都可能有选择题或大题,计算过程一定要亲手做几道题,熟练到不会在第二步“安全性检查”的时候搞混顺序。
死锁避免和死锁检测的区别可以这样记:避免是“预防针”,在资源分配之前判断是否安全,不安全就不给;检测是“事后急救”,允许死锁发生,定期检查再解除。理解这个逻辑之后,题目怎么变都不慌。
3.4 内存管理:理解“连续”到“非连续”的演进逻辑
内存管理这一章,主线特别清晰:早期的内存管理是连续分配,但连续分配有外部碎片、内部碎片问题,于是有了分页存储管理;分页是物理上划分固定大小的页框,没有外部碎片,但不容易共享;分段是逻辑上按程序自然段划分,方便共享和保护,但会产生外部碎片;分页和分段结合,就成了段页式存储。
最核心也是必考的内容是逻辑地址到物理地址的转换。分页存储管理下,一个逻辑地址由页号和页内偏移量组成,通过页表找到对应的物理块号,再拼接成物理地址。这里要特别注意“页内偏移量的位数决定页大小”这个隐含条件——如果页大小是4KB,那页内偏移量就是12位。
虚拟内存是这一章的另一个重点。虚拟内存的核心思想是“让程序的部分内容在磁盘上,用到的时候再调入内存”,这需要页表有“有效位”来标记页面是否在内存中,如果访问的页面不在内存,就会产生缺页中断。页面置换算法里,OPT是最优但不可实现,FIFO实现简单但可能产生Belady异常,LRU性能好但需要硬件支持,CLOCK是实际系统里最常用的折中方案。这些算法各自的特征和适用场景,需要整理成表格反复比较。
3.5 文件系统与磁盘管理:性价比最高的“拿分章”
文件系统这一章相对前面几章,理解和计算难度都要低一些,好好复习的话是性价比很高的拿分章节。重点有:文件逻辑结构和物理结构的对比(连续结构、链接结构、索引结构的优缺点)、文件目录的结构(单级、两级、树形、无环图)、磁盘空间管理(空闲表法、空闲链表法、位示图法)、磁盘调度算法(FCFS、SSTF、SCAN、C-SCAN)。
位示图法是408特别喜欢考的小题考点。一张位示图,每一行对应一个磁盘块组,每一位表示对应磁盘块是否空闲。考题通常是“第i行第j列对应的块号是多少”或者反过来,这类题只要搞清楚“字长”(一行有几个位)就能做对,但一定要看清题目里说的是“从0开始编号”还是“从1开始编号”,这个细节每年都有很多人送分。
磁盘调度算法和页面置换算法在思路上有相似之处,都是“根据未来的访问情况做优化”,但磁盘调度额外要考虑“磁头移动的方向”。SCAN算法也叫电梯算法,因为磁头就像电梯一样,先顺着一个方向服务完所有请求,再到尽头掉头,注意合理安排起始方向和终点。计算的时候画一个磁道数轴,把每个请求标上去,就很容易得到正确的服务顺序。
文件系统这章还有一个容易忽略的考点是文件系统的层次结构,从用户接口层到I/O控制层一共六层,408不一定会直接考“第几层叫什么”,但会在系统调用相关的选择题里间接涉及,建立一个整体印象总没错。
4. 思维导图实战指南:怎么画、怎么用才有效
4.1 思维导图不是抄书,是画“地图”
思维导图是这份笔记的标配附件,但我得说句实话:很多人跟着笔记里的导图看一遍,感觉都懂,关上图,什么都不剩。问题出在使用方式上。思维导图的正确用法不是“看”,而是“回忆”和“检索”。
我建议把思维导图当成“城市地图”,而不是“教科书目录”。教科书目录是按顺序列的,看不出知识点之间的主次和关联;地图是按照“区域”划分的,中心是核心概念,向外辐射的是相关知识点,人群聚集的地方(高频考点)在图上看得到。
制作思维导图的原则是:只写关键词,不写句子。一个知识点用三五个词就能概括,千万不要把定义抄上去,否则导图会变成一本缩印版教材。以“死锁”为例,中心写“死锁”,一级分支写“产生条件”“预防”“避免”“检测与解除”,二级分支写关键词,“产生条件”下面写“互斥、不剥夺、请求并保持、循环等待”。
4.2 四步法:建骨架、填血肉、多次回刷、考前只看图
第一步建骨架,在开始复习一章之前,先看目录和考纲,画出一个只有章节标题和核心概念的空导图,这是你的“框架层”。第二步填血肉,学完一节之后,把新学的知识点填充到对应的位置上,尽量用自己的话提炼关键词,这是在主动加工信息。第三步多次回刷,每学完后面两到三章,回来重新看前面的导图,试着不看子节点、只凭记忆向外延伸,想不起来的重点标记。第四步考前只看图,进入冲刺阶段之后,所有资料都放下,只看自己整理的这套导图,每条分支都能展开成一道题目,就说明复习到位了。
这个过程的关键在第三步“多次回刷”,艾宾浩斯遗忘曲线在操作系统这种知识点密集的科目上体现得淋漓尽致。一次学完不等于记住,回刷时发现自己想不起来某条分支上的知识点,回到笔记里看那个详细内容,记忆效果比第一次学新知识要好得多。
4.3 导图和刷题的配合节奏
思维导图不是刷题的替代品,而是刷题的工具。做题之前先看图,建立“这题在考哪一章哪个知识点”的定位感;做完题之后再回到图里,把错题对应的知识点在图上做标记,比如用星号或者下划线标注。一个知识点如果被标记了三四次,就说明这是你的薄弱点,需要回到笔记重新看原理解释,而不是继续刷更多类似的题目。
我自己的习惯是每刷完一套真题之后,拿出导图快速过一遍,凡是题目里涉及过的分支,心里过一遍相关知识点的三点核心内容,这个过程每次只要二十分钟左右,但效果非常显著,能有效防止“刷题很多但知识体系还是散的”这种问题。
5. 实操复习节奏与避坑指南
5.1 三轮复习法:基础、强化、冲刺各做什么
操作系统这门课的复习方式,我强烈建议分三轮,不要一遍一遍地重复看书,那样效率太低。
第一轮是基础阶段,建议每天投入一个半小时左右,持续三到四周。这一轮的目标是“看懂、听懂、不做难题”,跟着视频课或者笔记过一遍全部考点,做课后习题的基本题和选择题部分。这一轮不要求掌握多深,但要求每个概念都能用自己的话说清楚。思维导图的“建骨架”和“填血肉”都在这个阶段完成。
第二轮是强化阶段,建议四到五周,每天两小时左右。这一轮以刷题为主,王道课后题全部做完,错题要认真看解析,特别是大题。这一轮的核心目标是建立“条件反射”,看到“互斥”就知道要设一个初值为1的信号量,看到“多级反馈队列”就能画出去队出队的流程。思维导图在这个阶段开始“多次回刷”。
第三轮是冲刺阶段,考前两周到三周,每天一个半小时左右。这一轮做高质量的模拟题和408真题,特别是近五年的真题,每一道错题都要回到思维导图定位知识点。冲刺阶段最好在上午复习操作系统,因为408在下午考试的话,上午复习激活状态,下午做题更顺手,具体可根据自己的习惯调整。
5.2 刷题顺序与错题处理:整理一道、吃透一类
刷题顺序这件事,很多同学不太在意,但影响很大。操作系统的大题通常综合多个知识点,如果前面的选择题和小题都没吃透,直接做大题容易打击自信。
我推荐的顺序是:第一轮只做选择题,把小题涉及的零散知识点全部过一遍,注意收集“说法正确/不正确”型题目里出现过的错误表述,那些往往是命题人爱设的陷阱。第二轮开始做课后大题,先从进程PV操作题做起,这是最高频的大题类型;再到内存管理的地址转换;再到文件系统的索引结点计算;最后是混合型综合题。第三轮再做真题套卷,控制时间,模拟考场状态。
错题处理的核心原则是“整理一道、吃透一类”。很多人错题本记得满满当当,但只是机械抄题抄答案,完全没有分析错误原因,这样的错题本没有任何价值。我建议每道错题都写三行笔记:第一行写“为什么错”(是知识遗忘还是理解偏差),第二行写“正确思路”(画上时间轴、写清计算过程),第三行写“这一类题通用的解法”。把一道错题吃透,比盲目刷十道新题有用得多。
5.3 高频坑点速查表:考场上最容易丢分的几个地方
根据我自己的复习经验和观察,下面这些坑点在考场上反复出现,整理成一张速查表供参考:
| 坑点 | 具体表现 | 应对方法 |
|---|---|---|
| 进程状态转换方向记错 | 误认为运行态可以直接变阻塞态,实际上是运行态在等待事件时才转为阻塞态 | 画状态图,注意每个转换的触发条件 |
| 线程共享哪些资源弄不清 | 认为线程之间共享栈和寄存器,实际线程共享地址空间和全局变量,但栈和寄存器是私有的 | 记住“线程独有栈和寄存器,共享代码、数据、文件” |
| PV操作信号量初值瞎设 | 生产者消费者问题里同步信号量的初值总是设错 | 先想清楚“资源有几份”,初值就是几 |
| 死锁判断只看必要条件 | 满足必要条件不一定死锁,需要“循环等待”才能判定 | 用“申请资源能不能同时满足”来判断 |
| 地址转换忽略位移量位数 | 把逻辑地址拆开时,页号位数算错 | 先根据页大小确定偏移量位数,再算页号位数 |
| 磁盘调度不看磁头方向 | SCAN和C-SCAN题目里磁头当前移动方向没注意 | 先标注磁头当前位置和运动方向再解题 |
| 位示图编号从0还是从1开始 | 题目没有说明时,默认从0开始,但很多题会从1开始 | 审题时圈出“编号从0/1开始” |
6. 工具与资源选型:用什么复习效率最高
6.1 主教材与辅导书的搭配
操作系统方向参考书非常多,但408统考备考最稳定的一套组合很经典:汤小丹的《计算机操作系统》或者教材指定版本作为主教材,配合王道考研系列的操作系统辅导书来刷题。王道书的题源和408题风接近,习题难度分层合理,基础篇和强化篇适合不同阶段使用。
如果你有余力,还可以参考一些课外资料,比如《现代操作系统》作为补充理解,但备考时间紧张的话不推荐通读,深挖细节容易偏离考纲。教材的作用是建立知识背景和原理解释,王道辅导书的作用是刷题和把握考点,两者定位不同,不要用辅导书替代教材,也不要在教材里花太多时间钻牛角尖。
6.2 思维导图工具怎么看、怎么改
思维导图的载体可以是纸质手绘,也可以用XMind、MindMaster这类软件。纸质的好处是写写画画的参与感强,但后期修改不方便;软件的好处是层级结构清晰、方便导出和打印,而且可以随时折叠分支做“回忆练习”。
我个人建议使用支持“折叠子节点”功能的软件,因为这是一个天然的复习工具:折叠之后只看一级分支和二级分支,尝试回忆三级分支的内容,这是极其高效的复盘方式。导图也不需要准备太多张,按章节分成五到六张,文件夹清晰摆放即可,不要追求“一张图装下整本书”这种好看但不实用的做法。
6.3 时间记录与复盘:复习到后期最值得做的一件事
到了复习后期,大家都会陷入一种“既觉得自己什么都不会,又觉得没时间补”的焦虑状态。我的解决办法是每天用二十分钟做复盘,具体做法很简单:每天复习结束时,不看笔记,拿出一张白纸,把今天复习的知识点用自己的话写出来,能写多少写多少,写完再对照笔记找遗漏。
这个方法我称为“空白纸复习法”,本质是一种主动回忆,比反复阅读笔记的效率高得多。刚开始你会发现自己能回忆起来的内容少得可怜,这很正常,坚持两周之后,回忆的完整度会有质的提升。到了冲刺阶段,我会把每天要复盘的知识点提前写在便利贴上,贴在电脑屏幕旁边,做完一道题就便利贴回忆一次,碎片化的反复刺激效果很好。
7. 常见问题与排查技巧实录
7.1 学了后面忘前面,怎么办
这是操作系统复习最普遍的现象,解决办法只有一个:重复。但这里的重复不是从头再看一遍,而是用思维导图快速过一遍,只看关键词,不展开细看,强制自己回忆每个关键词对应的具体内容。回忆得出来的就过,回忆不出来的重点标记,这种方式一轮只要一两个小时,但比从头翻书有效得多。
另外一个小技巧:每次开始新章节之前,花十分钟把前一章的导图看一遍,然后合上导图,在本子上写一遍这一章的三个核心知识体系。你不需要写得很详细,只需要写出“这一章讲了哪三大块、每块的核心点是什么”。这十分钟的投资,会在一两个月后看到巨大回报。
7.2 PV操作题总是不会写,怎么突破
PV题是很多人的噩梦,但突破方法其实很机械。第一步,判断这个题目里有哪些“进程”,每个进程循环在执行什么动作;第二步,判断进程之间是“互斥”还是“同步”关系——互斥的共享资源加一个初值为1的信号量,同步的先后关系用初值为0或者资源数量的信号量表示;第三步,在所有进程的临界区前加P操作,临界区后加V操作,在同步关系发生在“前面”的地方加P,在“后面”的地方加V。
以生产者消费者为例:生产者循环生产物品,消费者循环消费物品,两者之间的共享缓冲区需要互斥,这是一个mutex信号量;缓冲区空的时候消费者不能消费,这是empty信号量;缓冲区满的时候生产者不能生产,这是full信号量。按这三步走,PV题的框架就不会乱,剩下的就是套用经典模型。先掌握套路,再去理解为什么,这个顺序对大多数人是最高效的。
7.3 大题做了很多但总是漏步骤,怎么破
408操作系统的大题改卷按步骤给分,所以“过程比结果重要”。很多同学做对了结果,但中间跳过了关键步骤,照样扣分。解决的办法是:在日常练习中按照标准答题格式来写。
什么是标准格式?以地址转换题为例,要分三步写:第一步,写出页大小和页内偏移量位数;第二步,拆解逻辑地址,得到页号和页内偏移;第三步,查页表得物理块号,拼接物理地址,注明是否缺页。每一步都不能省。习惯这种分步写法之后,考场上自然就不会漏步骤了,而且一旦中间算错,前面的步骤还能拿分,不至于整题丢光。
7.4 考前一周操作系统还能做什么
考前一周围绕三件事:回归基础、重看真题、只看导图。回归基础是指把最容易拿分的基础考点再过一遍,比如进程的几种状态名称、各种调度算法的核心思想、虚拟内存的几种实现方式,这些选择题高频考点不能丢。重看真题是指把近五年真题里的操作系统题全部重做一遍,记住正确选项和错误选项的理由。只看导图是指不再做新题、不再看难题,每天快速过一张思维导图,保持知识体系的完整感觉。
这段时间最容易犯的错是陷入偏题怪题,尤其是网上流传的各种“超纲提高题”,现在果断放弃。408统考的风格一直比较稳定,基础扎实比钻牛角尖重要一百倍。
8. 从应付考试到建立操作系统思维
回头看看这份操作系统笔记,熬过一开始的混乱和抽象之后,你会发现自己看问题的角度已经不太一样了。以前写代码时遇到卡顿,你会怀疑是自己的代码问题;复习完操作系统之后,你会下意识去想:这背后是不是进程在频繁切换?是不是内存不够触发换页了?是不是磁盘I/O成为瓶颈了?这种“向下看一层”的视角,我觉得才是学操作系统最大的收获。
如果你正在备考408,或者正在被操作系统这门课折磨,我的建议是:不要急着刷题,先花三天时间把这份笔记配套的思维导图框架过一遍,让自己脑子里有一个完整的“地图”,然后再开始第一轮复习。你会惊讶地发现,后面所有章节的学习速度都比以前快了很多。
最后分享一个我自己觉得特别实用的小技巧:在每天睡前用五分钟闭上眼睛,在脑子里过一遍当天复习的思维导图,从中心节点开始,顺着分支往外走,走到想不起来的节点就停下来,第二天醒来第一件事就是翻笔记看这个节点。这个习惯让我在考场上面对综合大题时,能快速定位到题目考的是哪个知识板块,然后准确调用解题模型,省去了大量回忆和犹豫的时间。