ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

操作系统408复习:进程/内存/文件/I/O计算链路

操作系统408复习:进程/内存/文件/I/O计算链路 操作系统这门课我在不同阶段完整过了三遍大二为了期末、大三为了408、后来读研又陪着学弟学妹复盘了一遍。三次下来最深的体会是它根本不是一门背多分的课。真正拉开差距的是你能不能把进程调度、地址翻译、页面置换、索引结点这几条计算链路闭着眼推出来而不是看到操作系统四个字就先想到一堆名词解释。这份笔记最早是照着王道那套单科书和讲义一句句抄的抄完发现还是不会做题于是索性推翻重写改成骨架层 公式层 题眼层的三层结构先搭知识地图再锁死可手算的公式最后把每道题埋的坑单独标出来。下面这些内容适合三类人——正在准备408的、下周就要考操作系统的、以及想把这门课真正吃透而不是应付考试的人。整篇围绕进程管理、内存管理、文件系统与I/O四条主线展开每条主线都给出可复现的手算套路和我自己踩过的坑能直接拿去对答案的那种。1. 先把考什么钉死操作系统复习无效的三种典型姿势1.1 为什么把书看三遍大题还是写不出来我见过太多人包括曾经的我复习操作系统的方式就是从头读到尾读完再读一遍。这种读法的产物是选择题眼熟得很快一到大题就卡壳。原因不复杂——选择题考的是你认不认识这个词大题考的是你能不能走完一条完整的推理链路。比如分页存储管理选择题只问你页表存什么大题却要你从逻辑地址出发拆页号、查页表、拼物理地址中间还夹一个TLB命中判断和缺页处理。你光知道页表是页号到物理块号的映射这条链路一步都走不动。所以我的第一个建议很直接复习操作系统时凡是能用计算链路串起来的知识点一律不许用阅读的方式过必须动手把链路写一遍。进程调度要写时间轴表格页面置换要画页框快照地址翻译要写二进制拆位文件索引要列求和式。写一次的记忆强度顶得上读五遍。王道那本书的课后大题就是为这个过程准备的不做题等于没学。1.2 408和期末考对同一知识点的权重完全不同这是很多人栽的第二个跟头拿期末考的复习思路去应付408或者反过来。两者重合度大概七成但重心差得很远。我整理了一张对照表复习前先看清自己在准备哪一场。知识点期末考常见权重408常见权重建议策略进程与线程概念、状态转换高中记判定规则即可不必深挖调度算法手算中高必须能画时间轴、算带权周转PV操作与同步互斥高高两类考试都躲不开重点中的重点死锁与银行家算法中高安全性序列必须手推熟练分页/分段地址计算中高多级页表和TLB是高频大题页面置换算法高高缺页率统计要能画表文件索引结点计算低高期末常略过408几乎年年考磁盘调度算法中中会算磁头移动总量就够I/O控制方式对比高中适合做表格记忆提示如果你的目标是期末把表格里期末考权重高而408权重低的行优先吃透如果是408把索引结点、多级页表这两块单独拎出来加练它们是最容易被低估的失分点。1.3 笔记的三层结构骨架层、公式层、题眼层抄书式笔记最大的问题是信息密度均匀每一页看起来都同样重要结果考前一翻全是字抓不住重点。我后来改成了三层骨架层每个章节只写一页纸的框架图用层级缩进列出这一章要解决什么问题、分成哪几块、每块的输出是什么。比如内存管理这一章骨架就四行地址翻译、内存分配、虚拟内存、页面置换。公式层把所有需要代入数字的公式集中在一处写明每个符号的含义和单位。这一层是给你在考场上抄作业用的必须背到条件反射。题眼层记录每类题型的触发词。看到求平均周转时间就自动切到完成时间减到达时间看到主存访问时间就自动分清是否含TLB时间看到最大文件长度就自动切到直接块加各级间接块求和。这三层分开记的好处是考前三天你只需要刷题眼层和公式层考前一天快速扫一遍骨架层效率比从头翻书高一个数量级。2. 进程与线程这条主线状态、调度与谁发起的判定逻辑2.1 五状态转换题的判定口诀看谁主动进程状态转换是选择题的常客也是最容易靠感觉做错的一类。我的判定口诀只有一句判断发起方是进程自己还是操作系统或外部事件。就绪到运行由调度程序发起进程被动。运行到就绪时间片用完或被更高优先级抢占进程被动仍具备运行条件。运行到阻塞进程自己主动发起比如请求I/O、申请资源、等待信号量。阻塞到就绪外部事件完成I/O结束、资源可用、信号量V操作进程被动。阻塞到运行不存在必须经就绪中转。这套口诀的威力在于排除法。题目里只要出现阻塞到运行或者就绪到阻塞直接判错不用犹豫。另一个高频陷阱是运行到阻塞和运行到就绪的区别前者进程失去了CPU并且不再具备运行条件后者进程失去CPU但随时可以被再次调度。这个区别在后面的调度算法和响应时间计算里会反复用到。顺带提一句挂起状态就绪挂起、阻塞挂起属于外存换入换出的范畴判定逻辑和上面一致只是多了是否在内存这一维。看到挂起两个字先问自己它在内存里吗2.2 调度算法的手算模板两种周转时间必须分清楚调度大题的核心只有两个公式周转时间 完成时间 − 到达时间带权周转时间 周转时间 ÷ 服务时间等待时间 周转时间 − 服务时间。这三个量算错一个后面全崩。我一般先把时间轴画成一条横线按顺序标出每个进程的起止时刻再回头填表比直接在脑子里排序稳得多。拿一组数据练手四个进程的到达时间和服务时间如下。进程到达时间服务时间A07B14C21D44先算FCFS先来先服务A在0到7B在7到11C在11到12D在12到16。周转时间依次为7、10、10、12平均9.75带权周转为1、2.5、10、3平均4.125。再算非抢占式SJF短作业优先t0时只有A到达只能先跑At7时B、C、D都已到达选服务时间最短的C1跑7到8接着B和D服务时间同为4按到达先后选B跑8到12最后D跑12到16。周转时间依次为7、11、6、12平均9带权周转为1、2.75、6、3平均3.19。对比一下就很清楚SJF把平均带权周转从4.125压到3.19但代价是长作业D的等待被拖长这就是典型的饿死风险的来源。考试里如果题目问哪种算法对短作业有利答案就是它。HRRN高响应比优先的响应比公式是**等待时间 服务时间÷ 服务时间**也就是 1 等待时间 ÷ 服务时间。它是非抢占式的每次调度前重新算一遍所有就绪进程的响应比选最大的。这个算法的妙处在于兼顾了长作业——等得越久响应比越高不会无限期饿死。时间片轮转RR在纸上推演时最容易乱我的做法是画一个就绪队列时间片用完的进程排到队尾新到达的进程按到达时刻插入队尾然后一格一格推。别图快一次推错就得重来。2.3 上下文切换、系统调用、中断三个概念的边界在哪这三个词在选择题里经常混在一起考但它们的归属层级完全不同。中断是硬件层面的机制分为内中断异常和外中断。内中断由当前执行的指令引起比如除零、缺页、系统调用外中断来自CPU外部比如时钟中断、I/O完成中断。注意一个反直觉的点系统调用本质上是内中断陷阱它并不是外中断。系统调用是用户程序请求操作系统服务的唯一入口。凡是涉及资源分配、I/O、进程控制的操作用户程序都做不了必须通过系统调用陷入内核态。典型的系统调用包括fork、read、write、exec、wait。上下文切换保存的是处理机现场包括程序计数器、寄存器、栈指针等。这里有个高频考点进程切换一定会引起上下文切换但上下文切换不一定意味着进程切换。同一进程内从用户态切到内核态也需要保存和恢复现场但它不改变当前运行的进程。2.4 进程与线程到底共享什么线程是调度的基本单位进程是资源分配的基本单位这句话谁都背过但落到共享什么上就有人含糊。我列个表比死记硬背靠谱。资源同进程内的线程不同进程之间地址空间共享独立全局变量、堆共享独立栈、寄存器、程序计数器各自独立独立打开的文件、信号量共享独立进程ID共享不同一句话记法除了栈、寄存器和PC其他基本都共享。这也是为什么多线程编程里局部变量天然安全、全局变量必须加锁的根本原因——不是语言的规定是内存模型决定的。3. 同步互斥与死锁PV操作从看得懂到写得对3.1 信号量题型的四类模板PV操作是整张卷子里最能体现功力的一类题。我把见过的题目归成四类模板背模板比背题目有效得多。第一类是纯互斥。临界区访问共享变量标准写法是 mutex 初值1进入前 P(mutex)退出后 V(mutex)。注意P和V必须成对且V一定在临界区外面——V放错位置是新手最常犯的错会导致锁没解开或者提前放行。第二类是前后驱同步。题目描述A完成后B才能开始就在A末尾 V(s)、在B开头 P(s)s初值0。多条依赖链就开多个信号量一一对应。第三类是生产者-消费者。标准三信号量写法mutex1互斥访问缓冲区emptyn空槽位数full0已有产品数。生产者的顺序是 P(empty) → P(mutex) → 放入 → V(mutex) → V(full)消费者的顺序是 P(full) → P(mutex) → 取出 → V(mutex) → V(empty)。这里有个铁律资源信号量empty/full必须在互斥信号量mutex之前P反过来写会死锁。原因很简单如果先占住mutex再等empty缓冲区满时生产者抱着锁睡觉消费者永远进不来解这个锁。第四类是读者-写者。核心是加一个计数器 count 记录当前读者数第一个读者进来时给写者上锁最后一个读者离开时解锁。写法是读者侧 P(mutex) → count → 若count1则P(rw) → V(mutex)读完后再 P(mutex) → count−− → 若count0则V(rw) → V(mutex)。写者侧直接 P(rw) … V(rw)。3.2 经典模型怎么改变体题的加工思路考试不会原封不动考经典模型一定加条件。常见改法有三种。第一种是缓冲区容量变化。原来是n个槽位改成1个那就退化成单缓冲empty和full初值分别为1和0。改成无限容量可以直接去掉empty信号量——因为永远有空位不需要等待。第二种是增加同步顺序约束。比如要求必须先取再放同一类操作不能连续超过三次。这类题的解法是引入额外的计数信号量或者状态标记把次数当成一个需要互斥修改的共享变量改完再判断是否需要阻塞。第三种是多类角色加配额。比如最多允许两个读者同时读。这时候除了mutex和rw还要加一个初值为2的读者并发信号量每个读者进出时P/V它一次。这类题的关键是别把数量限制和互斥混为一谈——前者用计数信号量后者用初值1的信号量。我自己的做法是拿到题先把所有角色列出来标出哪些是资源的消耗者、哪些是资源的生产者、哪些之间是互斥关系、哪些之间是先后关系画成一张小图再逐个映射到信号量。这比直接上手写代码快得多。3.3 死锁判定与银行家算法的手算流程死锁的四个必要条件是互斥、不可剥夺、请求并保持、循环等待。注意它们是必要条件不是充分条件所以选项中如果出现满足这四个条件就一定死锁那是错的。破坏其中任意一个就能预防死锁破坏请求并保持用资源预分配破坏不可剥夺用强制回收破坏循环等待用资源有序分配。银行家算法的步骤是固定的照着走不会错算 Need 矩阵Need Max − Allocation。把 Available 作为初始 Work把所有进程的 Finish 置为 false。在未完成的进程里找一个 Need 小于等于 Work 的分配给它执行完回收资源Work AllocationFinish 置 true。重复第3步直到所有进程完成存在安全序列或者找不到可满足的进程处于不安全状态。举个简单的例子三个进程P0、P1、P2Available [3, 3, 2]Need 分别是 [7,4,3]、[1,2,2]、[6,0,0]。先看P1Need [1,2,2] ≤ [3,3,2]满足P1执行完回收 Allocation [2,0,0]Work 变成 [5,3,2]。再看P2Need [6,0,0] 不满足看P0Need [7,4,3] 也不满足。于是再找——这一轮P2和P0都过不去说明当前Work下没有可执行进程当前状态不安全。这就是一个典型的第一轮能找到、第二轮卡住的陷阱。注意安全性算法里找的是Need ≤ Work的进程方向和大小关系千万别写反很多人在这里丢分。另外安全序列可能不唯一题里只要写出一个就行。3.4 我在PV操作上踩过的三个坑第一个坑是信号量初值给错。初值代表一开始有多少个可用资源互斥信号量永远是1同步信号量要看题目描述的状态。我曾经把 empty 的初值写成0、full 写成n结果整道大题的生产者和消费者操作全部反了后续计算连锁崩盘。现在我养成一个习惯写完初值先自查一遍——系统初始时刻缓冲区是空的、可以放n个那 empty 就该是n。第二个坑是P/V顺序颠倒。前面说的资源信号量先于互斥信号量这条铁律我至少栽过两次。后来我在草稿纸上写的时候会强行按先资源、后互斥先V互斥、后V资源的口诀排一遍基本不会再错。第三个坑是忘了互斥保护计数器。读者-写者模型里的 count 是共享变量多个读者同时进来修改它必须加锁很多人只记得给写者上 rw 锁忘了 count 自己的 mutex导致两个读者同时判断 count1这种经典错误。4. 内存管理从地址翻译到页面置换的完整计算链4.1 地址翻译的统一公式与位运算技巧分页存储的地址翻译所有题目都可以用同一套流程解决页面大小为 L逻辑地址为 A页号 P A ÷ L整除页内偏移 W A mod L查页表得到物理块号 b物理地址 b × L W。关键在于当 L 是2的整数次幂时除法取余全部退化成位运算页号就是地址的高位偏移就是低 log₂L 位。页面大小4KB即2¹²那么偏移占低12位页号是剩下的高位。举个具体的例子。32位地址、页面4KB、逻辑地址 0x00002F3A。低12位是偏移0xF3A 3898高20位是页号0x2 2。查页表第2项假设对应的物理块号是5物理地址就是 5 × 4096 3898 20480 3898 24378换成十六进制是 0x5F3A。你会发现物理地址就是把页号部分替换成物理块号低12位原封不动。分段存储的逻辑不同段号加段内偏移段表里存的是段基址和段长。这里必须做越界检查——偏移量大于段长就产生越界中断。段页式则是先查段表得到页表首址再查页表得到物理块号两次查表访问内存次数增加两次。4.2 多级页表页目录项的偏移怎么算单级页表最大的问题是连续存储32位地址空间、页面4KB页表项4B那页表本身就占 2²⁰ × 4B 4MB而且必须连续。多级页表就是为了解决这个问题。拆位方法很机械。32位地址、页面4KB偏移占12位剩下20位是页号。如果用两级页表每级10位一级页号页目录索引10位二级页号10位页内偏移12位。一级页目录有 2¹⁰ 1024 项每个二级页表也有1024项都正好占一页1024 × 4B 4KB完美对齐。多级页表的核心优势是按需分配一级页目录必须常驻但二级页表只在用到时才创建。一个进程如果只用了很少的虚拟地址空间二级页表可能只有一两张占用远小于4MB。同时每个页表刚好一页大小不存在必须连续分配大块内存的问题。三级、四级页表的拆位方法完全相同只是把页号位数继续均分。做题时先算总页号位数再看题目给几级除一下就是每级位数。这里有个小陷阱如果页号位数除不尽多出来的位要放在最靠近页内偏移的那一级也就是低位的页表级。这个细节在真题里出现过按从低位往高位分的思路就不会错。4.3 TLB与有效访问时间TLB快表是页表项的高速缓存。带TLB的访问时间计算有一个基本模型设TLB访问时间为 t内存访问时间为 mTLB命中率为 p。命中时访问TLB得到物理块号再访问一次内存取数据时间 t m。未命中时访问TLB未命中 访问内存中的页表 访问内存取数据时间 t m m t 2m。平均有效访问时间 EAT p × (t m) (1 − p) × (t 2m)。如果题目说TLB访问时间忽略不计那就直接套 m (1−p) × m。这里最容易错的是是否需要额外访问内存查页表——只有未命中时才需要命中时不用。我见过不少人把两种情况都算成 t 2m结果整题失分。如果题目里还有缺页的情形那就再多一层缺页时需要从磁盘调入页面时间要加到整个链路上同时别忘了缺页处理完还要重新执行一次指令。这类题的公式会长一点但思路一致把每条路径的概率乘时间加起来。4.4 页面置换算法与缺页率统计表页面置换的核心是物理块不够时淘汰谁。三种主流算法要能手工推演OPT最佳置换淘汰未来最长时间不再使用的页面。考试里只有它需要看未来用来算理论下界。FIFO先进先出淘汰在内存中驻留最久的页面。实现简单但存在 Belady 异常——分配的物理块数增加缺页次数反而可能上升。这是唯一会有这种异常的算法是选择题的高频考点。LRU最近最久未使用淘汰最长时间未被访问的页面用栈或者访存时间戳实现性能接近OPT但开销大。经典例题页面访问串为 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1物理块数为3。用OPT缺页9次LRU缺页12次FIFO缺页15次。这三个数字建议直接记下来考场上用来校验自己的推演结果——如果你算FIFO只缺了10次那一定是某一格淘汰对象挑错了。做这类题我有一个固定的表格模板横着写访问序列竖着写物理块的编号每一格填当前块里的页面号换页时把被淘汰的页面划掉并标一个记号。必须用笔写不许在脑子里推因为一旦超过十步人脑的短期记忆一定出错。CLOCK算法和改进型CLOCK二次机会的推演规则也比较常考每个页面配一个访问位指针顺时针扫描遇到访问位为1就清零并跳过遇到0就淘汰。改进型还要看修改位——优先淘汰访问位0、修改位0的页面因为修改过的页面换出时需要写回磁盘代价更高。4.5 几个反直觉的结论虚拟内存这块有几个结论第一遍学的时候会觉得违反直觉考试偏偏爱考。第一虚拟内存的容量不受物理内存和地址位数限制而是受CPU寻址范围限制。32位机器的虚拟地址空间上限就是4GB物理内存装多少都不影响这个上限。第二程序不需要全部装入内存就能运行这是虚拟内存的局部性原理决定的。时间局部性指刚访问过的数据很可能马上再被访问空间局部性指访问了某个地址附近的地址很可能被访问。第三抖动颠簸是多给点内存解决不了的。抖动指的是页面频繁换入换出CPU大量时间花在换页上。根源是多道程序度过高、每个进程分到的物理块太少。解决办法是引入工作集模型根据程序近期的访问集合动态分配物理块必要时降低多道程序度。第四页表项里同时存了有效位和访问位有效位标记该页是否在内存中这直接对应缺页中断的判断。缺页中断属于内中断且它发生在指令执行过程中处理完要重新执行该指令——不是从下一条开始。5. 文件系统与I/O选择题密度最高、最容易被跳过的一章5.1 索引结点与文件最大长度的求和套路这一块是408的高频计算题。题目一般这样给物理块大小为4KB每个地址项占4B索引结点采用混合索引包含10个直接地址项、1个一级间接、1个二级间接、1个三级间接求文件最大长度。第一步先算一个索引块能装多少地址项4KB ÷ 4B 1024 项。然后逐层求和层级计算式容量10个直接地址项10 × 4KB40KB1个一级间接1024 × 4KB4MB1个二级间接1024 × 1024 × 4KB4GB1个三级间接1024³ × 4KB4TB合计—约 40KB 4MB 4GB 4TB这套数字几乎每年都会以某种形式出现记住4KB、4B、1024、40KB、4MB、4GB、4TB这条链考场上现推也就一分钟。还有一个变体问法访问文件某个位置的数据需要读几次磁盘。原则是看这个位置落在哪个区间落在直接地址范围内读一次索引结点如果已在内存则不需要 读一次数据块落在一级间接范围需要先读一级索引块再读数据块。这类题的坑在于索引结点是否已在内存题目一般会说明没说明就按最坏情况算。5.2 磁盘访问时间与调度算法磁盘访问时间由三部分组成寻道时间磁头移动到目标磁道所需时间是最主要的部分。旋转延迟目标扇区转到磁头下方所需时间平均值为半个旋转周期。传输时间读写数据本身的时间通常可以忽略。转速换算要熟练。7200转/分一圈用时 60 ÷ 7200 8.33ms平均旋转延迟 8.33 ÷ 2 ≈ 4.17ms。如果题目给的是15000转/分一圈就是4ms平均旋转延迟2ms。这个换算常年出现在选择题里。磁盘调度算法和它们的磁头移动总量用经典例题过一遍最有效。设磁头初始在100号磁道请求序列为 55, 58, 39, 18, 90, 160, 150, 38, 184。FCFS按请求先后顺序走移动量 4531921727010112146 498。SSTF最短寻道优先100→90→58→55→39→38→18→150→160→184移动量 10323161201321024 248。SCAN电梯算法先向大100→150→160→184然后掉头到90→58→55→39→38→18移动量 5010249432316120 250。CSCAN循环扫描100→184 后直接回到最小请求18再往大扫移动量 50102416620116332 322。SSTF的移动量最小但它有饥饿问题热点区域的请求会一直插队。SCAN和CSCAN都避免了饥饿SCAN的移动量略大于SSTFCSCAN因为多了空扫回程所以更大。做题时一定要先看清磁头当前移动方向方向反了整题答案就全错。5.3 缓冲与I/O控制方式用一张表解决I/O控制方式从低级到高级依次是程序直接控制、中断驱动、DMA、通道。它们解决的核心问题都是如何减少CPU在I/O上的开销。方式数据单位CPU干预频率特点程序直接控制字字节极高全程轮询CPU与设备串行工作中断驱动字字节高每字一次中断CPU与设备可并行但中断频繁DMA块低每块一次中断数据直接进内存不经CPU通道一组块极低通道是独立处理机执行通道程序其中DMA和中断驱动的区别是高频考点DMA以数据块为单位中断驱动以字节为单位DMA在传输过程中不需要CPU干预只在开始和结束时需要。另外DMA请求的是总线使用权不经过CPU的地址空间转换所以不需要保存现场。缓冲区的计算也是常客。设从磁盘读入一个块到缓冲区的时间为T从缓冲区送到用户区的时间为MCPU处理一块数据的时间为C。单缓冲每处理一块的平均时间 max(T, C) M。因为缓冲区只有一块输入和传送会互相等待。双缓冲每处理一块的平均时间 max(T, C M)。两块缓冲区交替使用读入下一块的同时处理当前块。判断用哪个公式的窍门是看谁先被卡住单缓冲时输入和CPU处理争同一块缓冲区所以先取二者较大者再加传送时间双缓冲时输入可以和处理并行所以比的是输入时间和处理加传送。5.4 位示图与空闲空间管理空闲空间管理有四种方式空闲表、空闲链表、位示图、成组链接。其中位示图的计算最容易出题。位示图的规则每一位对应一个磁盘块0表示空闲1表示已分配具体0/1的含义题目会说明看反了整题就废了。给定块号和字长求它在第几个字的第几位字序号从0开始 块号 ÷ 字长取整数部分位序号从0开始 块号 mod 字长。如果题目要求字号从1开始编号那字序号要再加1位号一般仍从0开始。这个从0还是从1的细节每年都有人错读题时务必圈出来。反过来也一样常考已知位示图里第3个字从1开始编号的第4位从0开始编号被占用求它对应的块号。这时块号 (3−1) × 字长 4。两个方向都要练熟。6. 笔记怎么做、错题怎么回填我的复盘节奏6.1 概念表和计算表必须分开我最早的笔记是流水账概念和公式混在一起结果复习时要么全看要么全跳。后来我拆成两份一份是概念表只放是什么、为什么、怎么区分这类文字型知识点比如分页和分段的区别进程和线程的区别内部碎片和外部碎片的区别全部整理成三列表格另一份是计算表只放公式、符号含义、单位、典型例题的解题步骤。概念表适合碎片时间翻吃饭排队的时候看两眼就能记住一组对比计算表适合坐下来动手推必须配草稿纸。两者混着看效率反而低——看文字的时候脑子会自动跳过公式看公式的时候又不想读定义最后两边都没吃透。6.2 错题回填的时机比错题本身更重要我的错误做法是当场抄一遍错题抄完就再也没看过。正确的做法是分两次回填第一次在当天只写错在哪一步不抄完整题干目的是趁热定位问题第二次在一周后重做一遍这道题如果还是错再补一句为什么会重复错。第二次回填的那句话往往才是真正的收获。比如我有一道银行家算法的题错了三次第三次我才发现问题不在算法本身而是我在计算 Available 时漏掉了某个进程释放的资源。那之后我给自己加了一条自检规则每完成一个进程必须立刻把它的 Allocation 加回 Work并且把这个动作写在算式旁边。加上这条规则之后同类题再没错过。6.3 考前一周只看三样东西距离考试还有一周的时候我把复习范围压缩成三样第一是所有计算公式的清单。地址翻译、EAT、带权周转、索引结点容量、磁盘移动量、单双缓冲时间、位示图换算大概十来条一张A4纸写得下每天默写一遍。第二是PV操作的四类模板。默写生产者-消费者和读者-写者的完整代码检查信号量初值、P/V顺序、计数器加锁这三处。第三是错题回填的第二句话。那些我自己总结的自检规则比如资源信号量先P索引结点先看是否在内存磁头方向先确认一共二十来条考前一晚扫一遍。这三样东西加起来不到五页纸但它们覆盖了我所有丢过分的地方。相比之下重新翻一遍王道那本厚书反而会制造焦虑——很多内容是选择题的边角料考前突击性价比极低。最后分享一个我自己用着很顺手的小习惯给每道大题标一个链路名。比如做完一道地址翻译题就在旁边写逻辑地址→拆位→查表→拼物理地址做完一道页面置换题就写访问串→逐格推演→统计缺页。标完之后再回来复习看到链路名就能瞬间回忆起整道题的走法比看题干快得多。操作系统这门课真正难的地方从来不是知识点多而是链路长——把每一条链路的名字记住就等于把整本书压缩成了十几行字。
返回列表