这部分的刷题,其知识点是计算机组成原理与操作系统的交叉篇,计算机组成原理,应该说在Cache这部分内容后,就有了千丝万缕的关系。
本节刷题内容:存储器
题库参考:百度文库,王道考研,408真题
涉及的知识点:
- Cache与主存之间的映射
- Cache地址字段含义
- 程序的局部性原理
- 虚拟存储器原理
- 虚实地址映射的过程
- TLB
第一题
解析:概念题,Cache只是主存中的一部分内容的副本,所以,Cache的内容本身就从属于主存,选B
第二题
解析:这道题信息量有点多,慢慢分析.Cache一共有16块,每组有2块,所以一共有8组。那么一块的大小为32B,试问,129号存储单元位于第几块呢?(注意存储块与存储单元是不同的)
第三题
解析:这是一道典型的操作系统跟组成原理结合的题目,很是有意思。先从条件推已知:
按字编址(不是字节了),Cache有4行,采用的是2路,于是得出结论,有两组,每组两行。在Cache的设计中我们知道,cache中的块大小跟主存中的块大小是一样的,所以,在主存中的两个相邻的单元,被划分成为同一块。
由计算组数的公式可以算出块号所在的组号,在组内的块随机存放,但是一旦存满了,就要进行置换,方式题目中说了是LRU,所以,根据LRU的算法,画出对应的置换过程:
为什么这里倒数第二列中,4置换掉的是0而不是8呢?明明8存在的时间最长?注意了LRU是指最近未被访问,8在倒数第四次的时候,被访问,只不过是命中罢了。
第四题
解析:先读题,容量为16kb,若按字节编址,那么就要用到14位来表示它的地址。所以把所给地址中,取后面的14位就可以得到正确答案。不过,这样似乎有些不太好理解,因为我们教材中的地址格式是这样的:
我们更想知道具体的位数,所以,一行有16B,所以按字节编址的形式容量应该是 1K X 16B,也就是说,字块内地址是4位,Cache字块地址为10位(因为有1k块)。最后得出结果:
第五题
解析:对比上一题,都是考对地址字段的理解,先读题。128kB,每块16B,所以我们知道一共有8K块。8路组相联,自然是8块为一组。所以有1K个组
显然,我们可以得出组内地址有10位,块内地址有4位。现在问的不是地址了,是tag。所以我们反过来取出所给的地址中,除去后面的14位的二进制数就好了,具体过程如下:
第五题
分析:首先从题目中我们可以得到下面这些信息:一块的大小为8X32位,也就是32B,每个字32位,所以字块内的地址为5位。
所以Cache中一共有(16kb/32B) = 0.5K块。也就是需要9位来表示,题目问的是块号,我们写出直接映射的地址格式:
所以我们只要写出所给地址的后14位,再把后面的5位去掉,就可以得到块号。计算中,答案给的是十进制数,多位的二进制数往往不好直接转换成10进制数,所以,灵活点,变成16进制数,再转10进制。过程如下:
第六题
分析:这是一道含有代码的题目。咋看之下,第一眼确实是没什么思路,都不知道跟题目有什么关系。这需要一定的编程基础。先看看信息。一个int类型的数据占4B,一个块大小为16B,这里我们知道一个块最多可以装4个int类型的数据。一开始Cache为空,我们知道,第一次访问一定不会命中(这是废话)。
学过C/C++的同学应该知道,数组是顺序存储的,第一个元素的地址就是其首指针。所以,循环里面的语句,是从数组的地址中,取出这个数,然后运算后再重新放回其同一地址,所以,一次操作要进行两次访存。这里有个很重要的知识点,就是主存与Cache之间是使用块作为单位传递的。所以Cache不命中的时候,就会从主存中,调入一个块出来(里面有4个整型值)。k自增的时候,除了第一次会缺失,其他三次都会命中,所以:
8次访问,第一次会缺失,后面都存在Cache中,不会缺失。
第七题
分析:这也是一道代码题。不过比上题简单多了。这里只要明白了时间局部性跟空间局部性的原理就可以了。
1.循环执行某一个操作,体现了时间局部性
2.频繁的访问数组A的地址,体现了空间局部性。
第八题
分析:这道题目看起来挺吓人的,不过认真分析,发现也挺简单的。采用页式管理,首先想到的是,它的页内偏移地址跟实地址中的偏移地址是一样的(这个不多解释,之前的博文有解释)。而页面的大小是4KB,意味着,页内偏移有12位二进制数,也就是3位16进制数,所以实地址的后三位一定是180H。显然,页内偏移地址前面的就是页号了,查所给的页表,找到03FFFH,于是找到对应的页框号,有效位为1,说明所要找的存在与主存中,所以没有缺页。最后,实际地址与页偏移拼接在一起得到A答案。
第九题
分析:这里写的很详细了