ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

汤小丹《计算机操作系统》课后题全解析:从进程调度到页面置换

汤小丹《计算机操作系统》课后题全解析:从进程调度到页面置换 1. 为什么汤小丹《计算机操作系统》的课后题值得一刷再刷很多同学学操作系统上来就啃源码、看论文结果被进程调度、虚拟内存、文件系统一堆概念绕得晕头转向。我当年也是这样直到把汤小丹这本《计算机操作系统第四版》的课后习题完整过了一遍才真正把知识点串成了一张网。这门课不像高数有固定的解题套路它的题目往往把一个概念揉进一个小场景里比如给你几个进程的到达时间和服务时间让你算各种调度算法的平均周转时间或者给你一个页表让你模拟地址变换过程。这种题光看书是看不出来的必须亲手算一遍。这本书的经典之处在于它几乎覆盖了国内高校操作系统课程的全部核心考点进程管理、处理机调度、死锁、内存管理、虚拟存储器、文件系统、磁盘管理、I/O系统。每一章的课后习题都紧扣正文知识点难度梯度从直接套公式到需要综合分析都有。很多人觉得课后题和考试题差距大其实恰恰相反考研408的真题里很多大题本质上就是这本书课后题的变形或组合。比如那道经典的银行家算法判断安全性的题书上习题里就有完整的推导过程。我把这本书的课后题完整做了一遍之后最大的体会是题目本身是死的但解题背后的思维链是活的。你不需要背答案你需要的是建立一套操作系统分析的思维框架。下面我按章节拆解一下每类习题的核心考点、常见陷阱和解题思路以第四版为准题目序号可能有微调但知识点脉络是稳定的。2. 进程管理与调度先厘清并发模型再下手做题2.1 进程描述与控制中的高频概念题第一章和第二章的习题主要集中在进程的概念、进程和程序的区别、进程状态转换、PCB的作用、进程的同步与互斥。这类题看起来是简答题其实最容易丢分因为概念表述不严谨就会被扣分。做题时我建议你自己先画一张进程状态转换图把创建→就绪→运行→阻塞→就绪以及终止的箭头都标清楚然后对照习题里给的场景判断某个进程处于什么状态。有一道题是这样的一个进程在运行过程中请求打印机但打印机正被另一个进程占用问该进程的状态。答案是阻塞态。很多同学会答成就绪态因为觉得它在等待一个资源。这就是对阻塞和就绪本质区别没吃透就绪态是等待CPU阻塞态是等待除CPU以外的其他资源。这个区分在后面的信号量、管程题目里会反复用到。还有一个高频题进程和程序的主要区别。标准答法有三点动态vs静态、并发vs顺序、生命周期是否存在进程有创建和撤销程序是持久存在的。但书上的答案比这更细它特别强调了一点——进程是程序在一个数据集合上运行的过程所以同一个程序跑在不同的数据集合上就是两个不同的进程。这个点在后来的线程引入、进程通信题目里会被引申。2.2 信号量机制习题从原理到代码实现的一步之遥进程同步互斥的题目是操作系统课后题里的重头戏也是很多人的噩梦。第四章的信号量机制题往往是给你一个经典的生产者消费者、读者写者、哲学家进餐场景让你写出信号量定义和P/V操作。我做这类题的经验是先不要急着写代码先把资源梳理清楚。一个信号量对应的是一类资源P操作是申请资源资源数减一若减后小于0则阻塞V操作是释放资源资源数加一若加后仍小于或等于0则唤醒一个阻塞进程。这里有一个特别容易错的地方V操作唤醒的条件。书上说的是若加后仍小于等于0说明还有进程在等待则唤醒一个。很多初学者写成若加后等于0则唤醒那就把语义搞错了。读者写者问题的习题是另外一个经典坑。题目会要求你用信号量实现写者优先或读者优先。读者优先的经典解法是引入一个readcount变量和一个互斥信号量mutex来保护readcount再加一个写者用的信号量wrt。核心逻辑是第一个读者到来时要执行P(wrt)锁住写者最后一个读者离开时要执行V(wrt)释放写者。这个方案在第四版课后题里被反复变体比如写者优先要加一个额外的信号量让后来的读者在写者等待时不能插队。这个变体值得特别推敲。这里我强烈建议把每一道信号量题都画成流程图来理解。不要看着伪代码硬背画出P/V操作的时序图理清谁等谁、谁唤醒谁做题速度和准确率都会上一个台阶。2.3 处理机调度算法计算题必须亲手算别只背结论调度算法这一节课后题的计算量是最实在的。典型的题型包括先来先服务FCFS、短作业优先SJF分抢占和不抢占、优先级调度、时间片轮转RR的平均周转时间、平均带权周转时间计算。做题时有一个关键习惯画甘特图Gantt Chart即调度时序图。比如时间片轮转算法如果不画时间轴调度顺序很容易交错出错。书上有一道经典习题三个进程A、B、C到达时间分别是0、1、2服务时间分别是3、6、4时间片大小为2要求计算时间片轮转算法下的各进程完成时间和周转时间。这道题我第一次做时直接口算结果把第6个时间片后的调度顺序搞混了。后来老老实实画甘特图把每个时间片哪个进程在运行标出来一下就清爽了。FCFS和SJF要注意的一个陷阱是SJF在非抢占模式下指的是在进程到达后从当前已到达的进程里选服务时间最短的而不是把所有进程按服务时间排好序再执行。这一点书上习题专门有一道题进程到达时间不同导致按纯短作业排序的结果和实际调度结果完全不一样。很多人在这里丢分。还要注意带权周转时间的定义带权周转时间 周转时间 / 服务时间。它是衡量调度算法公平性的一个重要指标。做完计算后可以顺手比较一下这几个指标FCFS的带权周转时间通常不如SJF短但SJF可能造成长作业饿死。这种对比性的思考考试简答题经常考。3. 死锁银行家算法和安全序列的判断逻辑3.1 死锁产生的四个必要条件与处理方法死锁这一章课后题常见的题型有三类判断某场景是否可能死锁、给出破坏死锁四条件的方案、以及银行家算法的安全性检查。死锁的四个必要条件是互斥、请求并保持、不可剥夺、循环等待。书上的习题会给你几个资源分配的例子让你判断是不是死锁并说明理由。这种题的核心是死锁的四条件是必要条件不是充分条件。也就是说即使四个条件同时成立系统也不一定发生死锁。做题时要逐个条件对照。有一道题我印象很深一个系统中有两台打印机和一台扫描仪两个进程各持有一台打印机同时申请扫描仪问是否可能死锁。答案是可能死锁因为互斥打印机、扫描仪都不可共享、请求并保持各自拿着打印机不放手还要扫描仪、不可剥夺打印机不能被强行拿走、循环等待每个进程都在等对方可能获取的资源都成立。另一类题是如何破坏死锁条件。比如使用spooling技术把打印机虚拟化让进程不再独占打印机就是从根上破坏互斥条件或请求并保持条件。这道题在习题里出现过很多同学答不到spooling这个层面只会说让进程一次性申请所有资源。知道两套答案的区别考试时就能多拿分。3.2 银行家算法的完整手算流程银行家算法是死锁章必考的大题。它的核心是安全性算法系统按某种顺序分配剩余资源后检查是否存在一个进程序列使得每个进程都能在某个时刻获得足够的资源顺利完成并释放资源。做题步骤我建议固定下来根据题目给出的Allocation已分配、Max最大需求、Available可用矩阵先计算出Need矩阵Need Max - Allocation。设定Work AvailableFinish数组全部置为false。反复扫描寻找满足Finish[i] false且Need[i] Work的进程找到了就把Work Allocation[i]Finish[i] true。如果所有进程Finish都为true则系统处于安全状态找出的进程序列就是一个安全序列。课后题有一道典型题系统里有5个进程、3类资源Available (3,3,2)给出了Max和Allocation矩阵。第一次做时要注意安全序列可能不止一个题目问的是找一个安全序列即可但你最好把所有可能的序列都找出来因为这能帮你验证自己的逻辑是否正确。我做完后整理出了两个合法序列这比只写出一个要保险得多。这里的隐藏考点是安全性算法找进程时优先推进哪个进程不影响最终安全性的判断但不同的推进顺序可能导致不同的序列。如果有一轮扫描发现没有任何进程能满足Need Work就直接判定为不安全状态无需继续。银行家算法还有一个变体题目会问如果进程此时请求资源系统能否分配。这时候要先做一个预分配检查请求的资源数是否小于等于Need是否小于等于Available。只有两个条件都满足才做一个资源分配试探然后运行安全性算法。如果安全就分配不安全就不分配。这个流程在习题中出现率极高务必熟练。4. 内存管理从连续分配到页面置换的连环扣4.1 动态分区分配与首次/最佳/最坏适应算法内存管理章节的习题由浅入深分为三块连续分配方式动态分区、页式管理、段式管理。动态分区的经典题型是给定内存空闲分区表给出若干作业的内存请求让你按首次适应、最佳适应、最坏适应算法分别画出分配后的空闲分区情况。这类题做起来不难但有一个细节容易忽视每次分配后空闲分区表要重新排序按地址或按大小并且格式要统一。如果题目要求按地址排序你按大小排序整道题就都错了。有一道题空闲分区按地址从低到高排列分别是20KB、10KB、50KB、30KB作业依次申请15KB、25KB、20KB。首次适应算法下15KB分给了20KB的分区剩下5KB碎片25KB只能找50KB分区剩下25KB20KB继续找剩下的25KB最终剩5KB。而最佳适应算法下15KB先给最小的10KB不够给20KB剩5KB25KB给50KB剩25KB20KB给30KB剩10KB。看起来两者结果类似但中间的空闲区形态完全不同。这种题就是考你能不能把分配过程一步步写清楚。这里我再补充一个实操经验做这类题时每分配一个作业就在纸上重新画一张内存分区图不要在原图上涂改。原图保留新图画新图这样检查时一目了然也避免自己看错。4.2 页式管理中的地址变换题目页式管理的计算题核心是逻辑地址到物理地址的变换。题目会给出页表、页面大小比如4KB要求你计算某个逻辑地址对应的物理地址或者判断访问某个地址时是否发生缺页中断。解题步骤四步走首先将逻辑地址除以页面大小得到页号和页内偏移量其次查询页表获取该页号对应的物理块号然后物理地址 物理块号 × 页面大小 页内偏移量最后根据页表项的状态位判断是否缺页如果缺页则需要先处理缺页中断。这里最容易翻车的是进制转换。题目给逻辑地址时可能用十进制也可能用十六进制。十六进制时如果页面大小是4KB 2的12次方那么逻辑地址的最低12位就是页内偏移量剩下的高位就是页号。熟练掌握这个快速拆分方法能省下大量计算时间。还有一个考点是关于页表结构的多级页表、页表项的大小、页表级数与页面大小的关系。有一道题问4GB逻辑地址空间4KB页面页表项4字节需要几级页表这类题的本质是拿逻辑地址位数除以页内偏移位数。如果一级页表恰好能覆盖所有页表项就不需要多级否则要逐级分解。这类题的训练核心是让你理解页表本身也占内存多级页表是为了减少页表占用的连续内存空间。4.3 页面置换算法OPT是理想LRU是重点Clock是热点虚拟存储器这一章节页面置换算法的计算题是考研和期末考试的重灾区。常见算法有最佳置换算法OPT、先进先出FIFO、最近最久未使用LRU、Clock算法NRU。做题框架是这样的给出一个页面访问序列比如7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1内存块数固定为3计算缺页次数和缺页率。必须以给定的访问顺序为时间轴每一列列出一个时刻的页面占用情况。OPT算法是要往后看找将来最晚被访问的页面换出。它是理论上的最优解现实中不可实现但题目会拿来和其他算法对比。LRU算法则是往前看找最近最久没被访问的页面。注意LRU考的是最近的访问状态随着时间推移每个页面的上次访问时间都在变化。一个高频陷阱题是FIFO算法在分配的内存块数从3增加到4时缺页次数反而增加了Belady异常而LRU和OPT都不会出现这种现象。这说明FIFO的调度依据是进入内存的时间它完全不考虑页面使用频率可能导致刚被频繁访问的页面被换出。习题里会专门让你验证Belady异常这时要画一个对比表把内存块3和内存块4下的缺页次数并列计算得出结论。Clock算法时钟置换算法是LRU的近似实现它用一个使用位简化了LRU对时间戳的维护。做Clock题时要特别注意指针移动的规则访问一个页面时把使用位置为1发生缺页时指针顺时针移动找到使用位为0的页面换出走过的页面使用位置0。这个扫一圈的过程很多同学会因为指针初始位置不同而算错结果建议做题时在每行旁边标出指针位置避免混淆。4.4 段式管理与段页式混合管理的习题思路段式管理的核心逻辑是逻辑地址由段号和段内偏移组成段表记录每段的基址和界限。习题通常给你段表让你判断一个逻辑地址是否越界并计算出物理地址。这类题的关键步骤是先检查段内偏移是否小于段长界限寄存器如果大于等于段长就发生越界中断没越界才能用段表中的基址偏移得到物理地址。很多同学容易漏掉这个越界检查直接相加。第四版习题里专门有一道关于非法地址访问的题就是要让你识别越界情况。段页式管理则是先按段查段表找到该段对应的页表起始地址再按页号查页表得到物理块号最后加上页内偏移。做题时核心是分两步走不要试图一步到位。一个凌乱的段页式地址变换图是容易算错的建议按层来每层一行清晰标注。5. 文件系统与磁盘管理从目录结构到调度算法的大杂烩5.1 文件逻辑结构与物理结构的映射关系文件系统章节的习题类型比较杂但有一个核心主题文件的物理结构连续、链接、索引如何影响文件的访问方式。连续分配的题目通常给你文件长度和磁盘块大小让你计算文件的起始块号或者访问文件末尾内容需要几次磁盘I/O。这类题只要理解连续分配类似数组块号可以直接计算就没问题。链接分配的题目往往涉及FAT文件分配表的优化意义。有一道题是假设一个磁盘块4KB盘块号占4字节一个FAT表项最多能管理多大文件如果不引入FAT的簇概念文件的大小会受限于块号字段的长度。FAT把磁盘块组合成簇来管理能有效减少文件分配表项数量。习题中还会有间接索引的问题比如混合索引方式直接索引10个地址一级间接索引、二级间接索引每种索引能访问的最大文件大小分别是多少。这类题本质上是连乘和连加。做题时建议先把索引块大小磁盘块大小、每块盘块号个数块大小/盘块号大小这两个基础公式写清楚再把各个级别的索引范围列出来逐段相加即可。5.2 磁盘调度算法先来先服务、最短寻道时间优先、SCAN与C-SCAN磁盘调度的典型题目是给你一个磁道请求序列比如55, 58, 39, 18, 90, 160, 150, 38, 184初始磁头在某个磁道比如100磁头移动方向给定让你计算每一种调度算法下的磁头移动总磁道数。FCFS最简单严格按照请求顺序移动磁头关键是把相邻两个请求的磁道差求绝对值累加即可。SSTF最短寻道时间优先每次选择离当前磁头最近的请求。它最大的问题是饿死远处的请求所以实际系统中要加老化机制。计算时每次找最小的绝对值差然后更新当前位置。SCAN电梯算法的解法是先确定磁头当前的移动方向沿着该方向服务所有请求直到到达该方向的终点然后反向继续。做这类题有一个易错点如果题目说磁头目前正在向磁道号减小的方向移动或者向磁道号增大的方向移动你只能在当前方向上服务请求不能中途反向否则就不是SCAN了。C-SCAN循环扫描算法则规定磁头只在一个方向服务请求返回起点时快速归位归位途中不服务请求。它的优点是响应时间更均匀但代价是寻道距离不一定最小。有一道课后题让比较SCAN和C-SCAN两种算法的平均寻道距离结论是SCAN往往更短但C-SCAN的方差更小各请求的等待时间波动更小。5.3 文件系统空闲空间管理位示图和成组链接法空闲空间管理这块课后题常考位示图bitmap。题目给你一个位示图问某个盘块的空闲状态或者反过来需要在某个分区申请若干盘块问哪些位要置1。位示图的索引计算是盘块号 → 字号和位号。假设位示图按行存储每个字16位物理盘块号从1开始编号有的题从0开始则盘块号i对应的字号j (i - 1) / 16取整位号k (i - 1) % 16。反过来第j字第k位的盘块号 j × 16 k 1。这一对转换公式是做题的骨架。成组链接法主要出现在UNIX文件系统里把空闲块分组组内用链表串联。习题会考分配和回收一个盘块时如何修改空闲块号和栈顶指针。这类题不算难但需要把图看明白答题时把栈顶指针的变化按步骤写出来即可。6. I/O系统与设备管理中断、DMA和Spooling的考点挖掘6.1 中断与DMA的对比理解输入输出系统的习题多数围绕三种I/O控制方式程序查询方式、中断方式、DMA方式。这类题很少要求大计算风格更偏向概念辨析。程序查询方式的特点是CPU忙等在等待I/O完成时CPU不能执行其他任务效率较低。中断方式引入后CPU可以发完I/O命令后去做别的事情等设备中断到来再处理。但中断方式每传送一个数据单位通常是一个字节或一个字都要发生一次中断中断次数多CPU开销仍然很大。DMA方式则把数据传输从CPU手中接管过来由DMA控制器直接完成内存和外设之间的数据块传输只在传输开始和结束时打扰CPU。课后题一旦问为什么DMA方式适合块设备交互答案核心就是减少了中断频率。做题时很容易混淆的考点是中断处理程序的执行流程保存现场、分析中断源、执行对应的中断服务程序、恢复现场以及中断屏蔽的意义。有一道题专门问中断屏蔽和中断嵌套的关系其实要答的是在执行某个中断服务程序时持锁屏蔽同级或低级中断可以让高优先级的中断打断低优先级从而形成嵌套。6.2 Spooling技术的习题为什么虚拟设备能打破独占瓶颈Spooling假脱机技术在课后题中经常以打印机共享的例子出现。它的本质是在磁盘上建立输入井和输出井把低速设备的数据先缓存到高速磁盘上进程看来自己独占了一台打印机实际上多个进程的打印任务被排队到磁盘上的输出井里由Spooling进程统一调度打印。做题时如果题目问为什么有了Spooling技术打印机这种独占设备就可以被多个进程共享关键要答出三层一是输出井在磁盘上多个进程可以把数据同时写入磁盘的不同输出井区域不必直接竞争物理打印机二是Spooling进程负责按队列逐次把数据送往打印机三是从进程的视角看它打开的是一个逻辑设备不是物理设备因此逻辑设备可以并发访问。我也在习题里见到一种变形让你描述Spooling系统由哪些部分组成输入井、输出井、输入进程、输出进程并说明各自的职能。这类题不需要背长篇大论抓住井磁盘缓存进程调度这个本质就能把分数拿全。6.3 缓冲管理习题单缓冲、双缓冲、环形缓冲缓冲区计算题是I/O章里少有的计算型题目。常见的命题形式是某设备每传送一个数据块耗时TCPU处理该数据块耗时C单缓冲和双缓冲下的系统吞吐量分别是多少。单缓冲的关键是CPU和设备不能同时访问同一个缓冲区所以处理器处理第一个数据块前有一个T的等待之后每个周期取max(T, C)或(T C)视题目模型而定。双缓冲则可以利用两个缓冲区交替让设备和CPU的工作尽量重叠周期是max(T, C)。做题时注意题目是T C还是T C决定最终吞吐量的瓶颈。环型缓冲多缓冲在习题中出现率较低但一旦出现往往结合中断机制。它不考大计算而是考指针变化逻辑。答题时把Nexti输入指针、Nextg提取指针的变化路径标清楚就行。7. 典型综合题一经典PV操作题型的递进式解法将前面的知识点串起来最典型的题型就是综合性的PV操作题。这类题在第四版课后题里往往不止一道它们像一个梯度训练从一两个信号量的简单互斥到多个信号量的复杂协作。综合题第一类生产者-消费者变体。比如有一个仓库可以放N件产品有M个生产者、K个消费者。这时代码模板是semaphore mutex 1; // 保护仓库访问 semaphore empty N; // 仓库剩余空间 semaphore full 0; // 仓库中的产品数量 // 生产者 producer() { while (true) { 生产产品; P(empty); // 申请一个空位 P(mutex); 把产品放入仓库; V(mutex); V(full); // 产品数量加一 } } // 消费者 consumer() { while (true) { P(full); // 申请一个产品 P(mutex); 从仓库取产品; V(mutex); V(empty); // 释放一个空位 消费产品; } }这里有一个约定俗成的规则多信号量嵌套时P操作的顺序不能随意颠倒尤其是先资源后互斥锁。如果先P(mutex)再P(empty)一旦仓库满了生产者拿着锁等空位消费者想取产品又进不来就会死锁。课后题专门有一道如果把P(empty)和P(mutex)互换会发生什么的思考题答案就是可能发生死锁。这个知识点不仅在选择题里考在信号量编程大题里考得更狠。综合题第二类三个进程之间的同步。比如进程A从输入设备读数据进程B处理数据进程C打印结果。它们之间的关系是典型的流水线型。这样就需要两组信号量s1表示A与B之间的同步缓冲区是否有数据可处理s2表示B与C之间的同步结果缓冲区是否有数据可打印再加上各自缓冲区的互斥锁如果缓冲区是多缓冲区可能不需要锁但单缓冲区必须有。做这种题的核心是找到前驱关系把每一步的V操作写在下游进程的P操作之前。综合题第三类读者-写者升级版。如果把读者和写者增加优先级限制写者优先的实现就需要额外的信号量。整个模型在书后习题里反复出现。我建议动手实现一遍最好能运行验证这比干看答案强得多。可以用C语言的pthread库把信号量换成互斥锁和条件变量一旦跑通你会发现对PV操作的理解完全不一样。8. 典型综合题二地址变换和缺页中断的组合题除了PV操作另一类综合大题是把逻辑地址转物理地址和缺页中断组合起来。这类题的场景一般是一个请求分页系统给出某个进程的页表页表项里有物理块号、状态位、访问位、修改位等然后给出一连串逻辑地址的访问序列要求你依次计算每个逻辑地址对应的物理地址如果发生缺页按给定置换算法换页如果页表项修改位为1换出时还要考虑是否写回磁盘。解这种题最怕的是乱七八糟地计算。我的习惯是先建立一张大表表头固定为访问序号、逻辑地址、页号、页内偏移、页表状态、物理块号、物理地址、缺页与否、换出页号如果缺页。然后一行一行填。不要跳步不要心算每一行都按公式走。有一个细节经常坑人页表中状态位表示该页是否在内存中但有的题会加入访问位和修改位用来配合改进的Clock算法。如果你没注意这两个位就不知道换出时脏页要不要写回磁盘从而导致后面的磁盘I/O次数计算错。所以拿到题目先浏览一遍页表的所有字段把它们各自编程了再动笔。这种综合题的另一个坑是页面大小不整除逻辑地址或者逻辑地址的进制不一致。页内偏移位数 log2(页面大小)页号 逻辑地址右移偏移位数。做题时先把这两个值标在草稿纸最显眼的位置再开始算。9. 备考策略与经验总结9.1 按题型归类复习别逐题硬啃这本课后习题一共十几章逐题硬啃效率极低。我建议先把书上的例题逐题吃透再做每一章的课后习题。做题时按题型归类概念简答题、计算题、信号量编程题、综合设计题。归类后你会发现计算题的套路高度固定信号量编程题的模型也就十来个刷起来会越来越快。举个例子页面置换算法题目当你做过第五道类似题之后基本形成肌肉记忆先看序列、再分内存块数、画表、数缺页次数。所以说复习的重点不是做过的题会不会而是没见过的题是不是也能套上已知的框架。9.2 错误记录比答案本身更宝贵我复习时有一个专门的错题本。每一道做错的题不只要写正确答案还要写下当初错误的原因是概念不清、计算粗心还是公式记混。比如我在FCFS和SJF的到达时间上栽过两次跟头后来就在错题本上大字标注SJF非抢占模式不是全局最短作业优先而是当前时刻已到达进程中的最短作业。这个一句话总结比抄十遍答案都管用。9.3 做旧题、看新题用真题检验熟练度课后题全部做完之后建议找近五年的考研408真题做一遍。原因很简单408真题的命题风格和这本教材高度一致有些题目直接就是课后题的难度升级版。尤其是进程管理、内存管理的大题基本是把书上的模型放进新的场景里。当你课后题做熟之后再看真题会觉得自己站在一个更高的视角看到的是这道题其实是考LRU换页只是换了一个壳。9.4 对照第四版与其他版本的知识点差异汤小丹教材有多个版本第三版和第四版在有些概念描述上有差异。如果你使用的是第四版务必注意它在新版中对管程协程虚拟化等概念的补充。OS课程现在越来越关注现代操作系统的进展比如协程和管程的对比在面试和考研复试里出现的频率也在上升。管程Monitor是一种高级同步机制把共享资源和对它的操作封装在一起进程只能通过管程定义的入口访问资源。它和信号量的区别在于管程由编译器和运行时保证互斥不需要程序员手动写P/V操作条件变量配合wait和signal操作用来处理进程间的同步等待关系。协程Coroutine则是一种用户态并发调度方式它的切换不需要操作系统内核介入因此开销远小于线程切换。做题时如果遇到管程和信号量的对比或协程与线程的差异这类简答题先把定义写清楚再做对比表得分率会很高。9.5 时间投入建议如果目标是期末考及格课后题做一遍重点做计算题和经典信号量题十个晚上基本够。如果目标是考研建议至少把这本书的课后题系统做两遍第一遍按章顺序做第二遍按题型做。第二遍要以看到题目看一眼就知道思路为标准。我做完整本书大约花了三周每天两小时左右之后再看408真题明显轻松很多。10. 最后的实操心得分享一个我自己的小习惯每章课后题做完后我会写一段本章习题挑战最大的一道题是什么、难在哪、怎么突破的。不要小看这些零散的复盘笔记它们是你考前三小时快速翻阅的救命稻草。还有一点要提醒网上流传的课后习题答案完整版质量参差不齐有的答案有明显笔误个别极难题的解答也未必是唯一正确解法。所以我的建议是答案可以参考但一定要自己推导一遍尤其是银行家算法、页面置换、信号量这三类题自己手算的结果比背答案可靠得多。如果发现自己的答案和参考答案不一致不要急着改先检查参考步骤有没有漏洞再对照教材上的定义确认往往能发现参考答案本身的问题。以上是我在这本教材上完整刷完课后题后的全部心得体会。操作系统这门课难就难在知识点多且相互纠缠但它的好处恰恰也在这里——一旦你把每一类题目的分析框架建立起来整个操作系统的骨架也就立住了。祝每一步都能算清楚、每道题都能理明白。
返回列表