操作系统期末冲刺:进程调度与内存管理核心考点精讲
简介:这是一份面向计算机专业本科生的操作系统课程期末复习笔记,聚焦核心概念梳理与考点精讲,帮助学生高效突破并发、同步、进程管理等难点。资源以1个1.17MB的Word文档(.docx)形式提供,内容结构完整,覆盖操作系统目标(方便性、有效性、可扩充性、开放性)、发展历程(批处理→分时→实时系统)、四大基本特性(并发性、共享性、虚拟性、异步性),以及处理机、存储器、设备和文件四大管理功能;重点详解前趋图、进程三态/五态模型、PCB组成、信号量机制(整型/记录型/AND型/信号量集)、P/V操作实现互斥与同步、经典同步问题等高频考点。文字表述简明,关键术语加粗标注,逻辑层层递进,便于考前快速回顾与体系化记忆。目前已有779人学习下载,是兼顾理论深度与应试实用性的优质复习材料。
1. 操作系统期末复习:一张不能跳过的知识地图
如果你正在翻这本笔记,大概率是离期末考只剩两周、刚合上《现代操作系统》第3章、对着“松弛度=完成截止时间−剩余服务时间−当前时间”发了三分钟呆——别慌,这不是你一个人的玄学现场。操作系统这门课最让人抓狂的地方,不是概念多,而是所有知识点都像齿轮咬合:漏掉一个状态转换,就看不懂调度算法;没吃透临界区,信号量题直接归零;快表命中率算错,整个EAT公式全盘崩塌。这份笔记不是按教材章节平铺直叙,而是按真实考场高频失分路径重新组织:从“为什么必须用记录型信号量而不是整型”这种血泪经验,到“银行家算法手算时最容易在哪个矩阵位置抄错数字”的踩坑细节,再到“分页vs分段地址结构图怎么一眼区分”的视觉锚点。它覆盖的不是全部知识,而是期末卷子上85%的分值落点——包括那些老师从不点名但必考的隐性逻辑(比如:为什么“可重定位装入”不能解决运行时地址修改?答案藏在静态重定位的定义里);也包括那些看似简单却年年翻车的操作(比如:画五态图时,挂起阻塞态→就绪挂起态的箭头,必须经过“对换”这个动作,缺了就是0分)。适合两类人:一类是想用72小时把散装知识点拧成一股绳的冲刺者;另一类是已经刷过三套真题、发现总在“进程通信类型判断”和“页面置换命中率计算”上反复失分的查漏者。现在,我们从这张地图的起点出发:并发、共享、虚拟、异步——这四个词不是并列关系,而是因果链:因为要并发,所以必须共享;因为要共享,所以需要虚拟化资源;因为资源被虚拟化,进程推进必然异步。抓住这条线,整本书就活了。
2. 进程管理:状态转换、同步机制与经典问题的硬核拆解
2.1 进程生命周期:从三态到七态的演进逻辑
进程状态不是凭空画出的圆圈,而是为解决具体矛盾而层层叠加的设计。最基础的三态模型(就绪/执行/阻塞)解决的是CPU空转问题:当进程因I/O等待而阻塞时,OS立即将CPU切换给就绪队列中的其他进程。但现实更复杂——比如内存不足时,一个就绪进程可能被强行移出内存,此时它既不是就绪(没在内存),也不是阻塞(没在等I/O),于是引入挂起态(Suspended),形成七态模型(创建/就绪/执行/阻塞/终止/就绪挂起/阻塞挂起)。关键在于理解状态转换的触发条件:
- 就绪→就绪挂起:内存紧张时,OS选择一个就绪进程换出到外存(对换);
- 阻塞→阻塞挂起:进程等待某事件(如I/O完成),同时内存不足,被换出;
- 就绪挂起→就绪:内存空闲且该进程优先级高,被换入内存;
- 阻塞挂起→就绪挂起:它等待的事件发生了(如I/O完成),但仍在外存,需先换入才能就绪。
提示:考试画状态图时,所有带“挂起”的转换必须标注“对换”动作,这是判分关键点。只画箭头不写动作,扣分。
2.2 进程控制块(PCB):操作系统眼中的进程身份证
PCB不是数据结构练习题,而是OS管理进程的唯一依据。它的字段设计直指管理需求:
| 字段 | 作用 | 考试易考点 |
|---|---|---|
| 进程标识符 | 全局唯一ID(如PID) | 区分父子进程时,子进程PID由fork()返回值决定 |
| 处理机状态字(PSW) | 保存CPU寄存器现场(PC、IR、SP等) | 进程切换时,必须先保存当前PCB的PSW,再加载新PCB的PSW |
| 进程调度信息 | 优先级、等待时间、已执行时间片 | HRRN算法中“响应比=(等待时间+要求服务时间)/要求服务时间”,等待时间来自此字段 |
| 进程控制信息 | 进程状态、程序/数据段指针、资源清单 | 状态字段直接驱动状态转换;资源清单用于死锁检测的资源分配图 |
PCB常驻内存,且每个进程有且仅有一个。当进程创建时,OS为其分配PCB并初始化;进程终止时,OS回收PCB。没有PCB,进程就不存在——这是理解“进程是资源分配基本单位”的底层逻辑。
2.3 同步机制:从软件方案到信号量的进化本质
为什么Peterson算法被淘汰?为什么TSL指令在单核有效、多核失效?答案藏在“让权等待”这个核心规则里。四种软件方案(单标志/双标志先检查/双标志后检查/Peterson)均无法避免忙等:进程在while循环中不断测试条件,浪费CPU。而硬件方案(中断屏蔽/TSL/Swap)虽能保证原子性,但中断屏蔽会降低系统响应性,TSL/Swap在多处理器下需总线锁,开销大。信号量机制的革命性在于:用阻塞代替忙等。当wait(S)发现S≤0时,进程主动放弃CPU,进入阻塞队列,直到signal(S)唤醒它。看这段记录型信号量的核心代码:
typedef struct { int value; // 资源数量或阻塞进程数 struct process *list; // 阻塞队列指针 } semaphore; void wait(semaphore *S) { S->value--; // 原子操作:减1 if (S->value < 0) { // 资源不足 add_to_list(S->list, current_process); // 加入阻塞队列 block(); // 主动阻塞当前进程 } } void signal(semaphore *S) { S->value++; // 原子操作:加1 if (S->value <= 0) { // 有进程在等 process = remove_from_list(S->list); // 取出一个阻塞进程 wakeup(process); // 唤醒它 } }注意:block()和wakeup()是内核原语,不可分割。考试若问“记录型信号量如何实现让权等待”,答案必须包含“value<0时调用block()阻塞进程”这一动作。
2.4 经典同步问题:生产者-消费者与哲学家进餐的破题心法
所有经典问题本质都是资源竞争模式的具象化。生产者-消费者问题暴露的是缓冲区容量限制下的互斥与同步双重约束:
- 互斥:对缓冲区(临界资源)的访问必须互斥(用mutex信号量,初值1);
- 同步:生产者不能向满缓冲区放数据(用empty信号量,初值n),消费者不能从空缓冲区取数据(用full信号量,初值0)。
关键陷阱:wait(empty)必须在wait(mutex)之前!否则可能死锁——假设缓冲区已满,生产者先wait(mutex)成功,再wait(empty)阻塞,此时mutex仍被占用,消费者无法signal(empty)。
哲学家进餐问题则揭示循环等待死锁的最小模型。五种解法中,考试最常考的是“奇偶编号法”:规定奇数号哲学家先拿左叉、偶数号先拿右叉。这样打破循环等待链——因为相邻两人拿叉顺序不同,不可能同时持有左叉等待右叉。记住:任何打破“请求并保持”或“循环等待”的策略,都是可行解。
2.5 易错点:进程管理中90%考生栽跟头的5个细节
易漏点①:P/V操作顺序颠倒导致死锁
→ 为什么漏:教材强调“先P后V”,但未说明互斥与同步信号量的P操作必须严格嵌套。例如生产者中wait(mutex)和wait(empty)顺序错误,或消费者中wait(mutex)和wait(full)顺序错误。
→ 怎么补:牢记口诀“同步信号量P在前,互斥信号量P在中,V操作逆序写”。生产者:wait(empty)→wait(mutex)→操作缓冲区→signal(mutex)→signal(full)。易漏点②:信号量初值设置错误
→ 为什么漏:混淆互斥信号量(初值=1)与同步信号量(初值=0或资源总数)。如将full初值设为1,会导致消费者首次取数据时误以为缓冲区有数据。
→ 怎么补:画表格固化规则:信号量类型 初值 物理意义 互斥信号量 1 表示临界资源可用数量 同步信号量(空闲资源) n 表示空闲槽位数(如empty) 同步信号量(已用资源) 0 表示已用槽位数(如full) 易漏点③:管程与信号量的适用场景混淆
→ 为什么漏:认为管程是“高级信号量”,忽略其封装性优势。管程强制互斥访问(每次仅一个进程进入),而信号量需程序员手动保证P/V配对。
→ 怎么补:记牢管程的两个铁律:① 所有共享变量只能在管程内访问;② 管程内过程调用是互斥的。考试若问“为何管程比信号量更安全”,答:“管程将同步逻辑封装在内部,避免程序员遗漏P/V操作”。易漏点④:进程通信类型判断失误
→ 为什么漏:看到“QQ发送文件”就选“消息传递”,忽略线程间通信更常用共享内存。进程通信分低级(PV操作)和高级(共享内存/消息传递/管道/套接字)。
→ 怎么补:用资源粒度判断——共享内存:大块数据,同进程内线程;消息传递:小块数据,跨进程;管道:单向流,父子进程。易漏点⑤:死锁检测算法中资源分配图的化简错误
→ 为什么漏:化简时只找“无请求边的进程节点”,却忽略“该进程必须持有至少一个资源才能运行”。若进程P1持有R1但请求R2,P2持有R2但请求R1,两者都无“无请求边”,图无法化简即死锁。
→ 怎么补:化简四步法:① 找无请求边的进程节点;② 释放其持有资源;③ 删除其所有边;④ 重复直到无节点可删。若剩余节点>0,则死锁。
3. 处理机调度:从算法原理到考场手算的避坑指南
3.1 调度层次:三级调度的本质差异与协同关系
调度不是单一动作,而是三层防御体系:
- 高级调度(作业调度):决定“哪些作业从外存调入内存”,频率最低(秒级),目标是平衡系统吞吐量与响应时间。典型算法:HRRN(高响应比优先),因其综合考虑等待时间与服务时间,避免SJF对长作业的饥饿。
- 中级调度(对换调度):决定“哪些进程从内存换出到外存”,频率中等(分钟级),目标是提高内存利用率。当内存紧张时,OS选择阻塞态或就绪态进程换出,待内存空闲再换入。
- 低级调度(进程调度):决定“就绪队列中哪个进程获得CPU”,频率最高(毫秒级),直接影响用户感知。算法选择取决于系统类型:分时系统用RR(时间片轮转),实时系统用EDF(最早截止时间优先)。
三者关系:高级调度选中的作业,经中级调度装入内存后,其进程进入就绪队列,再由低级调度分配CPU。低级调度是基石,高级调度是宏观调控,中级调度是内存压力缓冲阀。
3.2 调度算法手算:FCFS、SJF、HRRN、RR的逐行演算
考试必考手算,核心是掌握“到达时间、服务时间、完成时间、周转时间、带权周转时间”的递推关系。以4个进程为例:
| 进程 | 到达时间 | 服务时间 |
|---|---|---|
| P1 | 0 | 8 |
| P2 | 1 | 4 |
| P3 | 2 | 9 |
| P4 | 3 | 5 |
- FCFS(先来先服务):严格按到达顺序执行。P1(0-8)→P2(8-12)→P3(12-21)→P4(21-26)。P2完成时间=12,周转时间=12-1=11。
- SJF(短作业优先):非抢占式,P1(0-8)→P2(8-12)→P4(12-17)→P3(17-26)。注意:P2到达时P1已在运行,P2需等待P1结束。
- HRRN(高响应比优先):响应比=(等待时间+服务时间)/服务时间。t=0时,只有P1到达,运行P1至t=1;t=1时,P2到达,P1等待时间=1,响应比=(1+8)/8=1.125,P2响应比=(0+4)/4=1,选P1;t=2时,P3到达,P1响应比=(2+8)/8=1.25,P2=1,P3=1,仍P1;... 直到P1结束,再比较剩余进程。
- RR(时间片轮转):设时间片=4。就绪队列变化:[P1]→P1执行4ms(0-4),剩余4ms→[P2,P1]→P2执行4ms(4-8),剩余0ms→[P1,P3]→P1执行4ms(8-12),剩余0ms→[P3,P4]→P3执行4ms(12-16),剩余5ms→[P4,P3]→P4执行4ms(16-20),剩余1ms→[P3]→P3执行5ms(20-25),剩余0ms→[ ]。
提示:RR手算易错点——时间片用完但进程未结束,必须将其放回就绪队列队尾,而非直接终止。
3.3 实时调度:EDF与LLF算法的 deadline 敏感性
实时系统的核心是时间即正确性。EDF(最早截止时间优先)和LLF(最低松弛度优先)都动态调整优先级,但计算逻辑不同:
- EDF:优先级=截止时间,截止时间越早,优先级越高。例:P1截止时间=10,P2=8,则P2优先。
- LLF:松弛度=截止时间−剩余服务时间−当前时间,松弛度越小越紧急。例:t=5时,P1剩余服务时间=3,截止时间=10,松弛度=10−3−5=2;P2剩余服务时间=2,截止时间=9,松弛度=9−2−5=2;两者松弛度相同,需按EDF或FCFS决定。
关键区别:EDF只看截止时间,LLF还看剩余工作量。LLF能更好应对突发长任务,但计算开销更大。考试若给定进程参数,必须先算松弛度再排序。
3.4 死锁:从必要条件到银行家算法的实战推演
死锁四必要条件(互斥/请求保持/不可抢占/循环等待)是理论骨架,银行家算法是血肉。其核心是安全序列判定:是否存在一个进程执行顺序,使每个进程都能获得所需资源并完成。步骤:
- 初始化:Work=Available,Finish[i]=false;
- 寻找满足Need[i]≤Work的进程Pi;
- 若找到,Work=Work+Allocation[i],Finish[i]=true,返回步骤2;
- 若所有Finish[i]=true,则安全;否则不安全。
以经典例题为例:系统有3类资源(A,B,C),Available=(3,3,2),P0-P4的Need和Allocation如下:
| 进程 | Need | Allocation |
|---|---|---|
| P0 | (7,4,3) | (0,1,0) |
| P1 | (1,2,2) | (2,0,0) |
| P2 | (6,0,0) | (3,0,2) |
| P3 | (0,1,1) | (2,1,1) |
| P4 | (4,3,1) | (0,0,2) |
手算安全序列:
- Work=(3,3,2),P1的Need=(1,2,2)≤Work,执行P1→Work=(3+2,3+0,2+0)=(5,3,2);
- P3的Need=(0,1,1)≤Work,执行P3→Work=(5+2,3+1,2+1)=(7,4,3);
- P0的Need=(7,4,3)≤Work,执行P0→Work=(7+0,4+1,3+0)=(7,5,3);
- P2的Need=(6,0,0)≤Work,执行P2→Work=(7+3,5+0,3+2)=(10,5,5);
- P4的Need=(4,3,1)≤Work,执行P4。安全序列:P1→P3→P0→P2→P4。
注意:银行家算法中,“请求资源”时需先检查Request[i]≤Need[i],再检查Request[i]≤Available,最后模拟分配并验证安全性。三步缺一不可。
3.5 易错点:调度与死锁中隐藏最深的4个逻辑陷阱
易错点①:HRRN算法中“等待时间”计算错误
→ 为什么错:将“等待时间”理解为从t=0开始的绝对等待,实际是从进程到达时刻到被调度时刻的时间差。P1到达t=0,t=5被调度,等待时间=5;P2到达t=2,t=5被调度,等待时间=3。
→ 怎么补:手算时在草稿纸上为每个进程单独列“到达时间”“开始执行时间”“等待时间=开始执行时间−到达时间”。易错点②:RR算法中时间片边界与进程完成的混淆
→ 为什么错:认为时间片用完进程必须让出CPU,忽略“时间片用完时进程恰好完成”的情况。若P1服务时间=4,时间片=4,则P1执行完直接退出,不放回就绪队列。
→ 怎么补:判断标准:执行后剩余服务时间>0才放回队尾。易错点③:死锁预防中“破坏请求保持条件”的误解
→ 为什么错:认为“一次性分配所有资源”就能避免死锁,忽略AND型信号量的局限性——它要求进程预知所有资源需求,而实际中资源需求可能动态变化。
→ 怎么补:记牢:破坏请求保持=进程运行前申请全部资源;破坏循环等待=按序分配资源(如给资源编号,进程只能按升序申请)。易错点④:银行家算法中“Work”变量的物理意义混淆
→ 为什么错:将Work等同于Available,实际Work是模拟分配过程中,当前可用的资源总量,初始值=Available,后续随进程完成而增加(Work=Work+Allocation[i])。
→ 怎么补:手算时用不同颜色笔写Work,每步更新后标注“←Work+Allocation[i]”。
4. 存储管理:从连续分配到虚拟内存的演进逻辑
4.1 内存层次结构:速度、容量、成本的三角博弈
存储器不是平面列表,而是金字塔:
- 顶层:寄存器(CPU内部,ns级,KB级,最贵)→ 存临时运算数据;
- 第二层:Cache(CPU芯片内,ns级,MB级)→ 缓存主存热点数据;
- 第三层:主存(DRAM,ns级,GB级)→ 存当前运行程序;
- 第四层:磁盘缓存(内存中一块区域,us级)→ 缓存频繁访问的磁盘块;
- 底层:辅存(磁盘/SSD,ms级,TB级,最便宜)→ 长期存储。
关键规律:越靠近CPU,速度越快、容量越小、成本越高。OS的存储管理目标,就是让程序感觉“内存无限大、访问速度如Cache”,通过虚拟内存技术实现。
4.2 连续分配:从固定分区到动态可重定位的碎片治理
连续分配的核心矛盾是外部碎片(内存中分散的小空闲区)。四种方式对比:
| 方式 | 分区特点 | 碎片问题 | 重定位方式 |
|---|---|---|---|
| 单一连续 | 用户区=1个大分区 | 无外部碎片,但内存浪费严重 | 无需重定位 |
| 固定分区 | 分区大小固定 | 产生内部碎片(分区>进程) | 静态重定位 |
| 动态分区 | 分区大小按进程需求 | 产生外部碎片 | 静态重定位 |
| 动态可重定位 | 分区可移动 | 通过紧凑消除外部碎片 | 动态重定位(重定位寄存器) |
紧凑(Compaction)是动态可重定位的灵魂:将所有进程向内存一端移动,合并空闲区。但移动后进程地址改变,需动态重定位——CPU访问内存时,地址=重定位寄存器值+逻辑地址。考试若问“为什么动态可重定位能解决碎片”,答:“紧凑后,重定位寄存器值更新,所有进程逻辑地址不变,物理地址自动适配新位置”。
4.3 分页与分段:地址结构、映射机制与根本差异
分页和分段是离散分配的两大支柱,区别不在技术细节,而在设计哲学:
- 分页:面向机器,解决内存利用率问题。页是固定大小的物理块(如4KB),用户不可见。地址结构=页号+页内偏移,一维线性。
- 分段:面向用户,解决程序模块化问题。段是逻辑单位(如main段、stack段),大小可变。地址结构=段号+段内偏移,二维。
地址变换对比:
- 分页:逻辑地址→页号/页内偏移→查页表得块号→物理地址=块号×页大小+页内偏移;
- 分段:逻辑地址→段号/段内偏移→查段表得基址/段长→检查偏移<段长→物理地址=基址+段内偏移。
提示:考试必考地址变换计算。分页题给逻辑地址和页大小,求物理地址;分段题给逻辑地址、段表项(基址、长度),先检查越界再计算。
4.4 虚拟内存:局部性原理与页面置换算法的性能博弈
虚拟内存的根基是局部性原理:
- 时间局部性:刚用过的指令/数据,很快会被再用(如循环);
- 空间局部性:刚用过的存储单元附近,很快会被访问(如数组遍历)。
这使得OS可以只装入部分页面,按需调页。页面置换算法的目标是最小化缺页率,但最优算法(OPT)无法实现,故用近似:
- FIFO:淘汰最早装入页面。易出现Belady异常(增加内存帧数,缺页率反而上升);
- LRU:淘汰最久未用页面。需硬件支持(如TLB中的访问位),软件实现用栈或寄存器;
- Clock:FIFO的改进,用访问位(A)标记是否被访问。A=0时淘汰,A=1时置0并轮询下一个。
改进型Clock增加修改位(M):(A,M)组合决定淘汰优先级——(0,0)最优(未访问未修改),(1,1)最差(刚访问刚修改)。考试若给页面状态表,按(A,M)字典序排序即可。
4.5 易漏点:存储管理中被忽视的3个底层机制
易漏点①:快表(TLB)命中率对EAT的指数级影响
→ 为什么漏:只记公式EAT=H×(t₁+t₂)+(1−H)×(t₁+t₃+t₂),忽略t₁(TLB访问时间)≈1ns,t₃(内存访问页表)≈100ns。当H=0.9时,EAT≈0.9×(1+100)+0.1×(1+100+100)=110.9ns;H=0.99时,EAT≈0.99×101+0.01×201=101.99ns。命中率每提升1%,EAT下降近9ns。
→ 怎么补:手算EAT时,先确认题目给的t₁/t₃/t₂值,再代入公式,勿省略单位。易漏点②:分段存储中“段长”字段的越界检查作用
→ 为什么漏:认为段表只存基址,忽略段长是保护关键。CPU访问时,先查段表得基址和段长,若段内偏移≥段长,则触发越界中断。
→ 怎么补:画段表结构图,标出“段长”字段,并注明“用于地址越界检查”。易漏点③:对换(Swapping)与页面置换(Paging)的本质区别
→ 为什么漏:混为一谈。对换是进程级操作,将整个进程换入/换出;页面置换是页面级操作,只换出一页。对换频率低(秒级),页面置换频率高(毫秒级)。
→ 怎么补:记口诀“对换搬全家,置换搬行李”。
5. I/O管理与文件系统:从设备控制到虚拟设备的抽象跃迁
5.1 I/O控制方式:从轮询到通道的效率革命
I/O效率瓶颈在于CPU与设备速度不匹配。四种方式演进:
- 程序I/O(轮询):CPU不断查询设备状态寄存器,直到就绪。CPU利用率≈0,纯属浪费;
- 中断驱动I/O:CPU发I/O命令后去干别的,设备就绪时发中断,CPU响应中断处理。CPU利用率提升,但每次中断开销大;
- DMA(直接内存访问):CPU初始化DMA控制器,DMA接管总线,直接在内存与设备间传数据块,完成后发中断。CPU只需干预一次;
- I/O通道:通道是专用处理器,CPU只需发一条通道命令(如“传送1000字节”),通道自行执行命令序列。CPU干预最少。
提示:考试问“哪种方式CPU干预最少”,答“I/O通道”;问“哪种方式适合大数据块传输”,答“DMA”。
5.2 SPOOLing技术:虚拟设备的实现原理与打印机案例
SPOOLing(Simultaneous Peripheral Operations On-Line)是虚拟设备的经典。其核心是用高速设备(磁盘)模拟低速设备(打印机),将独占设备变为共享设备。四部分详解:
- 输入井/输出井:磁盘上的存储区域,分别暂存输入数据和输出数据;
- 输入缓冲区/输出缓冲区:内存中的缓冲区,缓解CPU与磁盘速度差;
- 输入进程/输出进程:常驻内存的系统进程,负责数据搬运;
- 井管理程序:控制作业与井的数据交换。
打印机虚拟化流程:
- 用户进程发出打印请求 → 假脱机管理进程在磁盘缓冲区申请空闲块,存入数据;
- 创建假脱机文件,加入假脱机文件队列;
- 假脱机打印进程从队首取文件 → 将数据从输出井读入内存输出缓冲区 → 交付打印机。
关键点:打印机始终只与假脱机打印进程交互,多个用户进程通过“假脱机文件队列”间接共享打印机。
5.3 文件管理:逻辑结构、物理结构与目录实现的协同
文件系统是OS的“数据管家”,三层抽象:
- 逻辑结构:用户视角,如流式文件(无结构字节流)、记录式文件(有结构记录);
- 物理结构:磁盘视角,如连续分配(速度快但易碎片)、链接分配(无碎片但随机访问慢)、索引分配(折中,UNIX用i-node);
- 目录结构:文件组织方式,单级目录(简单但命名冲突)、两级目录(用户级+主目录)、树形目录(现代OS主流,支持路径名)。
i-node(索引节点)是UNIX/Linux精髓:每个文件对应一个i-node,存文件属性(权限、大小、时间)和直接/间接地址项。直接地址项指向数据块,间接地址项指向地址块。这样既支持小文件(直接寻址快),又支持大文件(间接寻址扩展)。
5.4 易错点:I/O与文件系统中3个隐蔽的实现细节
易错点①:DMA控制器中“字节数计数器”的清零时机
→ 为什么错:认为DMA启动后计数器自动清零。实际是CPU初始化DMA时写入字节数,DMA每传一个字节减1,减到0时发中断。若未清零,DMA会继续传无效数据。
→ 怎么补:记牢DMA初始化三步:① CPU送内存起始地址;② CPU送设备地址;③ CPU送字节数。易错点②:SPOOLing中“输入进程”与“用户进程”的并发关系
→ 为什么错:认为输入进程是用户进程的一部分。实际输入进程是OS常驻进程,独立于用户进程运行。用户进程只负责生成数据并提交给输入进程。
→ 怎么补:画时序图:用户进程→写数据到输入缓冲区→输入进程→从缓冲区读数据→写入输入井。易错点③:文件物理结构中“索引分配”的多重间接寻址层级
→ 为什么错:只知一级间接,忽略多级。如Linux ext4:12个直接块,1个一级间接块(存256个地址),1个二级间接块(存256×256个地址),1个三级间接块(256³个地址)。
→ 怎么补:考试若问“某文件大小超过直接块能存的范围,如何寻址”,答:“使用一级间接块,其中每个表项指向一个数据块”。
6. 复习清单:一份可执行的期末冲刺自查表
现在,合上笔记,拿出一张白纸,按以下清单逐项自测。这不是泛泛而谈的“多看书”,而是针对期末卷子上最常出现、最易失分、最需要肌肉记忆的点设计的行动清单。每完成一项,在旁边打钩,卡壳处立刻翻笔记对应章节——这才是高效复习。
6.1 核心概念闪电测(限时3分钟/题)
- [ ]默写操作系统四大特性定义及相互关系:并发(宏观同时微观交替)、共享(互斥/同时访问)、虚拟(时分/空分复用)、异步(停停走走)。关系:并发→共享→虚拟→异步。
- [ ]画出七态图并标注所有转换条件:重点检查“就绪挂起→就绪”需“对换”、“阻塞→阻塞挂起”需“对换+事件未发生”。
- [ ]写出记录型信号量的wait/signal伪代码,并解释value<0时的阻塞动作:value--后若<0,add_to_list()并block()。
- [ ]列出死锁四必要条件,并各举一个生活例子:互斥(厕所隔间)、请求保持(一边吃饭一边要筷子)、不可抢占(借出的书不能强抢)、循环等待(四人四筷围坐)。
6.2 算法手算实战表(每题限时5分钟)
用下面这组数据,手算四种调度算法的平均周转时间(结果保留1位小数):
| 进程 | 到达时间 | 服务时间 |
|---|---|---|
| A | 0 | 3 |
| B | 1 | 6 |
| C | 3 | 4 |
| D | 5 | 2 |
| 算法 | 计算过程
本文还有配套的精品资源,点击获取