做硬件的,对这部分应该是理解比较透,但实际的情况,却还是有些含糊的地方 ---2019-10-25
如:2016年下半年第1题
程序运行过程中,CPU需要 将指令从内存中取出并加以分析和执行。CPU依据()来区分 在内存中以二进制编码形式存放的指令和数据。
A、指令周期的不同阶段
B、指令和数据的寻址方式
C、指令操作码的译码结果
D、指令和数据所在的存储单元。
答:根据自己的的基础可以很快排除BC,徘徊在A,D间,A都是寻址,取指这些阶段怎么区分?D、存储单元不同,可能是堆、栈,这些都是内存,怎么区分?
像这种自身知识结构 有二义性 的题,一定要选择自身知识结构中自以为的顺序相关的选项。如本题,只知道,指令的周期是寻址、执行,并且,数据也是这样取的这肯定是正确的过程,所以与此相关的。只能是A
但这都不是根本的,最重要的是通过考试能把自己忽视的知识点能尽快补全自己的知识结构。正确的解释如下:
实际上计算机可以从两个方面来做区分 指令和数据,分别是时间和空间。
1.时间。在取指周期(或取值微指令)取出的为指令,在指令执行周期(或相应微程序)取出(或写入)的为数据。
2.空间(或者叫地址来源)。由PC提供存储单元地址的取出的是指令,由指令地址码部分(Add(IR))提供存储单元地址的取出的是操作数。内存取出指令送控制器,而指令执行周期从内存中取的数据送运算器、往内存写入的数据也是来自于运算器。
主存与cache技术:
如2016年上半年第2题:
主存与cache地址映射方式中()可以实现主存中任意一块装入cache中任意位置,只有装满才需要替换。
A、全相联
B、直接映射
C、组相联
D、串相联
答: A
扩展:
在Cache-主存层次中,CPU首先访问的是Cache,并不是主存。为此,需要一种机制将CPU的访主存地址转换成访Cache地址。而主存地址与Cache地址之间的转换是与主存块与Cache块之间的映射关系紧密联系的,也就是说,当CPU访Cache未命中时,需要将欲访问的字所在主存中的块调入Cache中,按什么样的策略调入,直接影响到主存地址与Cache地址的对应关系。
直接映射(directmapping)
将一个主存块存储到唯一的一个Cache行。
全相联映射(fullyassociative mapping)
可以将一个主存块存储到任意一个Cache行。
组相联映射(setassociative mapping)
可以将一个主存块存储到唯一的一个Cache组中任意一个行。
直接映射
多对一的映射关系,但一个主存块只能拷贝到cache的一个特定行位置上去。
cache的行号i和主存的块号j有如下函数关系:i=j mod m (m为cache中的总行数)
优点:硬件简单,容易实现
缺点:命中率低, Cache的存储空间利用率低
通俗理解:相当于将主存空间按cache的大小(行数)进行分区(说“分组”也可以),主存分区(组)后,每区(组)中的数据块数目与cache的行数一致。
将每一区(组)的数据块在区(组)内重新进行编号。使区(组)内各块只能映射到与它区(组)内编号相同的cache行去。
映射过程:
a、首先将主存按照cache的大小进行分区(组):16/4=4(组),即将主存分为4组,编号分别为G0~G3,这样每组中拥有与cache行数相同的数据块。
b、对每组内的数据块进行“组内重新编号”,即B0变为G0的b0,B1变为G0的b1,B2变为G0的b2,B3变为G0的b3;B4变为G1中的b0,B5变为G1中的b1,B6变为G1中的b2,B7变为G1中的b3。依次类推。
c、这样,组内编号为b0的主存块如果需要拷贝至cache,只能放置到L0;b1只能拷贝到L1;b2只能拷贝到L2;b3只能拷贝到L3。如上图所示,相同颜色的说明可以进行拷贝。
主存地址格式:主存组号+组内块号+块内偏移地址
cache地址格式:cache行号+行内偏移地址
cache标记tag:映射到该行的主存块的主存地址的“组号”
映射过程(地址变换过程):
CPU提供一内存地址给cache,相关的逻辑根据内存地址中的“组内块号”确定该主存块如果发生拷贝会被拷贝到哪一行;
然后,将内存地址中的“主存组号”与上步确定的cache行的标记tag进行比较,如果存在相同的即“命中”,如果不存在相同的即“未命中”。
全相联映射
主存的一个块直接拷贝到cache中的任意一行上
优点:命中率较高,Cache的存储空间利用率高
缺点:线路复杂,成本高,速度低
主存地址格式:主存块号+块内偏移地址
cache地址格式: cache行号+行内偏移地址
cache标记tag:主存块号
映射过程(地址变换过程):
CPU提供一内存地址给cache,cache中的“控制逻辑”将“主存地址格式”中的“主存块号”与cache中所有行的标记tag进行同时比较。
如果存在相同的,即表示“命中”,根据“块内偏移地址”找到相应的字。
如果不存在相同的,即表示“未命中”,那么将会到主存中寻找。
组相联映射
将cache分成u组,每组v行,主存块存放到哪个组是固定的,至于存到该组哪一行是灵活的,即有如下函数关系:cache总行数m=u×v 组号q=j mod u
组间采用直接映射,组内为全相联
硬件较简单,速度较快,命中率较高
关键:cache的分组数=主存每一组的块数
a、cache共4行,采用2路组相联映射,即将cache分为2组G0~G1,每组2行。
b、cache的分组数=主存每一组的块数,即将主存分为8组g0~g7,每组2块。
c、主存组内进行重新编号b0、b1,如上图所示
d、凡是组内编号为b0的主存块,可以拷贝至cache的G0组,至于是2行中的哪一行,是随机的无硬性规定的。依次类推,组内编号b1的主存块可以拷贝至G1组
主存地址格式:主存组号+组内块号+块内偏移地址
cache地址格式:cache组号+组内行号+行内偏移地址
cache标记tag:组号
映射过程(地址变换过程):
CPU提供一内存地址给cache,相关逻辑根据地址中的“组内块号”部分确定主存块如果发生拷贝将会被放置到cache的哪一组中;
然后,将地址中的“主存组号”与上步所确定的那一组中所有行的tag同时进行比较,如果存在相同的即“命中”,如果不存在相同的即为“未命中”。
三种映射规则能够简单觉得是对取模运算和取商运算的组合;
如果:内存=30块,cache=5块,1块=10个字,所以内存=300个字。cache=50个字;内存包括的字数为memsize,块包括的字数为blocksize,cache包括的字数为cachesize,每一个区包括的块数为regionblocknum。每一个组包括的块数为groupblocknum,区内块号(区内偏移量)为regionblockoffset。
直接映射:memsize MOD blocksize获得的是字在块内的偏移量。memsize / blocksize获得的是块的标号作为标记。
全相联映射:regionblocknum取cache中的块的数量,所以cahce总是与内存中的一个区大小同样。(memsize / blocksize)获得全部的块数,然后再对块进行分区,分区操作是(memsize / blocksize)/regionblocknum获得全部的区数,
(memsize / blocksize)MOD regionblocknum获得区内块号(区内偏移量)。区内偏移量做索引,区号做标记。
组相联映射:regionblockoffset=(memsize / blocksize)MOD regionblocknum,regionblockoffset / groupblocknum获得组内偏移量,regionblockoffset MOD groupblocknum获得组号。