多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

操作系统期末复习指南:考点版图、经典算法大题与避坑思路

操作系统期末复习指南:考点版图、经典算法大题与避坑思路 考完操作系统从考场出来那会儿脑子里其实有点乱。倒不是题难到做不完而是这门课跟你平时敲代码、看PPT完全是两回事。回到宿舍我把能回忆起来的题型、考点和考试时卡住的地方都记了下来又对着自己复习时踩过的坑重新捋了一遍整理成这篇“回忆版”。如果你也在准备操作系统期末考试或者正好是山东大学软件学院在读这篇内容应该能让你少绕不少弯子。我不敢说涵盖全部原题但考什么、怎么考、哪里容易白复习基本都说清楚了。1. 考完才看明白的考点版图题型、分值分布与命题偏好很多人复习操作系统第一反应是把教材从头翻到尾再把PPT抄一遍。但我考完回头看这其实是效率最低的方式。操作系统期末考的不是“你有没有看过书”而是“你能不能拿概念做判断、拿算法做计算”。一张卷子下来真正决定分数差距的往往就集中在几个固定题型上。从我这届以及学长学姐口里流传的历届情况来看期末一般以闭卷笔试为主题型大致包含以下五类题型大致题量分值估计考察重点选择题10题左右20分概念辨析、状态转换、调度算法比较判断题10题左右10分细节论断喜欢在术语上挖坑填空题10空左右10分关键术语、参数、简单推导结果简答题3题左右30分原理说明、对比分析、名词解释综合应用题4题左右30分PV操作、银行家算法、页面置换、磁盘调度或文件系统计算注意这只是一个大致分布每个老师出题风格多少会有出入。真正值得关注的是后面的综合应用题它们往往是拉分项一道大题不会可能就是七八分甚至十几分的差距。而从章节重要性来看进程管理含调度、同步、死锁能占到三成以上内存管理、虚拟内存再占二到三成文件管理、设备管理、IO管理加一起大概两三成剩下的概述、操作系统接口、启动流程等相对零碎。命题偏好这块我印象最深的是选择题和判断题特别喜欢“场景化”。比如给出一段进程状态变化描述让你选它是从“就绪”进入了“运行”还是进入了“阻塞”再比如判断题里说“临界区是进程中访问临界资源的代码段”实际上“进入区、临界区、退出区、剩余区”这四个概念很容易被偷换。这些题靠死记硬背不一定能拿分但如果平时把概念之间“谁是谁的前提、谁触发谁的切换”这类关系理清了做起来会很快。所以复习的第一步不是逐章抄书而是先把这张“考点版图”刻在脑子里知道哪些是大头哪些是边角料时间怎么分配心里才有数。2. 进程与线程这块为什么刷题比背书管用2.1 状态转换、PCB和原语的常见考法进程管理是操作系统的灵魂也是期末的绝对重点。选择题和填空题里最常出现的几个点大概是这样进程的三态模型就绪、运行、阻塞和五态模型新建、就绪、运行、阻塞、终止之间的转换。特别喜欢考“进程从运行态到阻塞态是主动的进程自己申请IO或等待资源而从运行态到就绪态是被动的时间片用完或被高优先级抢占”。PCB进程控制块是进程存在的唯一标志。这个话听着像废话但填空就爱考。操作系统通过PCB链表管理进程进程切换的实质也是切换PCB上下文。原语是不可被中断的操作比如创建、撤销、阻塞、唤醒、切换。判断题里可能会写成“原语可以被中断”显然错。至于进程和线程的区别一定要把“资源分配单位”和“CPU调度单位”这两个关键词记牢。同一进程内的线程共享地址空间、文件描述符、全局数据但各自拥有独立的栈、寄存器和程序计数器。很多同学只背了“线程是调度的基本单位”却忽略了大题或简答里“线程共享什么、不共享什么”的细节结果白白丢分。顺带提一个热搜里频繁出现的词协程。现在的教材和题目偶尔会把协程拉进来和线程对比。协程和线程最大的区别在于线程的调度由内核负责协程的切换由用户态程序自己控制。所以判断题如果写“协程由操作系统内核调度”那是错的。协程更轻量切换开销更小但得靠程序员自己写好调度逻辑。2.2 信号量与PV操作先把流程画明白同步互斥这块大题基本就是给你一个经典场景让你写信号量和PV操作。有些同学喜欢背代码但我劝你千万别这么干。考试题目稍微改一下条件背的代码就全废了。正确的方法是把进程协作的逻辑用图或表格画出来再Translate成信号量操作。生产者和消费者是最经典的模型。假设缓冲区大小为n三个信号量// 生产者-消费者伪代码类C仅用于理解流程 semaphore mutex 1; // 缓冲池互斥 semaphore empty n; // 空闲缓冲区数量 semaphore full 0; // 已填充缓冲区数量 // 生产者 while (true) { produce an item; P(empty); // 申请一个空闲缓冲区 P(mutex); // 进入临界区 buffer[in] item; in (in 1) % n; V(mutex); // 退出临界区 V(full); // 产品数加一 } // 消费者 while (true) { P(full); // 申请一个非空缓冲区 P(mutex); item buffer[out]; out (out 1) % n; V(mutex); V(empty); // 空闲缓冲区加一 consume item; }这里最关键的是一个顺序细节为什么每个进程都是先P资源信号量、再P互斥信号量你可以这么想P操作本身是在申请资源如果生产者在缓冲区满的时候先把mutex抢到手再去等empty那消费者想进入临界区取产品时就会因为拿不到mutex而卡住最终两边互相等待变成死锁。先P资源信号量、后P互斥信号量是最稳妥的写法考试就这么写别发挥。读者-写者问题也常考。读优先的解法核心是“第一个读者负责加锁最后一个读者负责解锁”。也就是说需要设置一个readcount变量来记录当前有几个读者在临界区再用一个mutex保护readcount本身的修改。写者就比较惨必须等所有读者都离开才能进入临界区。如果题目还要求“写者优先”那还得再加信号量逻辑更绕但本质还是“排队”。哲学家进餐这个地方很多教材把它当思考题。直接先拿左边筷子再拿右边筷子五个哲学家同时拿左筷就会全部等右筷死锁。常见的解法有三种一是限制最多只有四个哲学家同时拿起筷子二是让奇数号哲学家先拿左筷、偶数号先拿右筷三是用mutex把“拿两只筷子”的动作包成临界区。考试如果出简答能说清这三种思路基本就拿到分了。2.3 管程别只会背名字管程这几年被提得越来越多因为它比裸信号量好用。管程就是把共享资源和对它的操作封装在一个模块里进程只能通过管程提供的入口函数访问资源不能在外面直接操作共享变量。管程内部用条件变量来实现等待和唤醒condition.wait()会让当前进程休眠condition.signal()会唤醒一个等待该条件的进程。期末如果考“为什么引入管程”答案思路很清晰信号量机制使用不当容易造成死锁或同步错误而管程把同步操作封装起来降低了程序员写出并发bug的概率。同时管程还解决了“忘记V操作”的问题——因为出口函数自动完成释放。这块适合用一个对比表来复习特性信号量管程同步操作P/V分散在各进程中内部统一封装数据处理数据和信号量分离数据和操作封装在一起出错风险忘记P/V会出问题结构上不容易漏编程复杂度高相对低2.4 我做题时的笨办法一个对我特别有效的训练方法把每个经典同步问题手画成“资源计数表等待队列”。比如生产者消费者我在纸上画三个格子一格写empty当前值一格写full当前值一格写mutex当前值然后模拟每一次P和V把数字一步步改下去。刚开始很慢但练个三五道题之后P操作会让哪个资源减一、哪个进程可能阻塞基本就是肌肉记忆了。考试考到PV大题写起来又快又稳。常见失分点我再强调一遍信号量初始值搞错mutex一定是1empty是nfull是0P和V的配对写反生产者消费者里“V(full)”写成“V(empty)”。这些错误都属于“平时都会考场上粗心”的类型平时做题就养成检查的习惯能少踩很多坑。3. 调度、死锁与银行家算法把算法题按步骤拆开算3.1 各种调度算法的比较题要学会横向看调度算法的选择题和简答考得很勤核心是几个主流算法各自的优缺点。我整理了一个复习表基本够用算法是否抢占优点缺点典型场景FCFS非抢占实现简单公平平均等待时间长有护航效应批处理SJF可抢占或非抢占平均等待时间最短需要预知运行时间长任务可能饥饿批处理优先级调度可抢占能按紧急程度处理低优先级可能饥饿实时系统时间片轮转抢占响应快适合交互时间片大小影响整体性能分时系统多级反馈队列抢占兼顾响应与吞吐参数难调现代通用OS这类题常给一组进程的到达时间和服务时间让你计算平均等待时间和平均周转时间。我的建议是别急着算数先画甘特图。把时间轴一条条画出来再根据公式算等待时间开始执行时间-到达时间、周转时间完成时间-到达时间。画图虽然稍慢但能避免“对进程顺序理解错”这种低级失误。顺便提醒SJF有两种非抢占式和抢占式也叫SRTF。如果题目没说明默认是非抢占还是抢占需要看老师PPT上的习惯。我在复习时专门把这个“默认值”问过同学最后按教材默认来处理。不同教材可能略有出入考前最好确认一下。3.2 死锁四个条件做题前先背牢死锁这章四个必要条件是必背内容互斥、持有并等待、不可抢占、循环等待。我用口诀“互请不剥环”来记你如果有自己的口诀也行反正这四个词得能一字不差地写出来。死锁的三种处理策略也是高频简答题预防是“破坏四个必要条件之一”避免是“在资源分配前判断是否安全”代表就是银行家算法检测与解除是“允许死锁发生通过资源分配图或定期检测发现然后撤销进程或回滚”。注意区别预防是静态的避免是动态的检测是事后处理。资源分配图中有一个常见误解有环不代表一定死锁。比如两个进程同时持有一部分资源、又等待对方持有的资源这才是死锁如果环里某类资源还有多余空闲等待是可以被满足的那就未必死锁。这个点在判断题里出现过得提前心里有数。3.3 银行家算法完整手算一遍银行家算法是期末大题的常客也是很多同学丢分最惨的地方。其实它步骤很固定关键是把流程理解透。给一个我练过的典型例子大家对照着走一遍就明白了。假设系统中有5个进程P0到P43类资源A、B、C已知进程Allocation已分配Max最大需求Need还需P0(0, 1, 0)(7, 5, 3)(7, 4, 3)P1(2, 0, 0)(3, 2, 2)(1, 2, 2)P2(3, 0, 2)(9, 0, 2)(6, 0, 0)P3(2, 1, 1)(2, 2, 2)(0, 1, 1)P4(0, 0, 2)(4, 3, 3)(4, 3, 1)Available初始为(3, 3, 2)。Need的计算是最容易出错的一步Need Max - Allocation。P0的Need就是(7,5,3)-(0,1,0)(7,4,3)。把这个矩阵先算好后面才不会乱。安全性检查过程如下令Work Available (3, 3, 2)。找第一个Need不大于Work的进程。P1的Need是(1,2,2)小于(3,3,2)可以执行。假设P1运行完释放它占用的(2,0,0)Work (3,3,2)(2,0,0)(5,3,2)。继续找P3的Need是(0,1,1)不大于(5,3,2)执行并释放Work (5,3,2)(2,1,1)(7,4,3)。P4的Need是(4,3,1)不大于(7,4,3)执行并释放Work (7,4,3)(0,0,2)(7,4,5)。P2的Need是(6,0,0)不大于(7,4,5)执行并释放Work (7,4,5)(3,0,2)(10,4,7)。P0的Need是(7,4,3)不大于(10,4,7)执行并释放Work (10,4,7)(0,1,0)(10,5,7)。安全序列可以是 P1 → P3 → P4 → P2 → P0P3和P4的顺序在第三步时两者都可选所以答案不唯一。如果题目进一步问“某个进程发出请求Request能否立即分配”比如P2请求(1,0,0)那就三步走检查Request(1,0,0)是否≤Need(6,0,0)是。检查Request(1,0,0)是否≤Available(3,3,2)是。试分配Available变成(2,3,2)P2的Allocation变成(4,0,2)Need变成(5,0,0)再做安全性检查。如果能找到安全序列就可以分配找不到就不分配。这个试分配环节是很多人漏掉的。题目会说“若安全则分配”你得把试分配后的状态写出来再继续算别直接凭感觉说“available够就给”。3.4 银行家算法容易错在哪我在复习后期做过一个错题统计发现自己最容易犯三个错误Need矩阵算错把Max当成Need直接用。解决办法先单独列一个Need表逐行检查。Work更新加错把Work Work Allocation写成Work Work Need。记住进程执行完释放的是它已经占用的Allocation不是它需要的Need。安全序列中途发现后面某个进程Need Work就说“不安全”。这是最冤的。一次失败可能只是顺序问题你要退回上一步重新尝试其他未完成进程而不是直接判定不安全。提示银行家算法考察的是“判断当前状态是否安全”并不是算一遍就结束。只要还有进程没执行就继续尝试找不到任何可执行的进程才说明状态不安全。4. 内存管理和页面置换手算一遍胜过背十遍定义4.1 逻辑地址到物理地址的转换核心是“除法和查表”地址转换是大题小算的常客这类题只要你分三步走基本不会错计算页号逻辑地址 ÷ 页面大小整数商就是页号。计算页内偏移逻辑地址 % 页面大小余数就是页内偏移。查页表得到该页对应的物理帧号物理地址 帧号 × 页面大小 页内偏移。举个数页面大小4KB逻辑地址65000页号是65000÷409615余数是3560。如果页表中第15页对应帧号20那物理地址就是20×4096356085480。这个模块还要弄清分页和分段的区别。分页是固定大小、用户不可见、易产生页内碎片分段是逻辑单位、用户可见、段长可变、可能有外部碎片。简答题考“分页和分段的区别”时只要把“大小/可见性/碎片/地址维数”这几个维度各写一句再举个例就足够拿分了。4.2 页面置换算法把三个经典算法手算熟页面置换是期末大题的“压轴常客”通常给你一个引用串和若干个物理块让你分别算FIFO、LRU、OPT的缺页次数。我用的经典例题是引用串7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1物理块数3。三种算法的缺页标记对比如下F表示缺页.表示命中引用70120304230321201701FIFOFFFF.FFFFFF..FF..FFFLRUFFFF.F.FFFF..F.F.F..OPTFFFF.F.F..F..F...F..从表里能看出FIFO缺页15次LRU缺页12次OPT缺页9次。OPT是理论最优实际系统实现不了因为它需要预知未来的访问序列。考试里让你算OPT只是为了给其它算法提供一个“理想下限”。判断你算得对不对有个小技巧如果缺页次数比引用串长度还多那肯定算错了如果LRU比FIFO缺页还多也要回头检查虽然LRU不一定永远最优但在这个经典例子里它应该优于FIFO。Clock算法时钟置换也值得看一下它是LRU的简化近似。每个页表项维护一个使用位发生缺页时从头扫描遇到使用位为0的页就替换遇到使用位为1的页改为0并跳过。这个算法在选择题里出现频率不低至少要知道它的基本思想是“循环扫描使用位”。4.3 工作集和抖动内存部分的理论题热点这部分概念多简答题容易中招。工作集是进程在一段时间内频繁访问的页面集合。如果系统分配给进程的物理块数量小于工作集大小进程就会不断缺页CPU利用率下降系统忙于换页这就是抖动thrashing。解决办法主要靠三条路调整工作集模型让进程有足够页框、控制多道程序度、采用局部置换策略避免进程之间互相抢页。如果考选择记住“抖动是因为页框不足不是CPU运算能力不够”就行。4.4 内存部分最容易丢分的细节快表TLB的作用是加速地址转换命中时一次访存不命中时需要查内存页表再访问目标数据可能两次以上。页表项里的“有效位/存在位”表示该页是否在内存中如果不在则触发缺页中断。“页面越大页表越小但页内碎片增加页面越小页表占用增大缺页可能更频繁”。判断题经常把前后因果关系倒置。我在复习时发现地址转换题失分往往不是因为不会除而是页号和帧号搞混页号是逻辑地址里查出来的帧号是页表里映射出来的物理地址里的主体是帧号。做题时把“页号”和“帧号”两个词标出来能避免不少低级错误。5. 文件系统、磁盘调度和I/O分值不高但绝不能丢的细节分5.1 文件物理结构连续、链接、索引文件管理这块大题最常见的形态是inode计算题选择题则喜欢考三种分配方式的优缺点对比。连续分配实现简单顺序访问快但产生外部碎片文件扩展困难。链接分配隐式链接/FAT没有外部碎片扩展方便但只能从链表头顺序访问指针还要占空间。索引分配每个文件一个索引块索引块里记录它占用的所有数据块号支持随机访问。Unix/Linux的文件系统就是典型代表。如果一个文件记录在FAT表里那么要读文件某一块通常要顺着FAT链从头找所以FAT文件系统随机访问慢而索引分配只需要查索引块就能直接找到目标数据块所以随机访问很快。5.2 inode计算题记住“每个索引块能存多少个地址”inode索引节点计算题几乎是文件系统大题的“标配”但它不难关键是把“一层层索引”想成“一层层指针”。假设磁盘块大小为1KB磁盘块地址用4字节表示那么一个索引块能存放的地址数为1KB ÷ 4B 256个。再假设一个inode里有10个直接索引块指针、1个一级间接索引、1个二级间接索引、1个三级间接索引那么索引层级可指向数据块数可表示的最大文件范围10个直接块1010KB一级间接256256KB二级间接256×2566553664MB三级间接256³ 1677721616GB因此该文件系统支持的最大单个文件大小约为 10KB 256KB 64MB 16GB ≈ 16.07GB。计算时别把直接索引的“10个块”漏加也别把一二级索引的范围算成“256KB256KB”。如果题目问“访问文件某个偏移处的数据需要几次磁盘访问”思路是先判断这个偏移落在直接索引范围、一级、二级还是三级间接然后“索引块访问次数1次数据块访问”。比如访问二级间接覆盖范围内的数据块最多需要读二级索引块、一级索引块再读数据块共3次磁盘访问。5.3 磁盘调度访问顺序和总寻道长度怎么算磁盘调度的大题套路非常固定给你一个磁道请求队列和一个当前磁头位置让你求不同算法下的服务顺序和总寻道长度。常用例请求队列为98, 183, 37, 122, 14, 124, 65, 67磁头当前在53。FCFS先来先服务按队列原顺序访问总寻道距离 |53-98| |98-183| |183-37| |37-122| |122-14| |14-124| |124-65| |65-67| 640。SSTF最短寻道时间优先每次都去最近的磁道访问顺序是 65, 67, 37, 14, 98, 122, 124, 183总距离 12230238424259 236。SCAN电梯算法先朝一个方向走走到最内或边界再掉头。假设当前朝磁道号减小方向访问顺序为 37, 14, 0, 65, 67, 98, 122, 124, 183总距离 1623146523124259236。注意SCAN算法在不同教材里对“是否需要到达最外/最内磁道才回头”有不同的约定。有些题目规定到达当前方向最远请求就回头有些规定必须到端点。考前看老师PPT哪个约定考场上按那个做否则答案可能差出几十。SSTF虽然平均寻道距离短但可能造成“磁臂粘着”——远处磁道请求一直被新到的近处请求插队导致饥饿。而SCAN对这个问题的缓解要好一些。5.4 I/O控制方式和缓冲设备管理部分选择题居多重点有这么几个I/O控制方式演进程序直接控制轮询→ 中断驱动 → DMA → 通道。中断驱动的问题是每个字节都要CPU中断一次DMA则是一次传输整块数据传输期间CPU可以干别的事。DMA在传输前CPU要设置缓冲区、大小、方向传输中DMA控制器自己搬数据传输完成后发出中断通知CPU。这个过程经常被考成“谁负责数据搬运”。缓冲技术单缓冲、双缓冲、循环缓冲、缓冲池。双缓冲可以让设备输入和CPU处理并行起来解决“CPU先等数据还是数据等CPU”的问题。SPOOLing技术把打印机这类独占设备改造成“看起来可同时使用”的共享设备原理是在磁盘上设置输入井和输出井配合假脱机进程。常见判断题陷阱是“SPOOLing只能用于打印设备”其实思路通用只不过打印机是典型例子。这部分理论性不强分值占比不高但胜在好拿分。复习时把每个技术到底解决什么问题捋清楚选择题基本不会失手。6. 复习节奏与考场答题给下一届的实操建议6.1 资料怎么选优先顺序很重要我复习时手头有好几份资料课堂PPT、指定教材不同老师可能有不同版本很多是汤小丹那本《计算机操作系统》或者类似教材、实验课的代码和实验报告、往年题、考研用的王道复习书。一开始我什么都想看结果什么都是浅尝辄止。后来把优先级理成一条线课堂PPT老师的命题风格和重点基本都在PPT里先把PPT上所有能出题的小结论过一遍。教材对应章节遇到PPT上没讲清的概念回教材看原理解释而不是自己脑补。实验代码和报告操作系统实验哪怕只是Linux下的pthread练习能帮你把抽象概念落地。见过真实线程再来看信号量感觉完全不一样。往年考研真题如408里面进程管理、内存管理的大题质量很高适合当练习册。王道这类辅助书只做其中选择和算法题别陷进去做偏题怪题。期末考的广度和考研不完全一样用王道当“补充题库”可以当“主教材”就过度了。6.2 三轮复习怎么安排我实际操作下来效果最好的节奏是三轮第一轮考前2-3周把知识点全部过一遍重点不是背而是把六个“必考计算”练熟分别是PV操作、银行家算法、页面置换算法、磁盘调度算法、inode计算、地址转换。每个类型至少刷3道题错题标记出来。第二轮考前1周做套卷或做往年题限时进行做完后把错题和易混点整理到一页纸上。这页纸就是你最后冲刺的“保命提纲”。第三轮考前1天不再做新题只看这一页纸、PPT里的定义性内容和错题。把判断题爱考的“陷阱词”反复过几遍。如果你平时基础一般建议第一轮启动时间再往前挪一周。因为PV操作和银行家算法这类题不是看一遍就会需要一定的“手感”练早了才能形成肌肉记忆。6.3 把你身边真实系统当“记忆钩子”我看到大家搜的热词里有不少Linux、国产操作系统相关的内容。对期末复习来说这些真实系统确实是很好的理解工具但不要被工具类教程带偏。比如Linux的CFS调度器本质就是“多级队列公平调度”思想的工程实现你在课本上学到的调度概念能在系统里看到影子。Linux的inode结构正是索引分配方式的代表你平时用ls -i看到的inode号就是那个索引节点的编号。许多现代移动端系统的微内核、分布式架构理念也能对应到操作系统的内核设计章节。不过期末考试考的不是你会不会安装某个系统、会不会用某个命令而是原理和算法。所以我的建议是平时实验或使用Linux时顺手把课本概念和系统现象对应一下答题时能举出例子比干巴巴背定义好得多但不要考前花大量时间刷系统教程边际收益很低。6.4 考场上的时间分配与拿分策略我这次考试最大的经验是拿到卷子先看大题先把会算的题做了再回头做选择和判断。这样能确保该拿的分都拿到手而不是在选择题上犹豫太久最后大题没时间写。计算题一定要写步骤。银行家算法要写清Need矩阵和安全性检查过程页面置换要画出帧的状态变化或者标明每次缺页磁盘调度要写访问顺序和总寻道长度。很多老师是按步骤给分的即便最终数字错了步骤完整也能拿一半以上。相反只写个答案一旦错了整题基本没分。简答题我习惯按“定义特点例子”三段来写。比如问“什么是死锁”先写一句话定义多个进程因竞争资源而造成互相等待若无外力干预则都无法推进再写四个必要条件最后可以用哲学家问题举个例子。这样写一定不会觉得没话说卷面也好看。7. 考后的一点真实体会复习操作系统那段时间我最焦虑的其实是东西太多不知道从哪下手。现在回头看这门课最核心的东西并没有想象中那么大进程和线程怎么管理、资源怎么分配、内存怎么组织、文件怎么存储、设备怎么调度。把这五条主线各自对应的概念和典型算法吃透期末基本就稳了。我个人觉得最有用的一个习惯是把“易混淆概念两两对比”做成一张表比如进程vs线程、分页vs分段、连续分配vs链接分配vs索引分配、信号量vs管程、死锁预防vs死锁避免。考前只看这张表能快速把所有考点串起来。你甚至可以自己动手做一遍效果比直接看别人的总结好得多。最后分享一个很微妙但真实的想法操作系统这门课期末考只是中途站。后面做系统设计、性能优化、底层开发时你还会反复用到“调度”“内存映射”“缓存一致”这套思维方式。考完当天我本来想彻底把它忘掉结果没过多久就发现脑子里那些进程切换、页面置换的概念已经在帮我看懂真实系统里一些奇怪的行为了。所以好好复习不只是为了分数。
返回列表