操作系统期末试题解析:进程线程、分页与磁盘调度核心考点
发布时间:2026/11/6 2:36:16 锦皓数字建站

简介这是一份面向高校《操作系统》课程期末复习的真题资料聚焦西安电子科技大学本科期末考试适合正在备考、自测或需要查漏补缺的学生使用。资源包仅含1个PDF文件大小约118KB整理试题与答案解析便于在电脑或移动端直接查阅。试卷按闭卷、120分钟、满分100分设置共四大题包含选择题、填空题等题型其中选择题和填空题各20分考点涉及进程与线程、CPU调度、分页与虚拟内存、i-node、磁盘I/O、死锁条件、Linux权限及文件元数据等内容。题目采用英文题干配中文说明的形式借助配套答案解析读者可对照题目复盘概念、定位薄弱环节并熟悉命题方式。目前已有207人学习下载适合作为操作系统期末冲刺阶段的辅助练习材料对准备同类课程考试的学生也有一定参考价值。1. 操作系统这张卷子在考什么从一道页大小选择题说起有人把一道题发给我一个 32 位地址高 22 位是页号低 10 位是页内偏移问页多大、最多能有多少页。看着像算术题其实它问的是操作系统最核心的一次分房间动作——把一栋叫内存的大楼隔成一间间大小相同的房间再给每间房编号。所谓操作系统通俗地说就是压在所有硬件之上、又托着所有程序的那层软件往下管 CPU、内存、磁盘往上给程序提供你只管写逻辑的假象。为什么值得搞懂因为程序员日常遇到的一大半玄学——程序为什么突然卡住、内存明明够却报错、文件删了为什么还能捞回来——答案都藏在这层软件里。这套某高校《操作系统》期末试题与答案解析正好把这条主线上的关键节点各切了一刀题不难但每一刀都落在概念的分界线上。2. 进程与线程为什么哪些东西共享是最爱考的分界线2.1 进程不是一个程序副本而是一份资源账本初学者常把进程理解成正在运行的程序这句话只对了一半。程序是躺在磁盘上的一堆指令进程是这份指令被拉进内存、配上 CPU 时间、配上打开的文件、配上地址空间之后的那一整套家当。打个比方菜谱是程序厨师照着菜谱开火、占着灶台、用着锅碗这一整套正在发生的动作才是进程。所以进程在操作系统里承担两个身份它是资源分配的基本单位也是独立运行的基本单位。这两个身份绑在一起代价就是切换一次进程很贵——地址空间要换、页表要换、缓存要刷。线程就是从这个代价里长出来的把资源和执行拆开资源归进程执行归线程。同一进程里的多个线程共用一份地址空间和一堆打开的文件切换时不用换页表轻得多。卷子里那道以下哪一项不被进程中所有线程共享问的就是这条分界线的具体位置。答案落在寄存器上每个线程有自己的程序计数器和寄存器现场否则它就没法独立记录我执行到哪了。而地址空间、打开的文件、记账信息这些是整本账所有线程一起看。资源进程内线程是否共享说明地址空间共享全局变量、堆一个线程改了别的线程立刻看得见寄存器与栈私有每个线程要有自己的执行现场打开的文件共享文件描述符表属于进程记账信息共享CPU 时间、权限等属于进程整体这张表值得背下来的原因不是考试而是它直接决定了并发 bug 长什么样共享的东西才需要加锁私有的东西加锁纯属浪费。很多人写多线程代码翻车第一步就错在没分清哪块内存是大家共用的。2.2 线程的三种实现方式用户空间、内核、混合线程这个概念在纸上是统一的落到实现却分三条路卷子第二题考的就是这个。用户空间实现是运行时库自己在用户态维护一张线程表靠保存和恢复寄存器来切换内核从头到尾不知道有线程这回事在它眼里这就是一个普通的单线程进程。好处是切换不用陷入内核快坏处是一个线程发起阻塞式系统调用整个进程跟着睡而且没法真正利用多核。内核空间实现是线程表由内核维护创建和撤销线程都要走系统调用代价高一点但一个线程阻塞不影响别人多核也能真并行。混合实现是两边各留一张表若干个用户级线程多路复用到若干个内核级线程上试图两头占好处。这条线的考法往往是线程能否在用户空间实现正确答案是内核空间或用户空间都行因为两种做法在真实系统里都出现过。理解了三种实现你才能解释一个常见现象同样是多线程程序有的在一台机器上跑得飞起换一台就成了一条直线——那多半是用户级线程没拿到真正的并行度。2.3 三级调度与系统调用一次请求走完的路径卷子第三题问短期调度指什么答案是 CPU 调度。容易混的是三级调度的分工长期调度决定哪个作业被选中、创建成进程管的是进不进门中期调度决定进程要不要被换出内存管的是先出去待会儿短期调度决定当下哪个就绪进程拿到 CPU管的是现在谁上。日常口语里说的调度几乎都指第三种因为它发生得最频繁毫秒级一次。再往下追一层进程凭什么让内核替它干活靠系统调用。它是用户态和内核态之间那道正式的门口应用程序不能直接碰硬件只能递一张请求单进去内核验完身份、办完事、把结果递回来。一次典型的系统调用要走这么几步——用户程序调用库函数库函数把系统调用号放进约定的寄存器执行一条陷入指令把 CPU 切到内核态内核按号查表找到对应的处理函数执行完把返回值放回寄存器再切回用户态继续跑。/* 一次 read 系统调用的简化路径重点看态切换发生的位置 */ ssize_t read(int fd, void *buf, size_t count); /* 用户态准备参数把系统调用号写进寄存器 */ /* 陷入指令CPU 从用户态切到内核态跳转到内核固定的入口 */ /* 内核态按调用号查系统调用表找到 sys_read校验 fd 合法性 */ /* 内核态驱动去磁盘取数据可能阻塞调度器换别的进程上 CPU */ /* 返回结果写回寄存器CPU 切回用户态read 函数返回 */这段伪代码里最值得盯住的不是函数名而是态切换三个字。参数怎么传、号怎么查、结果怎么回都是围绕这一次跨越用户态与内核态边界设计的。参数说明也就三条fd是进程文件描述符表里的下标buf是用户态缓冲区地址内核要校验它确实属于这个进程count是希望读多少字节。理解了这条路径你就能回答为什么系统调用比普通函数调用慢——不是函数体复杂是过那道门本身有成本。3. 内存管理页号、偏移、TLB 是怎么被串成一条链的3.1 地址结构拆成两半页号与页内偏移分页的本质是把地址当成一个两位数来读高位是第几页低位是这一页里的第几个字节。所以那道题根本不用算看位数就行——低 10 位是偏移一页就是 2 的 10 次方1024 字节也就是 1K高 22 位是页号页数上限就是 2 的 22 次方4M 页。答案选页大小 1K、最多 4M 页那一项。把这个关系写成公式只有两句页大小 2^(偏移位数)页数上限 2^(页号位数)。反过来知道页大小求偏移位数就是取以 2 为底的对数。卷子第四大题给的页大小是 2K那么偏移占 11 位一页覆盖 2048 个字节第 0 页是 0 到 2047第 1 页是 2048 到 4095依此类推8 个虚拟页正好铺满 0 到 16K。PAGE_SIZE 2048 # 页大小 2K即偏移占 11 位 def split(addr): page addr // PAGE_SIZE # 页号向下取整 offset addr % PAGE_SIZE # 页内偏移取余 return page, offset for a in (8500, 1400, 5000, 2100): p, off split(a) print(a, - page, p, offset, off)这段代码干的事就是把一个十进制地址拆成页号和偏移两个分量除法取整得页号取余得偏移。跑出来的结果是8500 落在第 4 页、偏移 3081400 落在第 0 页、偏移 14005000 落在第 2 页、偏移 9042100 落在第 1 页、偏移 52。参数只有一个PAGE_SIZE它一变页号和偏移的切分位置全变——这也是为什么题目里页大小永远第一个给。拆完之后还要看页表的有效位。卷子给的页表里第 0、1、3、5 页标记为无效意味着落在这四页上的访问会触发缺页对应的虚拟地址区间就是 0 到 2K、2K 到 4K、6K 到 8K、10K 到 12K。有效页则继续做一次翻译物理地址 物理页框号 × 页大小 偏移。8500 在第 4 页、页框号是 3于是 3×2048308 得 64525000 在第 2 页、页框号是 12048904 得 2952。1400 和 2100 落在无效页上压根到不了算物理地址这一步——这就是有效位的意义它是一道闸门不是装饰。3.2 局部性原理虚拟内存为什么敢先欠着虚拟内存能成立靠的是一个经验观察程序在一段时间内只会反复访问地址空间里很小的一块。这叫局部性原理拆开是两半——时间局部性刚用过的数据很可能马上再用空间局部性用了一个地址紧挨着的地址多半也要用。循环体是典型例子一小段指令被执行几百万次数组也是按顺序扫过去的元素挤在相邻几页里。正因为如此操作系统才敢把暂时不用的页换到磁盘上只留一小部分在内存里造出我有很多内存的假象。这不是骗术是拿命中率换容量只要大多数访问都落在内存里那几页上偶尔一次缺页的代价就被摊薄了。卷子第六题问的正是这一点正确表述是程序在任一时刻只访问地址空间中相对小的一部分而不是程序按顺序执行代码或者连续访问大量变量——后两种说法都太绝对跳转和随机访问一样存在。提示判断一个说法是不是局部性就看它有没有强调一段时间内和相对小的一部分这两个限定。少了任何一个都是把统计规律说成了必然规律。顺着局部性往下走会碰到工作集这个概念一个进程在某个时间窗口内实际用到的那组页。它的意义在于给内存分配定一个可操作的下限——分给进程的页框数如果长期小于工作集就会陷入刚换进来又被换出去的抖动CPU 全耗在缺页处理上吞吐量断崖式下跌。很多机器明明有内存却卡成幻灯片的现场根子就在这里。3.3 TLB 是什么地址转换的随身小本子分页有个天然的成本每次访存都要先查页表查页表本身又是一次访存等于一次访问变两次。TLB 就是来削这个成本的。它的全称是转换检测缓冲区通俗地说就是 MMU 里的一小片高速缓存专门记住最近翻译过的那些页——虚拟页号对应哪个物理页框、有没有被改过、读写执行权限是什么。打个比方你每天上班要走固定的几条路第一次查地图之后就不用再查了脑子里记着。TLB 命中就是这个状态地址进来硬件拿虚拟页号一比直接得到物理页框号省掉一次内存访问。没命中才去查页表查完把结果塞回小本子下次再用。所以 TLB 的命中率高低直接决定地址转换的开销而命中率又取决于局部性——程序越集中地访问少数几页小本子越够用。这里有个容易被忽略的细节进程切换时 TLB 里那些条目属于旧进程必须失效或者打标记否则新进程会读到别人的地址映射。这也是进程切换比线程切换贵的原因之一线程共享地址空间页表和 TLB 可以接着用。把TLB 是缓存和TLB 需要随进程切换刷新这两件事放在一起看前面线程那一节讲的共享与私有就在硬件层面又对上了一回。4. 磁盘、文件与权限寻道时间、i-node 和 chmod 三件事4.1 一次磁盘读写的时间账为什么寻道时间说了算读一个磁盘块要花三段时间寻道时间磁臂移动到目标柱面旋转延迟目标扇区转到磁头底下数据传输时间真正把字节读出来。卷子第八题问哪个占主导答案是寻道时间。原因是机械动作慢磁臂挪一下是毫秒级盘片转半圈也是毫秒级而传一个块的数据往往是微秒级。差了三个数量级所以优化磁盘性能的第一刀永远砍在少挪磁臂上。这也就解释了三种调度算法存在的理由。拿卷子那道题的数据走一遍请求柱面依次是 10、22、20、2、40、6、38磁臂初始在 20每移动一个柱面 6 毫秒。先来先服务最老实按到达顺序走20→10→22→20→2→40→6→38移动量是 1012218383432合计 146 个柱面146×6 得 876 毫秒。它公平但完全不看位置来回横跳。最短寻道优先每次挑离当前位置最近的20→22→10→6→2→38→40移动量 21244362合计 60乘 6 得 360 毫秒。快了很多但它有个隐患——磁臂停在中间时远处的请求可能一直等不到饿死。电梯算法SCAN模拟电梯沿一个方向一路扫过去扫到头再掉头。题目说初始向上于是 20→22→38→40到顶后掉头往下去 10→6→2移动量 21623044合计 58乘 6 得 348 毫秒。算法访问顺序总移动柱面数寻道时间FCFS10,22,20,2,40,6,38146876 msSSTF22,10,6,2,38,4060360 msSCAN向上22,38,40,10,6,258348 ms这张表里 SSTF 和 SCAN 只差 12 毫秒但两者的性质完全不同SSTF 是贪心每一步都最优整体不一定最优还可能饿死远处请求SCAN 是有方向感牺牲一点局部最优换来公平。真实的磁盘调度器往往在这个谱系之间取折中因为请求不是静态的一批而是源源不断进来的。4.2 i-node 与目录项文件名只是门牌不是房子文件系统这块最容易懵的是 i-node。通俗地说i-node 是文件的档案袋里面装着这个文件的全部元数据——所有者、权限、大小、时间戳以及数据块都散落在哪些位置。而目录项里装的不是文件内容甚至不是完整档案只是两样东西文件名和指向档案袋的编号。卷子第七题就是拿这个结构算上限目录项里文件名占 14 字节i-node 号占 2 字节2 个字节能表示的编号范围是 2 的 16 次方也就是 64K所以单个文件系统的文件数上限是 64K。这题的考点不在乘法在于你知不知道文件数上限由 i-node 号的位数决定而不是由磁盘容量决定。这个设计带来一个反直觉的后果文件名和文件本身是分离的。同一个 i-node 可以挂多个名字这就是硬链接删掉一个名字档案袋还在直到所有名字都没了、链接计数归零数据块才真正释放。所以文件删了还能恢复不是玄学是档案袋还没被回收。反过来重命名一个文件几乎瞬间完成因为改的只是目录项里那行名字数据块一个都没动。4.3 chmod 的权限位744 和 644 差在哪Linux 的权限用三位八进制数表示依次是所有者、所属组、其他人每一位又拆成读、写、执行三个比特对应数值 4、2、1。三者相加就是这一位的数字所以 7 就是读加写加执行6 是读加写4 是只读。卷子第九题要求所有者可读写执行其他人只能读翻译过来所有者位 4217组位 4其他位 4合起来就是 744。常见的 644 是所有者读写、其他人只读区别就在于所有者少了执行权限755 则是所有者全权限、其他人可读可执行通常给目录和可执行文件用。# 三位八进制所有者 / 组 / 其他人每一位是 r4 w2 x1 的和 chmod 744 report.txt # 所有者 rwx组和其他人只有 r chmod 644 report.txt # 所有者 rw-组和其他人只有 r chmod 755 run.sh # 所有者 rwx其他人 r-x脚本常用 # 反查把数字拆回权限位 # 7 421 rwx # 6 42 rw- # 4 4 r--这段命令里chmod后面第一个参数是权限第二个是目标文件。要留意的是目录上的权限含义不同读表示能列目录执行表示能进去写表示能在里面增删文件所以目录一般给 755 而不是 644。参数改错一位后果差别很大——把可执行文件的 x 去掉运行时就报权限不够这种坑几乎每个刚上手命令行的人都踩过一次。5. 常见误区五个最容易记反的操作系统概念5.1 误区一短期调度就是作业调度易混点长期、中期、短期三个词都带调度字面上看不出谁管什么。为什么混中文翻译把 long-term、medium-term、short-term 直译过来而英文里的长短指的是调度发生的频率不是重要性。怎么区分记频率。长期调度最少发生一个作业进来才触发一次它决定谁被创建成进程中期调度在内存紧张时发生决定把谁换出去短期调度每几十毫秒就发生一次决定 CPU 给谁。频率越高管的粒度越细短期调度管的是这一瞬间所以它等于 CPU 调度。5.2 误区二虚拟内存大程序就能一次全装下易混点把虚拟地址空间大理解成物理内存被变大了。为什么混操作系统确实营造了你有一大片连续内存的假象假象太成功容易忘了它是假的。怎么区分虚拟内存的本质是用磁盘换容量能装下多少活跃数据最终取决于物理内存页框数和工作集大小。地址空间是上限不是承诺一旦程序的实际工作集超过分到的页框就会抖动表现是 CPU 占用高但吞吐极低。5.3 误区三DMA 就是更快的中断易混点程序控制 I/O、中断驱动 I/O、DMA 三种方式后两种都能让 CPU 腾出手容易被归成一类。为什么混它们的表象都是CPU 不用死等。怎么区分看数据搬运是谁干的。程序控制 I/O 是 CPU 亲自一个字节一个字节搬全程盯着中断驱动 I/O 是 CPU 先干别的设备就绪了发中断叫它回来搬搬的动作还是 CPU 做DMA 是数据块在内存和设备之间由专门的控制器直接搬CPU 只在开头交代一句、结尾收个结果中间完全不参与。卷子第十题问哪种方式不需要 CPU 参与数据块传输答案就是 DMA。5.4 误区四信号量和管程是一回事易混点两者都用来解决互斥和同步都能实现生产者消费者。为什么混解决的问题相同就以为机制相同。怎么区分信号量是一把锁加一个计数器P 和 V 是两个原子操作用的人必须自己记得在每条路径上都配对调用漏一个就死锁管程是把共享数据和操作打包成一个模块编译器或运行时保证同一时刻只有一个进程在里面活动互斥是自动的使用者只需要操心什么时候等待、什么时候唤醒。通俗地说信号量靠自觉管程靠门禁。卷子那道生产者消费者的填空考的就是信号量式的写法缓冲区满时生产者要while (buffer ! 0) pthread_cond_wait(condc, the_mutex)等着放完数据要pthread_cond_signal(condc)叫醒消费者最后别忘了pthread_mutex_unlock。这三步少任何一步程序要么卡死要么数据错乱。而如果用管程来写锁的获取和释放由机制兜底人只需要写满了就等、空了就通知。5.5 误区五银行家算法算的是现在有没有死锁易混点把安全状态和无死锁画等号。为什么混两者确实相关不安全状态听起来就像已经出事了。怎么区分安全状态指的是存在至少一个执行序列能让所有进程都顺利跑完它是一个关于未来的判断死锁是已经发生的僵局。系统可以处于不安全状态但暂时还没死锁只是再往前走一步就可能进坑。所以银行家算法的动作是预演把请求先假装分配下去看还能不能找到一条让所有进程跑完的序列找得到就批准找不到就让它等。它防的是未来不是治现在。6. 什么时候该拿这套题练手三种场景和一条止损线这套题最适合的场景是课听完了、书翻过一遍但脑子里还是一团浆糊的阶段。它题量不大四大题型各管一段认知选择题逼你辨析概念边界填空题逼你记住术语的准确说法简答题逼你把流程讲成话综合题逼你把公式落到具体数字上。四段走完哪块是真空的一目了然。你的状态适不适合用这套题原因刚学完一遍概念还在打架适合选择题专治似懂非懂错一道就暴露一个盲点复习到后期想查漏适合综合题覆盖页表、调度、死锁、并发四大高频计算完全没入门术语全靠猜先别用直接看答案只会记住结论换个数字照样不会想靠背答案应付别用这套题的答案带解析解析里的推导过程才是值钱的部分第一类人建议按题型刷别按顺序刷先做选择题把错的题在教材目录上标出来回头只读那几节再做综合题每道题动笔算完再对答案尤其是页表那题光看页号 4、偏移 308是没用的得自己把 8500 除以 2048 除一遍把 8 个虚拟页的地址区间一段段写出来。第二类人可以掐时间做120 分钟的卷子压缩到 90 分钟练的是熟练度而不是理解力。有一条止损线要划清楚如果一道综合题你看了答案、合上、隔天再做还是卡在同一步那就不是题的问题是那一节的概念没通回去补概念比继续刷题有效得多。反过来如果答案一看就懂、自己写就漏步骤那才是纯粹的手熟问题多写两遍就行。这两种情况经常被混为一谈结果就是有人在已经懂的地方反复刷有人在没懂的地方硬背。我自己踩过的坑是页表那道题第一次做的时候我觉得页号等于地址除以页大小这句话天经地义直接心算了个大概就翻答案结果 5000 除以 2048 顺手写成了 3。后来才发现问题不在除法而在我压根没把有效位当回事——第 3 页是无效的算出页号 3 的那一刻其实就该警觉。从那以后我每做一道地址翻译题都强制走一遍固定流程先写页大小和偏移位数再算页号和偏移然后翻有效位最后才动物理地址。四步一步不跳慢是慢了点但再没在这类题上翻过车。如果你手上正缺一套能把概念、计算、流程串起来练的操作系统期末题这套带答案解析的资料就放在下载页里拿去按上面说的顺序过一遍比漫无目的地翻书效率高得多。希望帮到你。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。