尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
操作系统期末试卷高频考点解析:进程线程、虚拟内存与死锁
简介这份西安电子科技大学《操作系统》期末试题及答案解析PDF面向计算机相关专业本科生及备考操作系统课程的学生用于期末复习、考点自查与考前模拟。内容覆盖进程与线程调度、分页存储管理、虚拟内存与局部性原理、UNIX i-node结构、磁盘访问时间、Linux文件权限、DMA传输以及死锁四个必要条件等高频知识点并配有答案解析便于按题回溯概念、定位薄弱环节。全套为1个PDF文件体积约118KB轻量便携适合在电脑或平板上随时翻阅。已有207人学习可作为熟悉西电课程题型分布、英文题干表达与答题思路的参考样卷。1. 操作系统到底是什么一间永远在抢座的自习室用过电脑的人多少有过这种疑惑只是双击了一个图标背后却牵出进程、分页、信号量一堆词翻开卷子还全是要算的题。把操作系统想成一间自习室的管理员就顺了座位是内存台灯是 CPU进进出出的人流是磁盘读写谁先坐、坐多久、两个人同时抢一张桌子怎么办全归它管。一句话定义操作系统是夹在硬件和应用程序之间的一层软件它干两件事——把零散的硬件包装成一套好用的接口业内叫“扩展机器”把 CPU、内存、磁盘这些有限资源分配出去业内叫“资源管理器”。这份试卷考的其实就是这两件事的具体规则。参考文章2. 进程、线程与调度为什么线程不是“小一号的进程”先看一道选择题一个进程里所有线程共享的东西下面四个选项里哪个不是答案是寄存器。这个选项之所以常被选错是因为很多人心里默认“线程就是一个轻量级进程”既然都是进程那资源自然一样。可只要想清楚线程存在的理由——让同一个地址空间里能同时推进多条执行流——就会发现寄存器恰恰不能共享因为寄存器记录的是“当前执行到哪一行”两条执行流各走各的路共用一张路线图就乱套了。把这一章的内容理顺你会同时拿下试卷里的选择题第 2、3、4 题和问答题第 1、2 题。2.1 程序还在硬盘上时它还什么都不是一个.exe或者一个 ELF 文件说到底就是一堆指令加上一些数据是一份静态的说明书。它被加载进内存、分配了运行所需的上下文之后才真正“活”过来成为进程。所谓上下文包括程序计数器指到哪一条指令、各个寄存器的值、函数调用的栈、已经打开的文件、占了多久 CPU 这些信息。内核为每个进程维护一份结构体来保存这些东西业内叫进程控制块。进程最经典的状态模型只有三个圈运行态、就绪态、阻塞态。运行态表示 CPU 正在执行它就绪态表示万事俱备只差一个 CPU阻塞态表示它在等某件事比如等磁盘读完一块数据、等用户敲键盘。当前状态触发事件转移到就绪被调度器选中运行运行时间片用完或被更高优先级抢占就绪运行发起 I/O 请求或等待某个事件阻塞阻塞等待的事件完成就绪这张表里最容易被忽略的一条是阻塞态不能直接跳到运行态。哪怕它等的事件已经完成也必须先回到就绪队列排队重新被调度器选中才能跑。原因很直白CPU 此时可能正被别的进程占着事件完成只意味着“有资格跑了”不代表“马上就能跑”。画进程状态图时漏掉这一条问答题直接少一半分。2.2 线程共享什么一道选择题背后的账本一个进程里开三条线程它们像三个人共用一间办公室。办公室本身地址空间包括代码段、数据段、堆是共用的文件柜已打开的文件是共用的墙上贴的考勤表记账信息比如 CPU 使用时间、用户 ID也是共用的。但每个人手里那张写着“下一步做什么”的便签也就是程序计数器必须各写各的每个人自己的草稿纸也就是栈也必须各用各的。为什么栈不能共享因为函数调用是嵌套的A 线程正在执行某个函数压了一层返回地址B 线程如果也用同一个栈两边的返回地址就会互相覆盖函数一返回就跳到不知道哪里去了。寄存器同理它保存的是瞬时状态两条执行流交替推进共享就必然翻车。import threading counter 0 # 全局变量在进程地址空间里所有线程都能看见 def worker(n): global counter local n # 局部变量放在本线程自己的栈上别的线程看不见 for _ in range(100000): counter 1 # 没加锁两个线程同时读改写结果往往小于 200000 print(local) t1 threading.Thread(targetworker, args(1,)) t2 threading.Thread(targetworker, args(2,)) t1.start(); t2.start() t1.join(); t2.join() print(counter)这段代码里counter是共享的那一类local是独占的那一类。counter 1在没有加锁时不是一步完成的原子操作它要先读出旧值、加一、再写回去两个线程交错执行就会丢掉一些自增。这正是“共享”带来的代价也是后面信号量那一章要解决的问题。参数说明threading.Thread创建的是同一进程内的线程args传进去的值会变成各自的局部副本。如果你把local改成全局变量再打印看到的就不是 1 和 2而是最后一次写入的值——这也是理解共享边界最直观的实验。2.3 用户级线程和内核级线程差别在内核知不知道线程可以在用户空间实现也可以在内核里实现两者都能跑但代价完全不同。用户空间实现的线程靠一个运行时库来调度内核压根不知道线程的存在在它眼里这就是一个普通的单线程进程。好处是切换极快不用陷入内核纯用户态几条指令就换过去了坏处也很明显如果其中一个线程发起阻塞式系统调用内核会把整个进程挂起其他线程陪着一起等而且内核只认一个执行流多核机器上没法真正并行。内核里实现的线程创建和撤销都要走系统调用内核维护一张线程表来做调度。好处是一个线程阻塞不影响别人多核也能真并行坏处是每次创建、切换都得进内核开销比用户级大不少。还有一种混合做法每个内核级线程上挂一组用户级线程轮流使用。试卷第 2 题问“线程可以在哪里实现”答案是两者都行正是因为这三种方案都真实存在。2.4 三级调度长期、中期、短期各管什么调度这个词在操作系统里出现了三次管的事情完全不同混着用就说不清了。名称别名管什么发生频率长期调度作业调度从后备作业里挑一个创建进程让它进来最低中期调度内存调度决定某个进程是否被换出内存、何时换回中等短期调度CPU 调度从就绪队列里挑一个进程把 CPU 给它最高表格里最要紧的是最后一行。平时说的“调度算法”比如先来先服务、时间片轮转、多级反馈队列讲的都是短期调度。有人把短期调度答成“线程调度”或“作业调度”就是被这三个名字绕晕了。短期调度发生在每次时间片用完、每次 I/O 完成、每次进程主动让出 CPU 的时候一秒钟可能发生几百次所以算法必须足够快这也是为什么它通常只做简单的优先级比较。2.5 系统调用一次读文件要过几道门应用程序不能直接操作硬件它得请内核代劳。内核对外暴露的那组入口就是系统调用。整个流程大致是四步用户程序把参数放到约定好的寄存器或者栈上执行一条陷入指令CPU 从用户态切换到内核态内核根据系统调用号查表找到对应的处理函数执行处理完把返回值放回寄存器切回用户态继续跑。#include fcntl.h #include unistd.h int main(void) { char buf[64]; int fd open(data.txt, O_RDONLY); // 系统调用内核检查路径、权限返回文件描述符 int n read(fd, buf, sizeof(buf)); // 系统调用内核把磁盘数据拷进用户缓冲区 write(1, buf, n); // 系统调用写到标准输出 close(fd); // 系统调用释放描述符 return 0; }这四行代码每一步都在跨越用户态和内核态的边界。open里内核要查目录、验权限、在进程的文件描述符表里占一个位置read里内核可能要把进程挂起等磁盘等数据到了再拷到用户空间这里就出现了“运行态到阻塞态再回就绪态”的完整迁移。参数说明fd是内核返回的一个小整数本质是描述符表的下标buf是用户空间的地址内核往里写数据前会做一次地址合法性检查防止用户传一个内核地址进来。提示问答题里写“系统调用的步骤”只写“应用程序请求内核帮忙”是拿不到分的至少要落到参数传递、状态切换、查表分发、返回结果这四步。3. 内存管理8G 内存为什么能跑 20G 的程序这个问题几乎是每个初学操作系统的人都会问的我电脑 8G 内存怎么同时开着浏览器、编辑器、音乐播放器加起来早超了答案藏在“虚拟”两个字里。每个进程看到的地址空间都是假的、连续的、从零开始的一大片真正落到物理内存上的是其中正在用的那一小部分剩下的要么躺在磁盘上要么根本还没被碰过。这一章把这条链路拆开看。3.1 页号和偏移那串 31 到 0 的位到底在算什么分页的本质是把地址切成两段高位是页号低位是页内偏移。页内偏移的位数决定了页有多大页号的位数决定了最多能有多少页。试卷里那道题给出的地址结构是第 31 位到第 10 位为页号、第 9 位到第 0 位为偏移。低 10 位能表示 0 到 1023所以页大小是 2 的 10 次方也就是 1K 字节页号占 22 位能表示 2 的 22 次方也就是 4M 个页面。答案选“页大小 1K最多 4M 页”。这道题的坑在于顺序。有人先看到“1K”觉得太小不可能转头去选 4K也有人把 22 位当成页大小的指数算出一个离谱的数。记住一条偏移位宽决定页大小页号位宽决定页数量两者是分开算的。偏移位数页大小页号位数最多页数101K224M112K212M124K201M3.2 局部性原理虚拟内存敢这么玩的底气如果程序真的均匀地访问整个地址空间虚拟内存这套把戏一天都撑不下去因为每次访问都可能缺页磁盘根本来不及。它能成立全靠程序自己“讲道理”一段时间内程序只访问相对小的一段地址空间。这件事分两面看。时间局部性是说刚被访问过的指令和数据很可能马上还会被访问比如循环体里的计数器、反复调用的函数。空间局部性是说一个地址被访问了它附近的地址大概率也快被访问了比如遍历数组、顺序执行指令。正因为如此操作系统才敢只把常用的那几页留在内存里其余的放到磁盘上。等真访问到不在内存的页再触发一次缺页把它换进来。这个“常用页的集合”就是工作集工作集越大缺页越频繁程序就越慢。写完一段死循环疯狂扫一个大数组的代码机器突然卡成幻灯片多半就是这个原因。3.3 TLB把查表结果记在小本子上有了分页每次访问内存其实要访问两次先查页表找到物理页框号再拿物理地址去取数据。这就把访存次数翻了一倍性能上没法接受。TLB 就是来解决这个问题的。它是内存管理单元里的一块小型硬件缓存表项很少通常只有几十到几百条每条记着虚拟页号、对应的物理页框号、这一页有没有被改过、以及读/写/执行的保护码。程序访问一个地址时硬件先拿虚拟页号去 TLB 里比一下命中就直接得到物理页框号一步到位没命中才去内存里查页表查到之后再把结果塞回 TLB。用一个生活化的比方页表是图书馆的总目录翻一次要走到大厅TLB 是你桌上的便利贴写着最近常借的那几本书在哪个架子上。绝大多数时候你看便利贴就够了偶尔才需要跑一趟大厅。3.4 一次地址转换的完整走法拿试卷里那组数据走一遍。页大小 2K2048 字节内存里只有 4 个页框进程需要 8 个虚拟页页表里标记了每页是否有效、对应哪个页框。PAGE_SIZE 2048 # None 表示有效位为 0也就是这一页不在内存里 page_table {0: None, 1: None, 2: 1, 3: None, 4: 3, 5: None, 6: 0, 7: 2} def translate(addr): page addr // PAGE_SIZE # 页号 地址整除页大小 offset addr % PAGE_SIZE # 偏移 地址对页大小取余 frame page_table[page] if frame is None: return f{addr} 缺页虚拟页 {page} 不在内存需从磁盘调入 return f{addr} 页号 {page} 偏移 {offset} 物理地址 {frame * PAGE_SIZE offset} for a in (8500, 1400, 5000, 2100): print(translate(a))这段代码做的就是硬件那几步先除、再取余、然后查表、最后拼地址。//求页号是因为页大小是 2 的整数次幂时整除等价于右移%求偏移等价于取低位。结果如下虚拟地址页号偏移页框结果850043083物理地址 6452140001400无缺页500029041物理地址 29522100152无缺页缺页的地址范围也就出来了虚拟页 0、1、3、5 都无效对应 0K 到 2K、2K 到 4K、6K 到 8K、10K 到 12K 这四段。答这类题的关键是先老老实实把每页的起止地址列成表再对照有效位不要凭感觉猜。3.5 地址绑定编译、装入、执行三个时机指令和数据里的地址什么时候从“相对偏移”变成“真实物理地址”有三种可能。编译时就确定意味着编译那一刻就知道程序将来会装在哪块内存生成的直接是绝对地址。这要求环境完全可预测一旦位置变了就得重新编译现在基本见不到。装入时才确定是链接器生成可重定位代码加载器把它放到内存某处时统一加上一个基址之后就不再变。执行时才确定是运行过程中由硬件配合完成转换进程可以被换出再换入到不同的位置虚拟内存靠的就是这一条。真正让“程序以为自己独占一大片连续内存”成立的是执行时绑定加上内存管理单元的地址翻译。这也是为什么现代系统里一个进程被挂起再恢复位置变了却照样能跑。4. 并发与死锁信号量、管程和那只“银行家的眼睛”多个执行流同时访问同一份数据麻烦就来了。最直观的例子是两个人同时往同一个账户里存钱A 读出余额 100B 也读出 100A 写回 150B 写回 180账户凭空少了 70。并发控制这一整套东西说到底就是在防这种“读改写被切开”的事。4.1 临界区与信号量P 和 V 到底在等什么那段“读余额、加钱、写回”的代码必须一次做完中间不能被打断这段代码就叫临界区。信号量是管这件事的工具它本质上是一个整型变量只允许通过两个原子操作来动它P 操作和 V 操作。P 操作的做法是先把值减一如果减完小于零说明资源已经被占满当前进程就阻塞把自己挂到该信号量的等待队列上。V 操作是先把值加一如果加完小于等于零说明队列里还有人等着就唤醒其中一个。用停车位打个比方信号量初值等于车位总数。P 就是开车进场满位了就在门口排队V 就是开车离场顺带喊一声“有空位了”让门口第一辆车进来。整个过程必须原子否则两辆车同时看到“还剩一个位”一起冲进去就撞了。4.2 管程把互斥锁进一个盒子里信号量的问题在于它靠程序员自觉。该 P 的地方忘了 P该 V 的地方忘了 V程序照样编译通过跑起来就是玄学崩溃。管程换了个思路把共享变量和操作它们的过程打包成一个模块语言层面保证同一时刻只有一个进程能待在管程内部。管程里还有条件变量配合 wait 和 signal 使用。wait 会让当前进程在条件变量上等待并且自动释放管程的互斥权让别的进程能进来signal 则唤醒一个在该条件变量上等待的进程。注意这个自动释放是“原子”完成的否则就会出现“锁还没放、别人进不来、自己又在等”的死局。管程和信号量的区别说白了是“约定”和“强制”的区别。信号量是一套全靠自觉的协议管程是把互斥写进了语言规则里忘不了。4.3 生产者-消费者那六个空对应什么试卷最后一道综合题给了半截代码要填六个空。这是并发部分最经典的模型一个生产者往缓冲区放数据一个消费者从缓冲区取缓冲区只能放一个数。void *producer(void *ptr) { for (int i 1; i MAX; i) { pthread_mutex_lock(the_mutex); // 先拿锁才能碰缓冲区 while (buffer ! 0) // 空①缓冲区非空说明还没被取走得等 pthread_cond_wait(condp, the_mutex); // wait 会原子地释放锁并挂起 buffer i; // 放数据 pthread_cond_signal(condc); // 空②叫醒等着的消费者 pthread_mutex_unlock(the_mutex); // 空③交还锁 } pthread_exit(0); } void *consumer(void *ptr) { for (int i 1; i MAX; i) { pthread_mutex_lock(the_mutex); while (buffer 0) // 空④缓冲区空没东西可取得等 pthread_cond_wait(condc, the_mutex); // 空⑤睡在消费者自己的条件变量上 int res buffer; buffer 0; // 取走标记为空 pthread_cond_signal(condp); // 叫醒生产者 pthread_mutex_unlock(the_mutex); // 空⑥交还锁 printf(buffer%d\n, res); } pthread_exit(0); }六个空填完是①buffer ! 0、②pthread_cond_signal(condc)、③pthread_mutex_unlock(the_mutex)、④buffer 0、⑤condc、⑥pthread_mutex_unlock(the_mutex)。几个容易写错的地方。第一条件判断必须用 while 而不是 if因为被唤醒之后缓冲区状态可能又被别人改了得重新检查一遍这就是所谓的虚假唤醒。第二两个 wait 用的条件变量不能搞混生产者等的是condp消费者等的是condc试卷里pthread_cond_wait(condp, ...)出现的那个位置属于生产者。第三unlock 一定要放在 signal 之后、循环体末尾如果放在 signal 之前被唤醒的线程可能会在锁还没释放时又睡回去。4.4 死锁四条件与银行家的“安全序列”死锁是四个条件同时成立才会发生的互斥资源一次只能给一个人、占有并等待拿着一个还想要下一个、不可抢占拿到手的不能被强行收走、循环等待A 等 B、B 等 A 绕成一圈。这四个条件缺一不可所以防死锁的思路也很直接——破坏其中任意一条就行。实际系统里最常用的是破坏循环等待比如给所有资源编号规定只能按序号递增的顺序申请。银行家算法走的是另一条路不禁止申请但每次分配前先算一遍分完之后系统还能不能找到一个安全序列让所有进程都顺利跑完。它的核心公式只有一个某进程还需要的资源量等于它声明的最大需求量减去已经分配给它的量。试卷里给出的那张表第一步就是逐行算 Need。算完之后从当前可用资源出发找一个 Need 小于等于可用的进程假设它跑完并归还全部资源可用量随之增加再继续找下一个。能一路找完所有进程就是安全状态中途卡住就是不安全状态。第二问的结论是不安全因为按可用资源只能推进 P0 和 P3推完之后剩下的资源满足不了其余任何进程。第三问 P1 请求 (0,4,2,0)做法是先试着分配给它再重新跑一遍安全检查。这次能走出 P0、P3、P1、P2、P4 这样一条完整序列所以请求可以立即批准。提示银行家算法的题一定要把“试分配”和“安全性检查”写成两步中间不能跳。直接说“批准”而不写试分配后的新状态阅卷时基本拿不到过程分。5. 五组最容易踩的易混概念别在这些地方翻车概念题丢分往往不是不会而是把两个长得像的东西记串了。下面这五组几乎每年都有人栽。5.1 进程和线程到底谁共享、谁独占易混点觉得线程就是小一号的进程所以资源该一样。为什么混两者确实都是“执行流”都参与调度都有状态迁移教材上又常常并排讲。怎么区分记住一句话——线程共享进程的“家产”独占自己的“随身物品”。家产包括地址空间、打开的文件、记账信息随身物品包括寄存器组含程序计数器和自己的栈。判断方法很实用凡是问“这个资源被多个线程同时改会不会乱”会乱的就是独占的不会乱的就是共享的。5.2 程序控制 I/O、中断驱动 I/O、DMACPU 到底插不插手易混点三种方式都叫 I/O都涉及 CPU 和外设区别记不住。为什么混名字里都有 I/O描述里又都说“CPU 参与”只是参与程度不同。怎么区分看数据搬运的过程中CPU 有没有被占用。方式CPU 在数据传输中的角色数据经过 CPU 吗程序控制 I/O全程忙等反复查状态寄存器经过中断驱动 I/O设备就绪时被打断一下处理完继续干别的经过DMA只在开始时授权、结束时收尾不经过直接内存到设备判据就是题目里常出现的那句“不需要 CPU 参与数据块的传送”指的是 DMA。程序控制和中断驱动的差别在于“等待期间 CPU 干不干别的事”而两者和 DMA 的差别在于“数据走不走 CPU 这条路”。5.3 寻道时间、旋转延迟、传输时间谁主导易混点以为硬盘读写慢是因为数据传输慢。为什么混三者加在一起才是一次磁盘读写的总时间名字都带“时间”。怎么区分寻道时间是磁头移动到目标磁道的时间旋转延迟是等目标扇区转到磁头下方的时间传输时间是数据真正读出来的时间。对大多数机械硬盘来说寻道时间占大头因为机械臂的物理移动最慢。这也解释了磁盘调度算法的意义。先来先服务按请求顺序走机械臂来回乱窜平均移动距离最长最短寻道时间优先每次挑最近的移动距离明显缩短但可能导致远端请求长期得不到服务电梯算法SCAN像电梯一样单向扫过去再折返兼顾了效率和公平。试卷那道题里起始柱面是 20请求序列是 10、22、20、2、40、6、38。按先来先服务移动总距离是 146 个柱面每柱面 6 毫秒合计 876 毫秒按最短寻道优先总距离缩到 60合计 360 毫秒按电梯算法向上扫描总距离 58合计 348 毫秒。这里有个细节值得注意从 20 出发10 和 22 距离都是 2先走哪边不同教材处理不一样写答案时说明自己的方向约定就行别因为和标准答案顺序不同就怀疑算错。5.4 i-node、目录项、MBR三个被塞进同一道题里的东西易混点把 i-node 号、文件名、引导记录当成一回事。为什么混它们都和“磁盘上的文件系统结构”有关又都出现在同一批选择题里。怎么区分MBR 是磁盘第 0 号扇区也就是主引导记录负责开机时把控制权交给引导程序跟具体文件没关系。目录项是目录文件里的一条记录里面只有文件名和该文件的 i-node 编号不存文件内容也不存大小。i-node 才是真正记录文件元数据的地方包括文件大小、权限、时间戳、数据块位置。试卷里那道“每个文件系统最多多少文件”的题考的就是目录项的结构i-node 号占 2 个字节能表示 2 的 16 次方也就是 64K 个不同编号所以上限是 64K 个文件。文件名占 14 个字节这个信息是干扰项它限制的是单个文件名的长度不是文件数量。5.5 chmod 755 和 644权限位不是随手填的数易混点看到 755、644、744 一串数字凭印象挑一个顺眼的。为什么混这三个数太常见网上到处是chmod 755容易形成“反正都这么写”的错觉。怎么区分三个数字依次对应文件主、同组用户、其他用户每个数字是读4、写2、执行1三个权限相加的结果。题目要求文件主可读可写可执行其他人只能读。文件主就是 421 等于 7同组用户只读是 4其他用户只读也是 4合起来是 744。755 错在同组和其他用户多了执行权限644 错在文件主少了执行权限。6. 什么时候该用这份资料什么时候别用这份资料的定位很清楚一份带答案解析的期末试卷四大部分、满分一百涵盖选择、填空、问答和综合。它适合的场景有两个。一是考前两三周的自查。这个阶段最怕的是“看着都会一写就错”。拿它当模拟卷闭卷限时两小时做完然后对答案重点不是看对错而是把每一道错题归类是概念没记住比如三级调度的别名是计算方式记反了比如页大小和页号位数搞混还是根本没思路比如银行家算法的安全序列。三类错因对应三种复习动作混在一起就会变成“刷了很多题但没长进”。二是查漏补缺时做定向突破。比如综合题里生产者-消费者的填空总是填不对那就把条件变量那几行代码单独拎出来自己默写一遍再对照答案看是条件写反了还是 wait 的位置放错了。这种题型的考点高度固定吃透一道就能覆盖一片。不适合的场景也得说清楚。如果你想学的是内核源码怎么实现调度器、页表怎么组织成多级、文件系统怎么落盘这份试卷帮不上忙它考的是原理层面的模型不是工程实现。如果你需要的是动手写一个多线程程序并调优它也不行题目里的代码是教学用的简化版本只是为了说明同步关系离生产可用还差得远。还有一种情况如果你的课程教材用的符号体系和这份卷子不一样比如信号量的 P/V 被别人写成 wait/signal、进程状态多画了创建态和终止态直接背答案反而会让你在别的题上犯迷糊这时候应该以自己教材的定义为准把这份卷子当练习题而不是标准答案。一个具体的用法是这样的先把四道综合题当成四道独立的小测每道限时二十分钟。做完之后不看答案先自己口头讲一遍思路——磁盘调度为什么最短寻道优先会比先来先服务快、银行家算法为什么要先试分配。讲得磕巴的地方就是没真懂的地方这时候再翻答案收获比直接抄一遍大得多。至于选择题和填空题它们适合在碎片时间过一遍因为这些题考的就是记忆点反复见面才记得牢。我自己有个改不掉的习惯每次对完答案都会把错题的原因用一句话写在旁边不写“粗心”只写具体动作比如“把偏移位数当成页大小算了”“忘了阻塞态要先回就绪态”。这个习惯是从一次很惨的翻车经历里养成的——某次考试前把整本卷子刷了两遍感觉稳了结果考场上遇到一道页表地址转换的题数字换了换我照着记忆里的答案写最后一步加错了页框号白白丢了十分。从那以后我每次做计算题都强制把中间结果写出来页号、偏移、页框、物理地址各占一行宁可多写两行也不让脑子里的捷径替我做决定。希望这份梳理能帮到你。需要对照原题的人直接取用那份 PDF 就好——先合上答案自己做一遍再打开一起来看效果会好很多。本文还有配套的精品资源点击获取
RELATED

相关推荐

元胞传输模型在高速公路拥堵分析中的应用与实践

元胞传输模型在高速公路拥堵分析中的应用与实践

1. 项目背景与核心价值高速公路网作为现代交通系统的核心动脉,其运行状态直接影响着区域经济活动和民生出行。当突发事件(如交通事故、恶劣天气、大型活动等)发生时,路网拥堵往往会呈现复杂的时空演化特征。传统基于静态路网模型的…

📅 2026/11/6 7:08:36
安川MPE720程序下载连不上:以太网通信与伺服组态排查

安川MPE720程序下载连不上:以太网通信与伺服组态排查

简介:面向安川MPE720系列PLC调试与维护人员的实操文档,围绕PLC程序导入与SigmaWin伺服参数导入两条主线,帮助初、中级自动化工程师梳理从硬件准备到报警排查的完整流程。内容覆盖217IF-01串行通信模块拨码设定、CN6A/CN6B与IO模块接线、电脑与…

📅 2026/11/6 7:08:36
项目周期管理:工作日计数与日期戳编号系统设计

项目周期管理:工作日计数与日期戳编号系统设计

1. 项目背景解析"Day27-20260123"这个看似简单的编号背后,实际上隐藏着一个完整的项目周期管理方法论。作为一名长期跟踪技术项目管理的从业者,我见过太多团队在项目记录和版本控制上栽跟头。这个编号系统完美融合了时间标记和序列管理&#x…

📅 2026/11/6 7:03:36
MORE NEWS

更多资讯

📰

提升管理水平必看的员工管理书籍推荐

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

电商高并发必备:Redis 缓存穿透、击穿、雪崩防御方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

PNG 图片太大不好上传?一键转 JPG,体积直接变小

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

鸿蒙渲染范围控制优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Linux 网络编程面试题:TCP 字节流、部分读写与 UDP 数据报

TCP 字节流、部分读写、应用层消息边界与 UDP 丢包处理一、TCP 字节流与应用层消息边界1. TCP 为什么会出现粘包和拆包?答:TCP 是面向连接的可靠字节流协议,它只保证数据按照发送顺序可靠地交付给接收端,并不保留应用层的消息边界…

📰

pi0代码解析-examples-simple_client-2

这是一个无机器人的策略服务器压测/延迟基准工具。它连上一个已经跑起来的 WebSocket 策略服务器,按环境格式生成随机假观测反复请求推理,统计端到端延迟与各分段耗时,最后打印表格或存成 parquet。 serve_policy.py 启动的服务器 ◄──WebSocket── simple_client/mai…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬