复习总目录
第 4 章 存储体系
1. 页表法地址映像
历史考题:
题目描述:根据页表法 映像表 和 页面大小 计算 虚地址对应的实地址
课后习题 4-4
某虚拟存储器共 8 个页面,每页 1024 个字,实际主存为 4096 个字,采用页表法进行地址映像。映像表内容如下。
(1)列出会发生页面失效的全部虚页号;
(2)按以下虚地址计算主存实地址:0,3728,1023,1024,2055,7800,4096,6800。
实页号 | 装入位 |
---|---|
3 | 1 |
1 | 1 |
2 | 0 |
3 | 0 |
2 | 1 |
1 | 0 |
0 | 1 |
0 | 0 |
解:
(1)将题目给出的映像表补上虚页号,也就是按顺序 0 到 7:
虚页号 | 实页号 | 装入位 |
---|---|---|
0 | 3 | 1 |
1 | 1 | 1 |
2 | 2 | 0 |
3 | 3 | 0 |
4 | 2 | 1 |
5 | 1 | 0 |
6 | 0 | 1 |
7 | 0 | 0 |
页面失效的虚页号也就是装入位是 0 的虚页号,即 2、3、5、7。
(2)画出由虚地址计算主存实地址的表格
虚地址 | 虚页号 | 页内位移 | 装入位 | 实页号 | 页内位移 | 实地址 |
---|---|---|---|---|---|---|
0 | 0 | 0 | 1 | 3 | 0 | 3072 |
3728 | 3 | 656 | 0 | 页面失效 | 无 | |
1023 | 0 | 1023 | 1 | 3 | 1023 | 4095 |
1024 | 1 | 0 | 1 | 1 | 0 | 1024 |
2055 | 2 | 7 | 0 | 页面失效 | 无 | |
7800 | 7 | 632 | 0 | 页面失效 | 无 | |
4096 | 4 | 0 | 1 | 2 | 0 | 2048 |
6800 | 6 | 656 | 1 | 0 | 656 | 656 |
虚地址 ÷ 页面大小 = 虚页号 ⋯ ⋯ 页内位移 虚地址\div 页面大小=虚页号\cdots\cdots页内位移 虚地址÷页面大小=虚页号⋯⋯页内位移
商为虚页号,余数为页内位移,页面大小是题目给出的每个页面 1024 个字。
装入位和实页号根据第一问的表格按照不同虚页号的对应值填写;
两个页内位移是一样的,实页号右边多写一份页内位移是为了方便计算实地址
实地址 = 实页号 × 页面大小 + 页内位移 实地址 = 实页号 \times 页面大小 + 页内位移 实地址=实页号×页面大小+页内位移
2. 页面替换算法:FIFO、LRU
历史考题:2019.04 (FIFO)、2018.10 (FIFO)
题目描述:根据页地址流画出 FIFO、LRU 替换算法的页号变化过程,标命中时刻,计算命中率。
课后习题 4-7 FIFO
有一个虚拟存储器,主存有 0~3 四页位置,程序有 0~7 八个虚页,采用全相连映像和 FIFO 替换算法。给出如下程序页地址流:2, 3, 5, 2, 4, 0, 1, 2, 4, 6。
(1)假设程序的 2, 3, 5 页已先后装入主存的第 3, 2, 0 页位置,请画出上述页地址流工作过程中,主存各页位置上所装程序各页页号的变化过程图,标出命中时刻;
(2)求出此期间虚存总的命中率 H H H。
页面替换理解:
主存有 4 页空间,程序有 8 种页号,这里把页号当做一条指令,如果主存中有需要运行的指令,就代表了命中;而主存中没有就需要把这个指令存到主存中的空位里,如果已经没有空位了就要替换掉已经存在里面的指令。替换算法就是为了提高命中率,相当于提高效率。
简单介绍一下不同的页面替换算法:
(1)随机算法(Random,RAND):生成随机数选择被替换的页号,不考;
(2)先进先出算法(First-In First-Out,FIFO):最早装入主存的页作为被替换页;
(3)近期最少使用算法(Least Recently Used,LRU):近期最少访问的页作为被替换页;
(4)优化替换算法(Optimal,OPT):一种理想化的算法,它是根据程序未来的地址流来选择替换哪一页的,选择未来最晚被用到的页被替换,举个例子:现在主存里面存了 1, 2, 3, 4 而且存满了,后面来的地址流是 1, 1, 5, 3, 4, 6, 1,根据未来的地址流 2 是最晚被用到的(这里是未来直接不用了),因此要发生替换时优先替换 2。这种替换方式可以让命中率最大化,用来评价其它可实现的替换算法的好坏。
解:
(1)
主存页 面位置 |
初始 状态 |
页地址流 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
2 | 3 | 5 | 2 | 4 | 0 | 1 | 2 | 4 | 6 | ||
0 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5* | 2 | 2 | 2 |
1 | 4 | 4 | 4 | 4* | 4* | 6 | |||||
2 | 3 | 3 | 3 | 3 | 3 | 3 | 3* | 1 | 1 | 1 | 1 |
3 | 2 | 2 | 2 | 2 | 2 | 2* | 0 | 0 | 0 | 0 | 0 |
命中 | H | H | H | H | H |
表格解释:
1)程序的 2, 3, 5 页已先后装入主存的第 3, 2, 0 页位置对应 初始状态;
2)前四个页地址流在主存中本身就有,命中;
3)4 号进来主存中没有,而主存的 1 号页空着,直接存进去;此时已经存满了,而最先存入主存的是 2,因此加个星号,代表后面会替换它;
4)0 号进来主存中没有且主存已满,发生替换,替换的是 2;此刻最先存入主存的是 3,以此类推。
(2)命中率就是 10 个地址命中了 5 次 H = 5 / 10 = 50 % H=5/10=50\% H=5/10=50%
课后习题 4-11 FIFO
考虑一个 920 个字的程序,其访问虚存的地址流为 20, 22, 208, 214, 146, 618, 370, 490, 492, 868, 916, 728。
(1)若页面大小为 200 字,主存容量为 400 字,采用 FIFO 替换算法,请按访存的各个时刻,写出其虚页地址流,计算主存的命中率;
(2)若页面大小改为 100 字,再做一遍;
(3)若页面大小改为 400 字,再做一遍;
(4)由前三问的结果可得出什么结论?
(5)若把主存容量增加到 800 字,按第(1)小题再做一遍,又可以得到什么结论?
解:
本题的区别在于题目给出的是 虚存的地址流 和 页面大小,而不是 4-7 中的 程序页地址流。这里把虚存的地址流看作虚地址,程序页地址流看作虚页号,按照 4-4 中的公式,虚地址除以页面大小的商就是虚页号。主存容量除以页面大小就是 4-7 中的主存空间页数。
这里把 1、2、3、5 的结果画在一起:
虚地址 | 20 | 22 | 208 | 214 | 146 | 618 | 370 | 490 | 492 | 868 | 916 | 728 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
虚页地址 | 0 | 0 | 1 | 1 | 0 | 3 | 1 | 2 | 2 | 4 | 4 | 3 | |
主存 400 页面 200 n=2 |
0 | 0 | 0* | 0* | 0* | 3 | 3 | 3* | 3* | 4 | 4 | 4* | |
1 | 1 | 1 | 1* | 1* | 2 | 2 | 2* | 2* | 3 | 命中率 | |||
H | H | H | H | H | H | 6/12=0.5 | |||||||
虚地址 | 20 | 22 | 208 | 214 | 146 | 618 | 370 | 490 | 492 | 868 | 916 | 728 | |
虚页地址 | 0 | 0 | 2 | 2 | 1 | 6 | 3 | 4 | 4 | 8 | 9 | 7 | |
主存 400 页面 100 n=4 |
0 | 0 | 0 | 0 | 0 | 0* | 3 | 3 | 3 | 3 | 3* | 7 | |
2 | 2 | 2 | 2 | 2* | 4 | 4 | 4 | 4 | 4 | ||||
1 | 1 | 1 | 1* | 1* | 8 | 8 | 8 | ||||||
6 | 6 | 6 | 6 | 6* | 9 | 9 | 命中率 | ||||||
H | H | H | 3/12=0.25 | ||||||||||
虚地址 | 20 | 22 | 208 | 214 | 146 | 618 | 370 | 490 | 492 | 868 | 916 | 728 | |
虚页地址 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 2 | 2 | 1 | |
主存 400 页面 400 n=1 |
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 2 | 2 | 1 | 命中率 |
H | H | H | H | H | H | 6/12=0.5 | |||||||
虚地址 | 20 | 22 | 208 | 214 | 146 | 618 | 370 | 490 | 492 | 868 | 916 | 728 | |
虚页地址 | 0 | 0 | 1 | 1 | 0 | 3 | 1 | 2 | 2 | 4 | 4 | 3 | |
主存 800 页面 200 n=4 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0* | 0* | 4 | 4 | 4 | |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1* | 1* | 1* | ||||
3 | 3 | 3 | 3 | 3 | 3 | 3 | |||||||
2 | 2 | 2 | 2 | 2 | 命中率 | ||||||||
H | H | H | H | H | H | H | 7/12=0.58 |
(4)从前三问的结果可以看出,在分配给程序的实存容量一定(400 字)的条件下,页面大小 S P S_P SP 过小时,命中率 H H H 较低;页面大小增大后,两个地址在同页内的机会增大,使命中率 H H H 有所上升;由于指令之间因远距离的跳转引起命中率 H H H 下降的因素不起主要作用,还未出现随页面大小增大,而使命中率 H H H 下降的情况。如果页地址流有大量的远距离转移,随页面大小增大,因在主存中的页面数过少,而导致出现虚存页面被轮流替换出去的 “颠簸” 现象时,命中率 H H H 反而会下降。
(5)可以看出,分配给程序的实存容量增大后,命中率将会有所上升。不过,命中率的提高已不显著了。如果在增大容量,可以推断出命中率的上升就会渐趋平缓了。
3. 页面替换算法:堆栈模拟
历史考题:2017.10
题目描述:堆栈模拟处理过程图
课后习题 4-8
采用 LRU 替换算法的页式虚拟存储器共有 9 页空间准备分配给 A、B 两道程序。已知 B 道程序若给其分配 4 页时,命中率为 8/15;而若分配 5 页时,命中率可达 10/15。现给出 A 道程序的页地址流的 2, 3, 2, 1, 5, 2, 4, 5, 3, 2, 5, 2, 1, 4, 5。
(1)画出用堆栈对 A 道程序页地址流的模拟处理过程图,统计给其分配 4 页和 5 页时的命中率;
(2)根据已知条件和上述统计结果,给 A、B 两道程序各分配多少实页,可使系统效率最高?
解:
堆栈模拟其实是模拟的压栈过程,个人把它类比成堆叠书籍,如下表:2 先放桌上,3 来了叠在 2 上面,2 又来了就抽出来放在 3 上面,后面都是一样的过程。n=4 的时候就是只看堆栈内容的前 4 行,最后一行的代表被替代了,这也就符合 LRU 的规则,因为如果最近被用到过肯定是叠在上面的,最下面的就被替代了。
页地址流 | 2 | 3 | 2 | 1 | 5 | 2 | 4 | 5 | 3 | 2 | 5 | 2 | 1 | 4 | 5 | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
堆栈内容 | 2 | 3 | 2 | 1 | 5 | 2 | 4 | 5 | 3 | 2 | 5 | 2 | 1 | 4 | 5 | ||
2 | 3 | 2 | 1 | 5 | 2 | 4 | 5 | 3 | 2 | 5 | 2 | 1 | 4 | ||||
3 | 2 | 1 | 5 | 2 | 4 | 5 | 3 | 3 | 5 | 2 | 1 | ||||||
3 | 3 | 1 | 1 | 2 | 4 | 4 | 4 | 3 | 5 | 2 | |||||||
3 | 3 | 1 | 1 | 1 | 1 | 4 | 3 | 3 | 命中率 | ||||||||
命中 情况 |
n=4 | H | H | H | H | H | H | H | 7/15 | ||||||||
n=5 | H | H | H | H | H | H | H | H | H | H | 10/15 |
(2)因为一共就 9 页这里的分配方法就是 A4 B5 或者 A5 B4 两种,A 的命中率算出来了,B 的命中率是题目给的,那么 A4 B5 的命中率是 ( 7 / 15 + 10 / 15 ) / 2 = 8.5 / 15 (7/15+10/15)/2=8.5/15 (7/15+10/15)/2=8.5/15,A5 B4 的命中率是 ( 10 / 15 + 8 / 15 ) / 2 = 9 / 15 (10/15+8/15)/2=9/15 (10/15+8/15)/2=9/15,后面一种系统效率高。
4. Cache 组相联映像
历史考题:2021.10、2019.10、2017.10、2016.10
题目描述:画主存、Cache 地址字段对应关系图和空间块的映像对应关系图
课后习题 4-14 LRU
有一个 Cache 存储器。主存共分 8 个块 (0~7),Cache 为 4 个块 (0~3),采用组相联映像,组内块数为 2 块,替换算法为 LRU。
(1)画出主存、Cache 地址的各字段对应关系图(标出位数);
(2)画出主存、Cache 空间块的映像对应关系示意图;
(3)对于如下主存块地址流:1, 2, 4, 1, 3, 7, 0, 1, 2, 5, 4, 6, 4, 7, 2,如主存中内容一开始未装入 Cache 中,请列出 Cache 中各块随时间的使用状况;
(4)对于(3),指出块失效又发生块争用的时刻;
(5)对于(3),求出此期间 Cache 之命中率。
相关概念:
之前页面替换算法的题目是把 虚存 的地址存到 主存 时发生替换,这里是把 主存 的地址存到 高速缓存 Cache 时发生替换,替换方法并没有区别,但是地址映像之前是 全相连映像,这里是 组相联映像。
全相连映像:主存中任意一块都可映像装入到 Cache 中任意一块位置;就像之前的题目一样,每个虚地址都可以存到主存的任意一页中,没有限制。
直接映像:主存空间按 Cache 大小等分成区,每个区内的个块只能按位置一一对应到 Cache 的相应块位置上;举例说明比较直接:主存有 0~7 共 8 个块,Cache 有 0~3 共4 个块,那么主存的 0、4 只能存到 Cache 的 0:
( 0 , 4 ) → 0 (0,4)\to0 (0,4)→0
( 1 , 5 ) → 1 (1,5)\to1 (1,5)→1
( 2 , 6 ) → 2 (2,6)\to2 (2,6)→2
( 3 , 7 ) → 3 (3,7)\to3 (3,7)→3
组相联映像:Cache 分成若干组,主存按 Cache 分区,每个区也按 Cache 的样子分组,然后组和组之间直接映像,组和组内部的块相联映像;具体看本题答案可以直观理解。
解:
(2)先看第二问
Cache 4 块,每组 2 块 即分成 2 组;主存 8 块,即 2 区 2 组 2 块。组间直接映像,即 0 组对应 0 组,1 组对应 1 组;组内相联映像,即组内块和块可以随意存放。
(1)各字段对应关系图
根据(2)的结果,可以知道主存是 2 区 2 组 2 块,所以都用 1 个二进制位就能表示;Cache 就是比主存少个区号,别的都一样。有些题目还会给出每块的大小,可以标出块内地址的位数。
(3)根据映像关系 Cache 的 0, 1 只能存主存的 0, 1, 4, 5;Cache 的 2, 3 只能存主存的 2, 3, 6, 7;然后就和页面替换算法的题一样了。
这里就用到 LRU 替换算法了,近期最少访问的页作为被替换页;见表格 t=3 时,4 进来 0 组存满了,此时 4 刚用过,1 为最久没用过的所以 1 标记星号,当 t=4 时,又用到了 1,所以改为 4 标记星号。
时间t | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
主存块地址 | 1 | 2 | 4 | 1 | 3 | 7 | 0 | 1 | 2 | 5 | 4 | 6 | 4 | 7 | 2 | |
Cache 块 | 0 | 1 | 1 | 1* | 1 | 1 | 1 | 1* | 1 | 1 | 1* | 4 | 4 | 4 | 4 | 4 |
1 | 4 | 4* | 4* | 4* | 0 | 0* | 0* | 5 | 5* | 5* | 5* | 5* | 5* | |||
2 | 2 | 2 | 2 | 2* | 7 | 7 | 7 | 7* | 7* | 7* | 6 | 6 | 6* | 2 | ||
3 | 3 | 3* | 3* | 3* | 2 | 2 | 2 | 2* | 2* | 7 | 7* | |||||
命中情况 | 失 | 失 | 失 | H | 失 | 替 | 替 | H | 替 | 替 | 替 | 替 | H | 替 | 替 |
(4)块失效又发生块争用的时刻:6, 7, 9, 10, 11, 12, 14, 15(发生替换的时刻)
(5)命中率: H c = 3 / 15 = 0.2 H_c=3/15=0.2 Hc=3/15=0.2
5. 存储体系性能参数
历史考题:2020.10
题目描述:计算存储系统平均访问时间、访问效率、加速比。
2020.10 真题
有一个由 Cache 和主存组成的两级存储系统:主存的容量为 100MB,访问时间为 200ns,主存每 MB 的价格为 1 元;Cache 的容量为 4MB,访问时间为 10ns,Cache 每 MB 的价格为 50元。该系统运行某程序,在一段时间内,访问 Cache 的次数为 1980 次,访问主存的次数为 20 次。要求:
(1)计算该存储系统每 MB 的平均价格。
(2)计算系统运行该程序时 Cache 的命中率。
(3)计算该存储系统的平均访问时间。
(4)计算该存储系统的访问效率。
解:
(1) 100 × 1 + 4 × 50 100 + 4 ≈ 2.88 \frac{100\times 1+4\times 50}{100+4}\approx 2.88 100+4100×1+4×50≈2.88
(2) 1980 1980 + 20 = 99 % \frac{1980}{1980+20}=99\% 1980+201980=99%
(3) 20 × 200 + 1980 × 10 2000 = 11.9 n s \frac{20\times 200+1980\times10}{2000}=11.9\ \mathrm{ns} 200020×200+1980×10=11.9 ns
补充:标准公式是 T A = H T c + ( 1 − H ) T m \mathrm{T_A=HT_c+(1-H)T_m} TA=HTc+(1−H)Tm,有时题目会给命中率(访问 Cache 代表命中),也要会用这个公式算,原理是一样的。
(4)访问效率 e = T c / T a = 10 / 11.9 ≈ 84 % \mathrm{e=T_c/T_a=10/11.9\approx 84\%} e=Tc/Ta=10/11.9≈84%
稍微记一下公式,其实 T c \mathrm{T_c} Tc 也就意味着全部命中的平均时间,也就是最理想的时间,用他除以实际的平均时间自然可以代表效率;有的题是算关于加速比的 s = T m / T a \mathrm{s=T_m/T_a} s=Tm/Ta,也就是最慢时间除以实际平均时间。
文章评论