简介:这份资源是西安电子科技大学《操作系统》课程的期末试题及答案解析,面向正在备考操作系统期末、需要熟悉西电命题风格与题型分布的高校学生,尤其适合计算机相关专业本科生用于考前自测与查漏补缺。压缩包内共1个PDF文件,大小约118KB,内容为完整试卷与配套解析,涵盖选择、填空等题型,涉及线程实现、进程与CPU调度、分页内存管理、虚拟内存局部性原理、UNIX i-node、磁盘访问时间、Linux权限位、DMA与中断驱动I/O、死锁四个必要条件、信号量原子操作、地址绑定阶段等核心考点,并附有参考答案与解析思路。已有207人学习下载,可作为期末复习阶段对照教材梳理知识框架、检验掌握程度的实用材料,帮助读者快速定位薄弱章节并理解典型题目的解题逻辑。
1. 一份把操作系统考点拆到位的期末真题包
期末周翻操作系统,最怕的不是没资料,而是资料只有题没有解。这份《操作系统》期末试题及答案解析,把四大题型——选择、填空、简答、综合——连同逐题解析一起打包,覆盖进程线程、内存分页、虚拟存储、死锁、磁盘调度、文件系统、I/O 控制这些高频考点。它适合两类人:一是正在备考、需要按题型刷一遍找手感的学生;二是已经工作、想回头把操作系统底层概念重新捋顺的开发者。题量不大,但每道题背后都挂着一个能展开的知识点,解析写得比题目本身更有价值,尤其是综合题里的银行家算法和页面置换计算,步骤给得比较完整,照着推一遍能省不少翻教材的时间。
2. 选择题与填空题:从题目反推知识框架
2.1 选择题的十个考点分布
选择题共 10 道、每题 2 分,看似零散,实际把操作系统的骨架串了一遍。第 1 题考计算机系统组成,答案落在硬件,这是最基础的一层;第 2 题线程实现方式,用户空间和内核空间都能实现,选 C 而不是单选某一侧,说明出题人想确认你是否理解两种模型的并存关系;第 3 题短期调度就是 CPU 调度,这里容易和作业调度、内存调度混淆,三级调度的区分是必考点。
第 4 题问进程内线程不共享什么,答案是寄存器——地址空间、打开文件、记账信息都是进程级共享,寄存器是线程私有的执行上下文。第 5 题是分页地址结构,31 到 10 位是页号、9 到 0 位是偏移,偏移 10 位意味着页大小 1K,页号 22 位意味着最多 4M 页,答案 B。这道题的关键不是背答案,而是会从位宽反推页大小和页数:
页内偏移位数 = 10 → 页大小 = 2^10 = 1K 页号位数 = 22 → 最大页数 = 2^22 = 4M第 6 题局部性原理,正确表述是“程序在任一时刻只访问地址空间中相对小的一部分”,D 选项。第 7 题 i-node 目录项,文件名 14 字节、i-node 号 2 字节,2 字节编号决定文件数上限 2^16 = 64K,答案 A。第 8 题磁盘块读写时间三因素里寻道时间占主导,A。第 9 题 chmod 权限位,属主读写执行、其他只读,7-4-4 即 744,B。第 10 题不需要 CPU 参与数据块传输的是 DMA,B。
这十道题的价值在于它们构成了一张考点地图:系统组成、线程模型、调度层次、线程私有资源、分页地址、局部性、文件系统索引、磁盘性能、权限位、I/O 方式。刷的时候不要只记选项,把每个错误选项为什么错也写一遍,等于把十个知识点各复习了两遍。
2.2 填空题的八个记忆锚点
填空题 8 道、每题 2 分,考的是定义级记忆。操作系统是扩展机器和资源管理器;并行系统分对称多处理和非对称多处理;信号量的两个原子操作是 P 和 V;地址绑定发生在编译、加载、执行三个阶段;死锁四个条件里除了互斥、占有并等待、非抢占,还差循环等待;磁盘 0 号扇区是主引导记录 MBR;Linux 文件元数据存在 i-node;安全目标包括机密性、完整性和可用性。
这几道题看着简单,但“地址绑定三阶段”和“死锁四条件”是简答题和综合题的地基。建议把填空答案当成索引词,每个词往回翻一页教材,比如看到“执行时绑定”就想到动态重定位和基址寄存器,看到“循环等待”就想到资源有序分配法。填空题丢分往往不是不会,而是写错字或漏写,比如把“非对称多处理”写成“非对称处理”,阅卷时容易判错。
提示:填空题的答案要按教材原话记,尤其是“资源管理器”“主引导记录”这类固定表述,自己改写容易失分。
3. 简答题:五个必背概念的答题结构
3.1 系统调用与进程状态图
简答题 5 道、每题 4 分,分值不高但覆盖面广。系统调用这道题,答题要分两层:先定义——内核提供给用户程序的一组接口,把应用请求转给内核处理再返回结果;再举例——比如读文件时用户程序调用 read,触发陷入内核,内核根据文件描述符找到 i-node、检查权限、发起磁盘 I/O,数据就绪后拷回用户缓冲区。举例部分要写出“陷入内核—参数传递—内核处理—返回用户态”这条链,光写定义拿不满分。
进程状态图是经典题,三个基本状态:运行态、就绪态、阻塞态。运行态是占有 CPU 正在执行;就绪态是万事俱备只差 CPU;阻塞态是等待 I/O 或事件,即使给 CPU 也跑不了。状态转换要画清楚:就绪到运行是调度,运行到就绪是时间片到,运行到阻塞是等待事件,阻塞到就绪是事件完成。这里有个容易漏的点——阻塞态不能直接到运行态,必须先回就绪队列,这个细节写上去能体现理解深度。
3.2 管程、TLB 与两种 I/O 的对比
管程这道题,定义是一个由过程、变量和数据结构组成的模块,任一时刻只允许一个进程在管程内活跃,从而天然实现互斥。能不能用管程实现数据结构?可以,典型就是管程里维护一个条件变量队列,生产者消费者各挂一个条件变量,进入管程自动加锁、离开自动释放,比手写信号量少很多出错空间。答题时把“互斥由编译器或运行时保证”这一点点出来,比只背定义更有说服力。
TLB 是转换检测缓冲区,本质是页表项的高速缓存,放在 MMU 里,记录虚拟页号到物理页框的映射以及修改位、保护码。它的作用是减少访问页表的次数,命中时一次访存就能完成地址转换,未命中才走多级页表。答题要强调“缓存的是页表项,不是数据”,这是最常见的概念混淆点。
程序控制 I/O 和中断驱动 I/O 的区别,核心在 CPU 是否被占住。程序控制 I/O 由 CPU 主动轮询状态寄存器,设备没就绪就一直等,CPU 全程被占用;中断驱动 I/O 在设备就绪时发中断通知 CPU,等待期间 CPU 可以调度其他进程。答题时用“轮询 vs 中断”“CPU 空转 vs CPU 复用”这两组对比,比大段描述更清晰。
4. 综合题:银行家算法、磁盘调度与分页计算怎么下手
4.1 生产者消费者代码填空
综合题第 1 题是 pthread 实现的生产者消费者,六个空。先看结构:生产者加锁后,如果缓冲区非空就等待 condp,所以①是buffer != 0;生产完赋值 buffer = i,然后要唤醒消费者并解锁,②是pthread_cond_signal(&condc),③是pthread_mutex_unlock(&the_mutex)。消费者加锁后,如果缓冲区为空就等待 condc,④是buffer == 0,⑤是&condc;消费完把 buffer 置 0,唤醒生产者,⑥是pthread_mutex_unlock(&the_mutex)。
/* 生产者关键段 */ pthread_mutex_lock(&the_mutex); while (buffer != 0) /* ① 缓冲区非空则等待 */ pthread_cond_wait(&condp, &the_mutex); buffer = i; pthread_cond_signal(&condc); /* ② 唤醒消费者 */ pthread_mutex_unlock(&the_mutex); /* ③ 释放锁 */ /* 消费者关键段 */ pthread_mutex_lock(&the_mutex); while (buffer == 0) /* ④ 缓冲区空则等待 */ pthread_cond_wait(&condc, &the_mutex); /* ⑤ 等 condc */ res = buffer; buffer = 0; pthread_cond_signal(&condp); /* 唤醒生产者 */ pthread_mutex_unlock(&the_mutex); /* ⑥ 释放锁 */这段代码的坑在 while 而不是 if:条件变量可能被虚假唤醒,醒来后必须重新检查条件,用 if 会直接往下走导致数据错乱。另外pthread_cond_wait内部会先释放互斥锁再睡眠,被唤醒后重新加锁,所以调用前必须已经持有锁,这一点填空时不用写,但理解它才能记住为什么解锁放在 signal 之后。
4.2 银行家算法的三步走
第 2 题给了一张 Allocation、Max、Available 的表,三问:求 Need 矩阵、判断是否安全、P1 请求 (0,4,2,0) 能否立即满足。Need = Max − Allocation,逐行减出来即可。安全判断用安全性算法:拿 Available 去试每个进程的 Need,能满足就假设它跑完并释放资源,把 Allocation 加回 Available,标记该进程,重复直到所有进程标记或无法推进。
这道题原解析给出的结论是当前状态不安全,因为按 Available 推进只能标记 P0 和 P3,剩余资源满足不了其他进程。而 P1 请求 (0,4,2,0) 反而可以批准,因为批准后存在安全序列 P0、P3、P1、P2、P4。这里有个反直觉点:当前不安全不等于不能批准新请求,银行家算法判断的是“批准后是否仍存在安全序列”,不是“当前是否安全”。答题时把试分配、改 Available 和 Need、再跑一遍安全性算法这三步写全,分才拿得稳。
Need[i] = Max[i] - Allocation[i] 试分配:Available -= Request; Allocation[P1] += Request; Need[P1] -= Request 安全性检查:Work = Available,找 Need <= Work 的进程,Work += Allocation,标记 若所有进程可标记 → 安全,批准;否则回滚4.3 磁盘调度三种算法的计算
第 3 题磁道请求序列 10、22、20、2、40、6、38,初始磁头在 20,每移动一个柱面 6ms。FCFS 按到达顺序走:20→10→22→20→2→40→6→38,移动量 10+12+2+18+38+34+32 = 146,乘 6 得 876ms。SSTF 每次选最近的:20→22→10→6→2→38→40,移动量 2+12+4+4+36+2 = 60,乘 6 得 360ms。SCAN 初始向上:20→22→38→40 再折返→10→6→2,移动量 2+16+2+30+4+4 = 58,乘 6 得 348ms。
三种算法的差距很直观:FCFS 最老实但最慢,SSTF 贪心最短但可能饿死远端请求,SCAN 像电梯一样来回扫,兼顾吞吐和公平。计算时最容易错的是把初始位置 20 也算进移动量,或者折返点算错。建议在草稿上画一条数轴,把访问顺序标出来,相邻两点取绝对值再累加,比心算靠谱。
4.4 分页地址转换的四个小问
第 4 题页大小 2K,4 个物理页框,8 个虚拟页,页表给了有效位和物理页号。第一问列虚拟地址范围:页 0 是 0K–2K,页 1 是 2K–4K,依此类推到页 7 是 14K–16K。第二问哪些范围会缺页:有效位为 No 的页 0、1、3、5,对应 0K–2K、2K–4K、6K–8K、10K–12K。第三问给四个虚拟地址求物理地址,方法是先除页大小得页号、取余得偏移,再查页表拿物理页号,物理地址 = 物理页号 × 页大小 + 偏移。
8500:页号 = 8500 / 2048 = 4,偏移 = 8500 % 2048 = 308 页 4 有效,物理页 3 → 3 × 2048 + 308 = 6452 1400:页号 = 0,偏移 = 1400 → 页 0 无效,缺页 5000:页号 = 2,偏移 = 904 → 页 2 有效,物理页 1 → 1 × 2048 + 904 = 2952 2100:页号 = 1,偏移 = 52 → 页 1 无效,缺页这道题的血泪经验是单位统一:页大小 2K 就是 2048 字节,地址都是十进制,别中途换成十六进制又换回来。另外缺页的地址不用算物理地址,直接写“缺页”即可,多算反而容易画蛇添足。
5. 避坑与排查:五条考场和复习中的真实翻车记录
现象:选择题第 5 题算成页大小 2K、页数 8M。原因是从 31 到 10 数了 22 位却当成 21 位,或者把偏移 10 位记成 11 位。解决:位宽计算固定用“末位减首位加一”,31−10+1=22 位页号,9−0+1=10 位偏移,先写位数再算 2 的幂,别跳步。
现象:银行家算法判断安全时,把 Available 直接和 Max 比。原因:混淆了 Need 和 Max,安全性算法比较的是 Need 不是 Max。解决:先把 Need 矩阵完整算出来写在草稿上,后续所有比较只查 Need 表,Max 表算完就不要再看了。
现象:磁盘调度 SCAN 算出的移动量和答案差一截。原因:漏掉了折返后从 40 回到 10 的那段长距离,或者把初始 20 重复计入。解决:画数轴标出访问序列,相邻点取差值累加,折返点单独标出来核对。
现象:生产者消费者填空把 while 写成 if,或者 signal 和解锁顺序颠倒。原因:没理解条件变量虚假唤醒和 wait 内部释放锁的机制。解决:记住“wait 前必须持锁、wait 醒来重查条件、signal 后解锁”这三条,while 是硬性要求。
现象:分页题把 8500 的页号算成 4.15 之类的小数。原因:用了浮点除法而不是整除取余。解决:页号用整数除法//,偏移用取模%,两个结果都必须是整数,算完用“页号 × 页大小 + 偏移 = 原地址”回代验证。
6. 把这份真题用出复利:三遍刷题法与自测表
第一遍按题型刷,不计时,目的是把每道题背后的知识点翻出来。选择题错一道就在旁边写错误选项为什么错;填空题写不出就回教材找原句;简答题先自己写一遍再对照解析补漏;综合题重点看步骤分怎么给。这一遍不求快,求的是把十个选择题考点、八个填空锚点、五个简答概念、四道综合题型全部过一遍。
第二遍按套卷刷,计时 120 分钟,模拟闭卷。这一遍暴露的是时间分配问题:选择题和填空题控制在 30 分钟内,简答题 30 分钟,综合题留 60 分钟。综合题里银行家算法和分页计算最耗时,先做有把握的,磁盘调度放最后。做完对答案,把第二遍还错的题单独抄到一张纸上。
第三遍只刷错题纸,考前两天过一遍。这时候不看解析,只看题目能不能独立写出完整步骤。下面这张自测表可以贴在书桌前,每过一遍打一个勾:
| 考点 | 对应题号 | 第一遍 | 第二遍 | 第三遍 |
|---|---|---|---|---|
| 线程实现与私有资源 | 选 2、选 4 | |||
| 分页地址结构 | 选 5、综 4 | |||
| 局部性与虚拟存储 | 选 6 | |||
| i-node 与文件系统 | 选 7、填 7 | |||
| 磁盘调度计算 | 选 8、综 3 | |||
| 权限位与 chmod | 选 9 | |||
| I/O 控制方式 | 选 10、简 5 | |||
| 死锁四条件与银行家 | 填 5、综 2 | |||
| 信号量与管程 | 填 3、简 3、综 1 | |||
| 系统调用与进程状态 | 简 1、简 2 |
这张表的好处是把“我复习了”变成“我哪块还没过第三遍”,考前一眼就能看出薄弱点。我自己的习惯是第三遍只做表里没打勾的行,打勾的连题目都不看,省下来的时间全砸在银行家算法和分页计算上,因为这两类题步骤多、容错低,多推一遍就多一分把握。从那以后我每次带人复习操作系统,都强制先做一遍这张表再决定刷什么,避免在已经会的题上反复消耗。希望帮到你。
本文还有配套的精品资源,点击获取