ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

操作系统内存管理大题:地址转换、页面置换与虚拟内存手算

操作系统内存管理大题:地址转换、页面置换与虚拟内存手算 如果你正在被操作系统第三章内存管理的大题折磨尤其是做到地址转换、页面置换、工作集、动态分区这几类题时总觉得“听懂了但一写就错”那这篇汇总就是给你准备的。我当年复习操作系统内存管理时也是把王道、课本、期末卷子来回刷最后发现大题不是靠背而是靠一套固定动作先拆地址再查表再算缺页最后检查单位。下面我把内存管理大题里最常见的题型、判分点、手算模板和踩坑经验全部摊开讲适合期末突击、考研408复盘也适合面试前快速捡起操作系统内存管理的主线。1. 内存管理大题到底长什么样考点分布与判分逻辑1.1 第三章大题的四个主战场操作系统第三章内存管理的大题表面上看题目千变万化实际上主要围绕四个主战场展开。第一类是地址转换包括分页、分段、段页式、多级页表以及TLB和有效访问时间计算。第二类是页面置换算法常考FIFO、LRU、OPT、CLOCK要求你写出每次访问后的内存块状态、缺页次数、缺页率甚至置换次数。第三类是虚拟内存与请求分页包括缺页中断处理、页面分配策略、工作集、抖动、页面大小选择。第四类是连续分配与动态分区包括首次适应、最佳适应、最坏适应、邻近适应以及分区回收合并的四种情况。这四类题有一个共同特点它们都不是纯概念题而是“概念加计算加过程”的综合题。你只背定义没用必须能在卷面上一步步推出中间结果。比如地址转换题老师想看的是你有没有把逻辑地址拆成页号和页内偏移而不是直接写一个物理地址。页面置换题老师想看的是你的表格有没有按访问顺序更新而不是只写一个缺页次数。动态分区题老师想看的是空闲分区链怎么变化而不是只写最终分配给了谁。我在辅导学弟学妹时发现很多人丢分不是因为不会而是因为跳步。比如分页地址转换题目给了页表基址、页号、页内偏移他直接写物理地址中间没有查页表项的过程结果页表项里的块号看错一位整题崩盘。再比如LRU有人把“最近最久未使用”理解成“最近最少使用次数”这两个意思完全不同一错就是整张表错。所以这一章的大题复习时一定要按“动作”来练而不是按“答案”来背。1.2 判分点不是答案是中间过程内存管理大题的判分逻辑和数学题很像答案对不一定满分过程对但最后一步算错反而能拿大部分分。我见过一道10分的地址转换题标准答案给分点是正确写出页号2分正确写出页内偏移2分正确查页表得到块号3分正确拼接物理地址2分单位换算正确1分。也就是说哪怕你最后物理地址写错了只要前面拆得对、查表对依然能拿7分左右。这就引出一个很重要的复习策略把每一步都写成卷面语言。比如“页面大小为4KB所以页内偏移占12位逻辑地址低12位为0x001页号为0x0000A”。这种话看起来啰嗦但阅卷老师一眼就能看到你的思路。相反如果你只写“物理地址0x1A001”老师不知道你是蒙的还是算的一旦结果错就是0分。页面置换题更是如此。FIFO、LRU、OPT的表格必须完整。访问串有20个数字你就要画20列每一列写清楚当前内存块里的页面号、是否缺页、替换了谁。有人只写缺页序列不写内存块变化结果题目问“第四次缺页时淘汰了哪个页面”他就答不上来。所以我在复习时给自己定了一个规矩凡是过程题先画表再填数最后统计。这个习惯救了我很多次。1.3 复习路线先算地址再换页面最后虚拟内存如果你时间紧我建议按这个顺序复习先啃地址转换再练页面置换然后补虚拟内存的计算最后看连续分配。为什么这么排因为地址转换是内存管理的地基页表、页目录、TLB这些概念搞懂了后面请求分页、缺页中断才有落脚点。页面置换是独立模块但它的引用串、帧数、缺页率计算非常套路化练十道题就能形成肌肉记忆。虚拟内存是地址转换和页面置换的合体很多综合题会把两者串起来考。连续分配相对独立但动态分区回收合并容易画错放在后面集中突破更高效。我当年复习时先花两天把分页、分段、段页式的地址转换公式全部推导一遍然后用一张A4纸默写多级页表的位数划分。接着用三天刷页面置换FIFO、LRU、OPT各刷五道再用Python写了一个模拟器验证手算结果。最后两天攻虚拟内存和工作集把缺页率、有效访问时间、抖动阈值这些公式背熟。这个顺序下来第三章大题基本不会慌。2. 地址转换大题逻辑地址到物理地址的固定套路2.1 分页地址转换先拆偏移再查页表分页地址转换是所有地址转换题的基础。题目通常会给出页面大小、逻辑地址、页表要求你求物理地址。固定动作只有三步第一步用页面大小确定页内偏移位数第二步把逻辑地址拆成页号和页内偏移第三步用页号查页表得到物理块号再把块号和页内偏移拼接成物理地址。举个例子页面大小为4KB逻辑地址为32位十六进制0x0000A001。4KB等于2的12次方所以页内偏移占低12位。0x0000A001的低12位是0x001页号就是0x0000A也就是十进制10。如果页表第10项写着物理块号0x1F那么物理地址就是0x1F001。注意这里的块号要左移12位再和偏移拼接或者直接写成“块号偏移”的十六进制形式。很多人错在把块号直接当物理地址忘了加偏移。这类题有两个高频陷阱。第一个是页面大小不是2的整数次幂比如题目给页面大小1500字节这时候不能简单按位拆而要用除法页号逻辑地址/页面大小偏移逻辑地址%页面大小。第二个是页表项大小影响页表本身占多少页这个在多级页表里更常见。手算时一定要把单位统一逻辑地址、页面大小、页表项大小都换成字节或位不要混着算。注意分页地址转换里页内偏移位数由页面大小决定页号位数由逻辑地址总位数减去偏移位数决定。这个关系写错后面全错。2.2 多级页表为什么一级页表装不下多级页表是地址转换题里的重头戏也是很多人绕不过去的坎。先想一个问题32位逻辑地址页面大小4KB页表项4字节如果只用一级页表页表有多少项页号占20位所以有2的20次方个页表项每项4字节总大小就是4MB。每个进程都要4MB连续内存来存页表这显然太浪费。于是引入二级页表把页号再拆成页目录号和页表索引页目录只存一级页表的位置二级页表按需分配。以32位地址、4KB页面、4字节页表项为例页内偏移12位剩下20位页号。如果拆成二级通常是10位页目录号加10位页表索引。页目录有2的10次方项每项4字节大小4KB正好一页。每个二级页表也有2的10次方项大小4KB也正好一页。这样页目录常驻内存二级页表用到哪页才加载哪页节省大量空间。地址转换过程要写清楚先从逻辑地址高10位拿到页目录号查页目录得到二级页表基址再用中间10位拿到页表索引查二级页表得到物理块号最后用低12位偏移拼接物理地址。如果题目给的是三级页表比如39位虚拟地址、4KB页面那偏移12位剩下27位通常拆成999。页目录、页中间目录、页表各占9位每级表大小都是2的9次方乘8字节等于4KB。这个“每级表正好一页”的设计非常常见考试也爱考。手算多级页表时我建议画一个倒三角最上面是逻辑地址下面分三段每段标上位数和含义。然后从左到右查表每一步写清楚“查第几级表得到什么”。这样即使最后地址算错过程分也能拿到。2.3 分段与段页式段号、段内偏移、页号分段和分页经常被放在一起对比。分页对用户透明页面大小固定逻辑地址是一维的分段对用户可见段长可变逻辑地址是二维的由段号和段内偏移组成。分段地址转换的步骤是先用段号查段表得到段基址和段长然后检查段内偏移是否越界如果偏移大于等于段长就产生越界中断最后用段基址加段内偏移得到物理地址。段页式是两者的结合先把程序分成段每个段再分成页。逻辑地址由段号、页号、页内偏移三部分组成。地址转换需要查两次表先查段表得到页表基址再查页表得到物理块号最后拼接页内偏移。段页式的优点是既有分段的逻辑清晰又有分页的内存高效但代价是访问一次数据要查两次表速度慢。如果加上TLB命中时可以直接得到物理块号速度就能提上来。考试里分段题常考越界判断和共享。比如两个进程共享一个代码段段表里两个段表项指向同一个物理段但段长和权限可能不同。段页式题常考位数划分比如32位逻辑地址段号8位页号12位页内偏移12位那么段表有256项每个段最多有4096页每页4KB。这种题只要把位数拆对后面就是重复分页的查表动作。2.4 TLB与EAT命中率、访问时间、缺页处理时间TLB和有效访问时间EAT是地址转换题的升级版也是期末和考研都爱考的计算题。TLB是快表用来缓存最近使用的页表项。访问一个逻辑地址时先查TLB如果命中直接得到物理块号如果不命中再查内存中的页表查到后把页表项填入TLB。如果页表项不在内存还会触发缺页中断从磁盘调入页面。EAT的计算要看题目给的层次。常见公式是EAT等于TLB命中时的访问时间乘以命中率加上TLB未命中时的访问时间乘以未命中率。如果题目还给了缺页率就要再分一层缺页时不仅要查TLB和页表还要处理缺页中断时间通常是毫秒级。比如TLB命中率98%TLB访问时间10ns内存访问时间100ns缺页率0.0001缺页处理时间10ms。那么先算不缺页时的EAT命中时10100110ns未命中时10100100210ns平均是0.98乘110加0.02乘210等于107.8加4.2等于112ns。再考虑缺页0.9999乘112ns加0.0001乘10ms10ms等于10的7次方ns最后约等于112ns加1000ns约1112ns。这个数量级说明缺页率虽小但因为缺页处理时间极大对EAT影响非常明显。这里最容易错的是单位换算和是否把TLB访问时间算两次。我建议所有时间先统一成ns缺页处理时间如果给ms就乘10的6次方。公式写成分段式不要跳步。另外有些题目会问“访问一个数据需要多少次内存访问”这时候要区分“查页表算一次内存访问”和“取数据算一次内存访问”TLB命中时只需一次内存访问取数据未命中时需要两次。3. 页面置换算法大题FIFO、LRU、OPT、CLOCK手算与代码验证3.1 FIFO、LRU、OPT的表格法页面置换算法的题核心是画表。引用串、帧数、算法名称一给你就画一张表第一行是访问序列下面每一行是内存块最后一列标记是否缺页。以经典引用串7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,13个帧为例FIFO的缺页次数是15LRU是12OPT是9。这个串几乎每本操作系统教材都会出现建议直接背下来考试时可以用来验证自己的手算方法对不对。FIFO就是先进先出内存块按页面进入的顺序排队淘汰最早进入的。LRU是淘汰最长时间未被访问的页面每次访问后要把该页面移到“最近使用”的位置。OPT是淘汰未来最长时间不会再被访问的页面需要看后面的引用串。手算时FIFO可以画一个队列指针LRU可以给每个页面标“最后一次访问时间”OPT则要从当前访问位置往后找每个页面下一次出现的位置。表格法的关键是不要偷懒。访问串有20个数字你就画20列。每次访问后内存块里的页面号要更新缺页就标一个勾。最后统计勾的数量就是缺页次数缺页次数除以总访问次数就是缺页率。如果题目问“缺页率”记得用百分数或小数表示别写分数。3.2 Belady异常与FIFO的坑Belady异常是页面置换里的经典考点对于FIFO算法增加物理块数反而可能导致缺页次数增加。注意只有FIFO会出现Belady异常LRU和OPT不会。为什么因为LRU和OPT属于堆栈算法增加帧数时原来在内存中的页面集合一定是新内存集合的子集所以缺页不会增加。FIFO不是堆栈算法它只看进入时间不看访问历史所以可能把马上要用的页面淘汰掉。考试里经常这样问“某引用串在3个帧时FIFO缺页15次4个帧时缺页几次”很多人以为帧数多了缺页一定少结果算出来4个帧缺页16次就怀疑自己算错了。其实这就是Belady异常FIFO完全可能。你只需要老老实实画表不要用直觉代替计算。我当年第一次遇到时也懵了后来把两次表都画出来发现4个帧确实多了一次缺页才记住这个坑。3.3 CLOCK与改进CLOCKCLOCK算法是FIFO的改进版也叫最近未用算法。它给每个页面加一个访问位访问时置1。需要淘汰时从指针位置开始扫描遇到访问位为1的就置0并跳过遇到0的就淘汰。如果所有页面的访问位都是1指针会转一圈把大家都置0然后淘汰第一个。CLOCK避免了FIFO淘汰常用页面的问题实现也简单所以实际操作系统用得很多。改进CLOCK还加了一个修改位也叫脏位。淘汰时优先找访问位0、修改位0的页面因为这种页面既没被访问也没被修改直接淘汰不用写回磁盘。如果找不到再找访问位0、修改位1的页面淘汰时需要写回。再找不到就重新扫描。手算改进CLOCK时要给每个页面标两个位扫描顺序是(0,0)、(0,1)、(1,0)、(1,1)但通常分几轮。题目一般会给访问位和修改位的变化你按规则模拟即可。3.4 用代码验证手算Python模拟模板手算容易错我建议用代码验证。下面是一个Python模拟FIFO、LRU、OPT的模板你可以直接改引用串和帧数。注意代码只是为了验证你的手算结果考试时还是要会手画表。def fifo(refs, frames): mem [] faults 0 for r in refs: if r not in mem: faults 1 if len(mem) frames: mem.append(r) else: mem.pop(0) mem.append(r) return faults def lru(refs, frames): mem [] faults 0 for r in refs: if r not in mem: faults 1 if len(mem) frames: mem.append(r) else: # 淘汰最久未使用的 mem.pop(0) mem.append(r) else: mem.remove(r) mem.append(r) return faults def opt(refs, frames): mem [] faults 0 for i, r in enumerate(refs): if r not in mem: faults 1 if len(mem) frames: mem.append(r) else: # 找未来最久才会出现的页面 farthest -1 victim -1 for page in mem: try: nxt refs[i1:].index(page) except ValueError: nxt float(inf) if nxt farthest: farthest nxt victim page mem.remove(victim) mem.append(r) return faults refs [7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1] print(FIFO:, fifo(refs, 3)) print(LRU:, lru(refs, 3)) print(OPT:, opt(refs, 3))这段代码跑出来是FIFO 15LRU 12OPT 9。如果你手算结果和它不一致就回去查表。注意LRU的实现里我用列表头部表示最久未使用尾部表示最近使用每次命中就移到尾部。OPT则要往后看如果页面以后不再出现下一次出现位置设为无穷大优先淘汰。提示CLOCK和改进CLOCK也可以用代码模拟但要维护指针和访问位。考试时如果时间不够先把FIFO、LRU、OPT画对再补CLOCK。4. 虚拟内存与请求分页缺页中断、工作集、抖动、分配策略4.1 缺页中断处理流程缺页中断是虚拟内存的核心。当CPU访问一个页面发现页表项的存在位为0就产生缺页中断。操作系统接管后先检查该访问是否合法如果逻辑地址越界或权限不符就终止进程如果合法就看内存中还有没有空闲块。有就分配一块没有就按页面置换算法选一个牺牲页。如果牺牲页被修改过还要写回磁盘如果没修改直接覆盖。然后从磁盘把所需页面调入更新页表重新执行刚才那条指令。这个过程要背熟因为大题经常让你写“缺页中断处理步骤”。注意几个细节第一缺页中断属于内部中断发生在指令执行期间第二重新执行指令时CPU会重新访问同一个逻辑地址这次页表项存在位为1就不会再缺页第三如果内存满了置换算法选牺牲页时要检查修改位决定是否写回。手算缺页中断题时常给一个访问串和内存块数要求你写出每次缺页后的内存状态和页表变化。这时候一定要把“缺页”和“置换”分开写。缺页不一定置换如果内存有空块就直接放入只有内存满时才置换。很多人把缺页次数和置换次数混为一谈结果统计错。4.2 页面分配策略与全局/局部置换页面分配策略分固定分配和可变分配。固定分配是给每个进程固定数量的物理块可变分配根据缺页率动态调整。置换范围分全局置换和局部置换全局置换可以从整个内存中选牺牲页局部置换只能从该进程自己的页面中选。组合起来有固定分配局部置换、可变分配全局置换、可变分配局部置换。考试常问哪种策略最好答案是可变分配局部置换因为它既能动态调整块数又不会抢别的进程的页面。实际操作系统里Linux和Windows都倾向于全局置换因为这样能更灵活地利用内存。但全局置换可能导致一个进程频繁缺页影响其他进程。局部置换则比较稳定但可能造成内存利用率低。这些策略的选择逻辑在面试里也常问你可以结合“公平性”和“吞吐量”来答。4.3 工作集与抖动计算工作集是进程在一段时间内实际访问的页面集合。工作集窗口大小为Δ如果在窗口内访问了某页面它就属于工作集。工作集大小W(t, Δ)是窗口内不同页面的数量。如果分配给进程的物理块数小于工作集大小就会频繁缺页产生抖动。抖动的本质是页面在内存和磁盘之间来回换CPU利用率急剧下降。计算工作集题通常给一个访问串和窗口大小要求你画出每个时刻的工作集。比如访问串1,2,3,2,4,1,3窗口Δ3当前时刻到往前数3个访问1,3,2工作集就是{1,2,3}大小3。注意窗口是时间窗口不是固定访问次数但考试里通常按访问次数简化。如果题目给的是时间间隔就要看时间戳。抖动检测可以通过缺页率来判断如果缺页率高于某个阈值比如50%说明工作集没被满足。操作系统可以挂起一些进程或者增加物理块。考试里常问“如何防止抖动”答案包括局部置换限制影响范围、动态调整工作集、挂起部分进程、增加内存。4.4 页面大小与有效访问时间页面大小选择是一个权衡题。页面太小页表项太多页表占内存大缺页中断频繁页面太大页内碎片多内存利用率低而且一次调入太多用不到的数据浪费磁盘带宽。一般页面大小在4KB到8KB之间现代系统可能更大。题目可能让你计算不同页面大小下的页表大小或缺页率影响。有效访问时间在虚拟内存里更复杂。公式可以写成EAT 缺页率 × 缺页处理时间 (1 - 缺页率) × 不缺页时的访问时间。缺页处理时间包括磁盘寻道、旋转延迟、传输时间通常是毫秒级。不缺页时的访问时间包括TLB和内存访问通常是纳秒级。两者差六个数量级所以缺页率即使很低对EAT影响也很大。比如缺页率从0.0001降到0.00001EAT可能从微秒级降到纳秒级。考试里常给几个缺页率让你比较你直接代入公式算就行。5. 连续分配与动态分区首次适应、最佳适应、最坏适应5.1 分区分配算法手算连续分配里的动态分区算法是期末常考的小题。题目给一个空闲分区链比如100K、500K、200K、300K、600K然后给作业请求212K、417K、112K、426K要求分别用首次适应、最佳适应、最坏适应分配。首次适应从低地址开始找第一个满足的最佳适应找最小的满足分区保留大空闲块最坏适应找最大的分区分配后剩余部分还能用。手算时我建议画一个空闲分区表每次分配后更新。比如请求212K首次适应会选500K那个分区剩下288K。最佳适应会先看200K不够300K够所以选300K剩下88K。最坏适应选600K剩下388K。注意题目里的空闲分区顺序很重要首次适应和邻近适应都对顺序敏感。邻近适应是首次适应的变体从上次找到的位置继续往下找而不是每次从头开始。这类题容易错在忘记合并。分配后相邻的空闲分区如果没有合并下次分配可能找不到合适的块。回收时也要检查上下相邻是否空闲能合并就合并。题目如果问“最终空闲分区链是什么”一定要写清楚地址和大小按地址排序。5.2 回收合并的四种情况回收分区时有四种情况要记牢第一种回收区上下都不空闲直接插入空闲链第二种上邻空闲下不邻合并到上邻修改上邻大小第三种下邻空闲上不邻合并到下邻修改下邻起始地址和大小第四种上下都空闲三个合并成一个删除下邻表项修改上邻大小。这个逻辑在写代码时也常用考试里画图表示最清楚。我当年考试就栽在第四种情况忘了删除下邻表项导致空闲链里多了一个重复项。后来我总结了一个口诀“上邻改大小下邻改地址上下都邻三合一删掉下邻留上邻。”这个口诀虽然土但很好用。回收题还要注意地址边界比如回收区的起始地址和大小合并后要更新正确。5.3 紧凑、覆盖、交换紧凑是为了解决外部碎片把内存中的进程移动到一起空出大块连续空间。但紧凑需要重定位而且代价大通常只在必要时做。覆盖是早期系统用的技术把程序分成多个段不会同时执行的段共享同一块内存。交换是把整个进程换出到磁盘再换回来用于分时系统。这三者经常作为概念题出现在选择题里但大题也可能让你比较优缺点。紧凑的优点是消除外部碎片缺点是移动进程需要重定位寄存器和大量内存拷贝。覆盖的优点是节省内存缺点是需要程序员手动划分覆盖结构对用户不透明。交换的优点是提高内存利用率缺点是换入换出开销大。现代操作系统更多用虚拟内存和分页紧凑和覆盖已经很少单独使用但考试里还是会考。6. 综合大题实战拆解一套典型卷面怎么答6.1 题目背景与地址转换假设题目给页面大小4KB逻辑地址32位页表项4字节采用二级页表。TLB命中率95%TLB访问时间10ns内存访问时间100ns缺页率0.00001缺页处理时间8ms。现有一个逻辑地址0x0000A001页目录第0项指向页表P页表P第10项指向物理块0x1F。求物理地址和EAT。第一步4KB2的12次方偏移12位。32位地址拆成10位页目录、10位页表索引、12位偏移。0x0000A001二进制高10位是0中间10位是0x00A10低12位是0x001。查页目录第0项得到页表P查页表P第10项得到块号0x1F。物理地址0x1F左移12位加0x0010x1F001。第二步EAT。先算不缺页时的平均访问时间TLB命中时10100110ns未命中时10100100210ns平均0.95×1100.05×210104.510.5115ns。再算缺页影响0.99999×115 0.00001×8ms。8ms8,000,000ns0.00001×8,000,00080ns。所以EAT≈11580195ns。注意缺页率虽然极小但缺页处理时间巨大仍然贡献了80ns。6.2 页面置换计算题目给引用串1,2,3,4,1,2,5,1,2,3,4,53个帧分别求FIFO和LRU缺页次数。FIFO手算1缺2缺3缺4缺淘汰11缺淘汰22缺淘汰35缺淘汰41命中2命中3缺淘汰14缺淘汰25缺淘汰3。缺页次数是10。LRU1缺2缺3缺4缺淘汰11缺淘汰22缺淘汰35缺淘汰41命中2命中3缺淘汰54缺淘汰15缺淘汰2。缺页也是10。这个例子说明某些串下FIFO和LRU结果相同但不要因此认为它们总相同。答这类题表格一定要写全。我习惯在表格下面写一行“缺页次数10缺页率10/1283.3%”。如果题目问“置换次数”置换次数等于缺页次数减去初始填充的缺页次数。比如3个帧前3次缺页是填充没有置换后面7次缺页才置换所以置换次数是7。6.3 工作集与性能评估如果题目继续问窗口大小Δ4求访问序列的工作集变化。你就从每个时刻往前数4个访问列出不同页面。比如访问到第5个1时窗口内是4,1,2,3具体看序列。工作集大小小于分配的帧数时不会抖动大于时可能抖动。如果题目问“系统是否抖动”你就比较工作集大小和物理块数。性能评估题常问“增加内存能否提高CPU利用率”。答案是如果系统没有抖动增加内存对CPU利用率提升有限如果正在抖动增加内存可以减少缺页提高CPU利用率。这个逻辑在答题时要用“工作集模型”来解释。6.4 卷面书写与检查综合大题最怕写乱。我的建议是地址转换题分三行写“拆地址、查表、拼地址”页面置换题画表表格上方写算法名称和帧数工作集题画时间轴EAT题写公式再代入。每道题做完后检查三件事单位是否统一位数是否对齐缺页次数是否等于置换次数加初始填充数。这三件检查能救回很多粗心分。另外如果题目给了十六进制地址建议全部转成二进制或至少标明位数。比如0x0000A001高10位是0中间10位是10这种题如果直接看十六进制容易错。我会在旁边写“页目录0页表索引0x00A偏移0x001”这样查表时不会看错。7. 常见问题与排查技巧考场和实验里最容易翻车的地方7.1 常见问题速查表问题典型表现排查与解决地址转换结果不对物理地址少一位或多一位检查偏移位数是否等于log2(页面大小)块号是否左移偏移位数多级页表大小算错页表大小写成2^20×4B先确定每级索引位数再算每级表项数每级表通常设计成一页FIFO和LRU混淆淘汰顺序写成“最近最少使用”FIFO看进入时间LRU看最后一次访问时间Belady异常漏答认为帧多缺页一定少FIFO可能异常LRU和OPT不会缺页次数和置换次数混把缺页次数直接当置换次数置换次数缺页次数-初始空闲块填充次数工作集算错窗口内重复页面重复计数工作集是不同页面的集合重复页面只算一次EAT单位错ns和ms直接相加统一换算成ns1ms10^6ns动态分区忘记合并回收后空闲链有相邻块未合并检查上下邻按四种情况合并这个表我建议考前默写一遍。很多错误不是不会而是没有形成检查习惯。比如EAT单位错一旦ns和ms混用结果会差六个数量级老师一眼就知道你没换算。再比如工作集重复页面如果你把窗口内所有访问都计数工作集大小会虚高导致抖动判断错误。7.2 手算检查三件套我每次做完内存管理大题都会用“三件套”检查第一位数对齐。逻辑地址总位数是否等于页号位数加偏移位数多级页表每级位数加起来是否等于页号位数。第二单位统一。所有时间换成ns所有大小换成字节或KB不要KB和B混用。第三统计一致。缺页次数是否等于表格中缺页标记的数量置换次数是否等于缺页次数减去初始填充。这三件套看起来简单但能挡住80%的粗心错误。我见过有人把页面大小4KB写成4000B结果偏移位数算成12位但除法用4000最后结果差一点。操作系统题里4KB就是4096B2的12次方不要用十进制近似。还有人把物理块号直接当物理地址忘了加偏移这种错误用位数对齐就能发现物理地址和逻辑地址一样长如果块号左移后长度不对肯定错了。7.3 从Linux和C语言内存管理反哺理解如果你学过Linux操作系统或C语言内存管理可以把这些实际经验反过来帮助理解考试题。比如C语言里malloc申请堆内存free释放可能产生外部碎片这对应动态分区的首次适应和最佳适应。Linux的虚拟内存管理用多级页表每个进程有独立的页表页表项里有存在位、修改位、访问位这些正是考试里CLOCK算法用到的位。Julia性能优化与内存管理里常提到内存分配和GC其实也和分页、缺页、工作集有相似的思想局部性好的程序缺页少性能高。我当年学C语言时老师让写一个简单的内存分配器用首次适应管理一个 char 数组。写完之后我对动态分区的合并逻辑一下就通了。后来学Linux看到/proc/pid/status里的VmRSS、VmSize才真正理解虚拟内存和物理内存的区别。考试里的内存管理虽然简化了但底层思想和真实系统是一致的。你如果能把考试题和实际系统对应起来记忆会更牢。最后再分享一个小技巧复习页面置换时把经典引用串7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1抄在便利贴上每天手算一遍FIFO、LRU、OPT连续算三天基本就不会错了。地址转换题则把页面大小4KB、8KB、16KB的位数划分各默写一次多级页表的101012、99912也默写一次。这些数字熟了考场上就不用临时推能省出大量时间检查。
返回列表