目录
前言
所用课本是袁春风老师所编著的【计算机系统基础】第二版,本篇文章主要是以题目为主,为穿插部分重要的知识点,以此来达到学习的目的。所用课件是上课时候老师的课件。
一、计算机系统概述
1.计算机性能
题目:若有两个基准测试程序P1和P2在机器M1和M2上运行,假定M1和M2的价格 分别是5000元和8000元,下表给出了P1和P2在M1和M2上所用的时间和指令条数。 请回答下列问题。
(1)对于P1,哪台机器的速度快?快多少?对于P2呢?
(2)在M1上执行P1和P2的速度分别是多少MIPS?在M2上的执行速度又各是多少?从执行速度来看,对于P2 ,哪台机器的速度快?快多少?
(3)假定M1和M2的时钟频率各是800MHz和1.2GHz,则在M1和M2上执行P1时的平均时钟周期数CPI各是多 少?
(4)如果某个用户需要大量使用程序P1,并且该用户主要关心系统的响应时间而不是吞吐率,那么,该用户 需要大批购进机器时,应该选择M1还是M2?为什么?(提示:从性价比上考虑)
(5)如果另一个用户也需要购进大批机器,但该用户使用P1和P2一样多,主要关心的也是响应时间,那么应 该选择M1,还是M2?为什么
解析:(1)观察P1行在M1和M2的执行时间。它们分别为1000ms和500ms,故M2快且是M1速度的两倍。同理P2可得出M1快且是M2的两倍。
(2)执行程序的速度=指令条数/执行时间。故M1:执行P1速度200MIPS(200万条指令/秒)执行P2速度为100MIPS;M2:执行P1速度300MIPS,执行P2速度70MIPS。对比可知对于P2,M1运行速度更快。
(3)CPI = 程序总时钟周期数 / 程序总指令条数;
用户CPU时间(题目中的执行时间)= 程序总时钟周期数 × 时钟周期;
时钟周期 = 1 / 时钟频率 ;
因此在M1上执行P1 CPI: 1s×800MHz / 200M =4 ;
M2上 CPI:0.5s×1.2GHz / 150M = 4。
(4)由题可知用户关心的是响应时间,故专注于执行时间。M2的执行时间×价格(4000/s) < M1的执行时间×价格。故选M2(5000/s)
(5)M1上平均运行时间为(1000 + 3 )/ 2 = 501.5ms,M2上平均运行时间为 (500+6) / 2 = 253. M2的平均执行时间×价格 (2024)< M1的平均执行时间×价格(2507.5)故选M2。
注:这题答案不唯一,如果用上述算术平均值答案为M2,如果用几何平均值则相反。
题目:假定机器M的时钟频率为200MHz,某程序P在机器M上的执行时间为12s。对P优 化时,将其所有乘4指令都换成了一条左移两位的指令,得到优化后的程序P'。若 在M上乘法指令的CPI为102,左移指令的CPI为2,P的执行时间是P'执行时间的 1.2倍,则P中有多少条乘法指令被替换成了左移指令执行
解析:优化前:执行时间 = 优化前程序总时钟周期数 ÷ 时钟频率
优化后:执行时间 = 优化后程序总时钟周期数 ÷ 时钟频率
优化前比优化后多2s,所以带入上面式子可得多了200M个时钟周期,每条乘法指令比左移指令多(102-2)个时钟周期,故400M / 100 = 4M。即有400万条乘法被替换为左移了。
二、数据的机器数表示与处理
1.浮点数表示
题目:假定一个float型变量x的机器数为 4510 0000H,则变量x的值是多少?
解析:首先将十六进制数转换为二进制数,二进制结果为 0100 0101 0001 0000 0000 0000 0000 0000,一共32位。根据IEEE 754标准,float为单精度浮点数,包括1位的符号s,8位的阶码e和23位位数f。(如下图)
故符号位为0,阶码为1000 1010,尾数的值为1.001B=1.125,阶码的真值为138-127=11。所以x的值为 +1.125×2^11 = 2304
题目:假定在一个程序中定义了变量x和y,其中x是16位short型变量(补码表示),y是float型变量(IEEE 754单精度浮点数表示)。程序执行到某一时刻,x= +35,y= -12.75,且都被写到主存(按字节编址),地址分别是1002H 和 1006H。请回答以下问题:
(1)写出该时刻x和y对应的机器数;
(2)画出小端方式机器上变量x和变量y的每个字节在主存的存放位置图(包括地址和内容)
解析:
(1)x的机器数 0023H(具体过程省略), -12.75 = -1100.11B = -1.10011B×2^3,故符号位s为1,阶码的真值是3,阶码E是127+3 = 1000 0010 故 y的机器数(二进制形式是)1 1000 0010 100 1100 0000 0000 0000 0000 转化为16进制就是 C14C0000H
(2)小细节:地址是16进制的,8个字节为一个存储单元,是小端机!
1002H | 23H |
1003H | 00H |
....... | |
........ | |
1006H | 00H |
1007H | 00H |
1008H | 4CH |
1009H | C1H |
2.浮点数乘除运算(Booth算法)
题目:设机器字长为5位(含一位符号位,n=4),x = -0.1101, y = 0.1011,采用Booth算法求解x·y。
解析:先求得【x】补 = 11.0011,【-x】补 = 00.1101,【y】补 = 0.1011(下图是具体的Booth运算,不详细解释了,再附加一张标准答案)
题目:已知x = +1010B,y= -1100B,用Booth算法计算x × y(要求写出运算过程)
解析:求出【x】补 = 00.1010B,【-x】补=11.0110B,【y补】=1.0100B (下图是具体的Booth运算,不详细解释了,再附加一张标准答案)
三、程序的转换及机器级表示
1.IA-32指令系统概述(寄存器组织和寻址方式)
题目:假设以下地址以及寄存器中存放的机器数如下表所示。
地址 | 机器数 | 寄存器 | 机器数 |
0x0804 9300 | 0xFFFF FFF0 | EAX | 0x0804 9300 |
0x0804 9400 | 0x8000 0008 | EBX | 0x0000 0100 |
0x0804 9384 | 0x80F7 FF00 | ECX | 0x0000 0010 |
0x0804 9380 | 0x908F 12a8 | EDX | 0x0000 0080 |
分别说明执行以下指令后,哪些地址或寄存器中的内容会发生改变?改变后的内容是什么?条件标志OF、SF、ZF和CF会发什么什么改变?
(1)addl (%eax),%edx
(2)subl (%eax,%ebx),%ecx
(3)orw 4(%eax,%ecx,8),%bx
(4)testb $ 0x80,%dl
(5)imull $32,(%eax,%edx),%ecx
(6)mulw %bx
(7)decw %cx
解析:OF:反映有符号数加减运算所得结果是否溢出,是则为1
SF:符号位,负数为1,整数为0
ZF:计算结果为零时为1,不为零是为0
CF:反映无符号数加减运算所得结果是否溢出,是则为1
2.C语言程序的机器数展示
题目:
解析:
五、程序的设计
1.指令流水
题目:假设指令流水线分取指(IF)、译码(ID)、执行 (EX)、回写(WR)4个过程段,共有10条指令连续输入此流水线。试问:
(1)画出指令周期流程
(2)画出非流水线时空图
(3)画出流水线时空图
(4)假设时钟周期为100ns,求流水线的实际吞吐率
(5)求该流水处理器的加速比
(6)求该流水线的效率
解析:
(1)指令周期包括 IF、ID、EX、WR这4个子过程,下图为指令周期流程图。
(2) 若是非流水线,那么输出一个结果需要四个时钟周期(每个具体指令占一个时钟周期)
(3) 若为流水线,那么第一个输出结果需要四个时钟周期,之后每一个时钟周期都输出一个结果
(4)
这题没什么难度直接带入公式就可以了。
(5)该流水线的加速比是非流水线的时钟周期流水线的时钟周期,也就是40/13=3.08
(6) 流水线的效率也就是加速比/m,3.08/4 = 0. 7
2.流水线冒险
结构冒险
当流水线中多条指令在同一时钟周期内争用同一功能部件的现象。即因硬件资源满足不了指令重叠执行的要求而发生的冲突的情况称为结构冒险
题目:解决访存冲突的一种办法是设置两个独立的存储器分别存放操作数和指令,以免取指令和取操作数同时进行时互相冲突,使取某条指令和取另一条指令的操作数实现时间上的重叠。()
解析:对
数据冒险
当后面指令用到前面指令结果数据时,前面指令的结果还没产生而产生的情况称为数据冒险
常见的形式有:1.写后读、2写后写、3.读后写
题目:下面这组指令存在哪种数据冒险?
控制冒险
控制冒险是一种特殊的数据冒险,只不过相关的数据对象是PC。如取指令用到PC,而转移指令则会修改PC
假设指令3是转移指令
题目:控制相关主要是由转移指令引起的()
解析:对
六、层次结构存储系统
1.存储器容量扩展(字、位扩展)
题目:假定用若干个16K×1位的存储器芯片组成一个64K×8位的
存储器,芯片内各单元连续编址,则地址BFF0H所在的芯片的
最小地址为( C )。
° A. 4000H B.6000H
° C. 8000H D. A000H
解析:第一步:将地址BFF0H转化二进制数,值为1011 1111 1111 0000
第二步:确定编址方式:连续编制。故片选信号存放在左端。因为64/16=4=2^2 故只看最左端的前两位(这里有同学会犯错,认为前五位都是片选信号 2^5=32,下面会具体解释)为10。所以地址BFF0H所在芯片的最小地址的二进制数是1000 0000 0000 0000 = 8000H 选C项
下面这道题与该题相似,只要能看懂图应该就能理解了。
![](https://i-blog.csdnimg.cn/blog_migrate/8a51fb5860cbc10829277c728410fb77.png)
![](https://i-blog.csdnimg.cn/blog_migrate/07d8a0d99b1f544946a3fe6e843e32f0.png)
题目:假定用若干个16K×8位的存储器芯片组成一个64K×8位的
存储器,芯片各单元交叉编址,则地址BFFFH所在的芯片的最
小地址为( D )
° A.0000H B.0001H
° C.0002H D.0003H
解析:第一步:将地址BFFFH转化二进制数,值为1111 1111 1111 1111
第二步:确定编址方式:交叉编制。故片选信号存放在右端。因为64/16=4=2^2 故只看最右端的后两位为11。所以地址BFF0H所在芯片的最小地址的二进制数是0000 0000 0000 0011 = 0003H 选D项
2.磁盘响应时间
题目:假定一个磁盘的转速为7200RPM,磁盘的平均寻道时间
为20ms,平均数据传输率为1MB/s,不考虑排队等待时间,
那么读一个512字节的扇区的平均时间大约为( C )。
A.14.7ms B.18.8ms
C.24.7ms D.28.8ms
解析:T= 磁盘转一周所需要的时间/2 + 平均寻道时间 + 数据传输时间
T= (1/120s)/2 + 20ms + 2^9/2^20s 0.00417 + 0.020 + 0.0004882813
24.7ms 故选C
3.chache的映射
I.直接映射(Direct)
映射关系:Cache的行号 = 主存块号 mod Cache的行数
题目:假定主存块为512B。 Cache大小: B=8KB=16行 x 512B/ 行 主存大小:
B = 1024KB = 2048块 x 512B/块 。
问如何对 0220CH单元进行访问?
解析:主存块内地址为512B = B,Chache索引为16 =
,主存块数量为2048 =
块,主存块群为 2048/16 = 128 =
。将0220CH转换为二进制数 0000 0010 0010 0000 1100B
题目:依照上图给出内存1、 31、2033块 的头一个字节及最后一字节地址(16进制形式 ),给出中间推导过程 。
解析:下面给出内存1的头一个字节的地址推到过程
同理只需要把后九位改成1 1111 1111就变成最后一个字节的地址。
内存31块则需要把主存块号修改成 0000 0011 111,内存2033块的主存块号为 1111 1110 001。
题目:设主存与 Cache采用直接映射,主存容量 128KB, Cache的容量为4KB,每个块为256B。
试问:(1)主存和 Cache地址格式。
(2)主存的地址有多少位? Cache地址有多少位?
(3)主存有多少个块? Cache有多少块?
(4)主存地址为1032CH单元映射到Cache中的位置。
解析:
II.全相联映射 (Full associate)
题目:假定主存块为512B。 Cache大小: B=8KB=16行 x 512B/ 行 主存大小:
B = 1024KB = 2048块 x 512B/块 。
问如何对 01E0CH单元进行访问?
解析:将01E0CH转换为二进制0000 0001 1110 0000 1100B。即在第15块的第12个单元
题目:设主存与 Cache采用全相联映射,主存容量128KB,Cache的容量 为4KB,每个块为256B。
试问:(1)主存和 Cache的地址格式。
(2)主存有多少个块? Cache有多少块?
(3)主存地址1032CH单元映射到Cache中的位置和访问过程。
解析:(注:与直接映射不同的地方是不需要机选Cache的块号,因为它可以映射到任意Cache块上去。)
III.组相连映射(Set associate)
映射关系:Cache组号=主存块号 mod Cache组数
题目:假定主存块为512B。 Cache大小: B=8KB=16行 x 512B/ 行 主存大小:
B = 1024KB = 2048块 x 512B/块 。
问如何对 0120CH单元进行访问?
解析:我这两将16行分为了8组,每组两行。将0120CH转换为二进制数0000 0001 0010 0000
1100B是第1组群中的001块(即第9块)中第12个单元。所以,映射到第一组中。
4.Cache中主存块的替换算法
问题场景(什么是替换算法,何时用)
组相联映射时,假定第0组的两行分别被主存第0和8块占满,此时若需调入主存第16块,根据映射关系,它只能放到Cache第0组,因此,第0组中必须调出一块,那么调出哪一块呢? 这就是淘汰策略问题,也称替换算法。这里只介绍FIFO和LRU
直接映射不需要考虑替换,而组相联和全相联需要考虑替换
先进先出算法(FIFO)
先进入Cache的数据先被替换
如下图先进入的数据是带有星号的,如果Cache中没位置给新进来的数据,那么带星号的数据就将会被替换掉,通过举例可知FIFO不是一种栈算法,命中率不会随着组数的增大而增大。
最近最少用 (LRU)
当有新数据进来并且Cache中并且Cache中没空余的位置时,LRU就会将最近最近最少用到的数据踢出Cache,将新数据存进来。
如下图,为了更好的理解意思,将最近使用的数据(主存块)是放在最上面的,反之最不常用的在最下方,如果发生替换,那么最下面的将会被淘汰。(其实LRU并不能实现移动块,这样做是为了更好的理解LRU的工作原理)我们也发现LRU是种栈算法,其命中率会随着组数的增大而增大
实际的样子应该是这样的:
红色为计数器,黑色为数据(行中的主存块)
题目:
假定计算机系统主存空间大小为32Kx16位,且有一个数据区为4K字的4路组相联Cache,主存块大小为64字。假定Cache开始为空,处理器顺序地从存储单元0、1、…、4351中取数,一共重复10次。
设Cache比主存快10倍。采用LRU算法。试分析Cache的结构和主存地址的划分。说明采用Cache后速度提高了多少?采用MRU算法后呢?
解析:
这里需要注意的是第一次循环为什么每一块只有第一个字为命中,其余的都命中,也就是命中率p的式子中的68的含义。
因为你访问0存储单元的时候因为Cache中没有数据,故它把第0块全搬过来了也就是0-63存储单元的内容。这就是为什么只有第一个字没命中。
为什么以后9次循环,有20块的第一字未命中,其余都命中,也就是式子中9×20的含义是什么?
首先得要清楚这里采用的是什么算法,LRU!是最近最少用的被替换。第一次循环结束后,Cache中是这样的,现在你得要访问0-3块但是Cache中没有,根据LRU的规则,我们替换的是左上方第二个红框,也就是16-19。
替换完0-3后Cache中是这样的,由于4-15仍在Cache中故不需要替换,16-19被前一次替换掉了,现在需要重新装入Cache中,故会替换掉32-35块。以此类推,到67块时需要替换20次(第二次循环),这就是为什么一次循环要替换20次!
5.Cache一致性问题
问:为什么要保持在Cache和主存中数据的一致性?
答:因为Cache中的内容是主存块副本,当对Cache中的内容进行更新时, 就存在Cache和主存如何保持一致的问题。除了这种情况还有当多个设备都允许访问主存时或者当多个CPU都带有各自的Cache而共享主存时都会遇到Cache一致性的问题
写命中和写不命中的处理方法:
全写法(write through)中的write buffer:
题目:
解析:主存块大小为一个字也就是四个字节4B,是按照字节编址,故块内地址占两位;cache共有32K字的数据,它的行数为32K字/字=32K行=2^15行,占15位;所以标志tag占32-15-2=15位。采用的是直写,所以无需修改位(dirty bit)。因此cache的总容量应该有32k×(1(有效位V)+15+32)=1536k。故选B
cache容量的算法我放在下面了
题目:
解析:跟上题解法基本一致,需要注意的是写操作是采用回写(write back)的方式需要增加一位的修改位(dirty bit)故cache的总容量应该有32k×(1+15+32+1)=1568k。故答案选C
思考:若在上题的基础上将映射方式从直接映射改为全相联映射,那么答案应该是什么?
解析:全相联映射下,主存地址只包含两个字段,所以标志位占32-2位,又采用的是回写法,所以需要一位的修改位。因此cache的总容量至少有32k×(1+30+32+1)=2048K
题外话
这篇文章会持续更新,记录学习过程中发现以及解决的问题!如果有什么疑问欢迎大家在底下留言讨论!我们一起进步拿offer!