读书笔记:CSAPP第6章-存储器层次结构

如下是一道关于高速缓存的经典题目:

假定主存地址位数为 32 位,按字节编址,主存和 cache 之间采用全相联映射方式,主存块大小为一个字,每字 32 位,采用回写( Write Back )方式和随机替换策略,则能存放 32K 字数据的 cache 的总容量至少应有多少位?

如果不了解高速缓存的原理,看到这个题大概率会懵住。答案在最后,暂时先不看这道题,来复习一下CSAPP第6章。

一、存储器技术

1. 随机访问存储器(RAM)

易失性存储器:可分为静态RAM(SRAM)和动态RAM(DRAM)。

  • SRAM是用六晶体管电路实现,比较稳定,存取速度较快但价格贵,多用于高速缓存存储器;
  • DRAM以充电电容和访问晶体管实现,并不十分稳定,其自然的维持时间很短,所以需要内存系统周期性的读出并重写来刷新每一位。功耗大于SRAM,速度低于SRAM但价格低,多用于主存。

非易失性存储器:只读存储器(ROM),闪存,固态硬盘(SSD)。

2. 磁盘存储

2.1 总线结构

总线结构

如图,CPU、主存、I/O设备通过I/O桥相互连接。CPU与I/O桥之间的总线叫系统总线,主存与I/O桥之间的总线叫内存总线,外部I/O设备通过I/O总线连接到I/O桥。I/O桥的作用是信号翻译和传递。

2.2 磁盘构造


如图是旋转磁盘的构造示意图。主要有以下几部分:

  • 盘片:磁盘由盘片构成。
    • 表面:每个盘片有两个表面。
      • 磁道:每个表面上分布着一组同心圆叫磁道。
        • 扇区:每个磁道被划分为若干扇区,每个扇区包含相等的数据位(通常为512字节)。磁盘以扇区大小的块来读写数据。
  • 主轴:盘片中央可以旋转的轴,使得盘片以固定速率旋转,通常是5400~15000转每分钟(RPM)。
  • 读写头:用来读写储在磁性表面的位。

磁盘通常会带有一个控制电路,整个装置叫磁盘驱动器,简称磁盘。

2.3 扇区的访问时间

对扇区的访问时间有三个主要部分:

  • 寻道时间:传动臂将读写头定位到包含目标扇区的磁道上所需的时间。
  • 旋转时间:驱动器等待目标扇区旋转到读写头下所需的时间。平均旋转时间是旋转一周耗时的一半。
  • 传送时间:目标扇区在读写头下经过的时间。

二、存储器层次结构

存储器层次结构的核心思想:对于每个k,位于k层的更快更小的存储设备作为位于k+1层的更大更慢的存储设备的缓存。

三、 高速缓存存储器(关键)

高速缓存存储器位于CPU和主存之间,其出现的原因是CPU和主存之间的性能差距越来越大。通用的高速缓存存储器的组织结构如下:

在这里插入图片描述

假设计算机系统的内存地址长m位,其可表示的地址个数为2^m个。其地址可按上图划分为3部分:t位长的标志部分,s位长的索引部分和b位长的偏移部分。所以有恒定关系m = t + s + b。(该划分并不考虑地址的意义,只是单纯地将它当做无符号整数,其划分为这几部分,只是用来定位缓存存储器内的数据)

如图,高速缓存存储器被组织为S个组,每个组有E个行,每个行有1个块,每个块有2^b个字节。每行除了有一个块以外,还有一些额外的信息:

  • 有效位(必须):用来标记该行的数据是否有效。长1位。
  • 标记(必须):用来对行唯一定位,与对应地址中t位长的标记部分一致。很明显该标记长为t位。
  • 脏位(可选):用来说明该行是否被修改,以便在缓存换出时决定是否要写回磁盘。长1位。

在m位长的地址中,t位长的标志部分用来唯一确定存储器的E个行中的一行,s位长的索引部分用于唯一确定S个组中的一个,b个位长的偏移部分用来定位块中的字节。

由地址查找缓存数据的步骤:给定一个地址,首先看地址中的索引部分,找到高速缓存对应的组,其有效位是1(如果是0说明缓存不命中,这时要去内存寻找数据,并替换某个缓存行),再看地址中的t位长的标记部分,对应组中逐个匹配,直到找到行中标志部分与地址标志部分相同的行(找不到也说明缓存不命中),再看地址中的b位长的偏移部分,将对应的高速缓存行中的块偏移一定值,返回给CPU。这时是缓存命中。

1. 直接映射高速缓存

在这里插入图片描述

直接映射高速缓存:每组只有一行(E = 1)的高速缓存。

2. 组相联高速缓存

在这里插入图片描述

组相联高速缓存:每个组有多于1个的行。

3. 全相联高速缓存

在这里插入图片描述

全相联高速缓存:只有一个组,该组包含所有高速缓存行。适合做小的高速缓存,如翻译后备缓冲器(TLB)。


再来看下开头的题目:

32bit地址空间按字节编址,主存中每个块大小为1个字,每个字大小为32位=4Byte。

全相联cache中只有一个组,每组有若干行,每行含一个块,以及长1的有效位,长1的脏位(题上要求写回方式),长为t的标记位(用来定行每行块内字节)。

由于每个块长为1个字=32位=4Byte,4Byte的块需要用到2个二进制位的偏移来定位(所以b = 2),也就是t = m - b = 32 - 2 = 30,这么一来每一行的非数据位有30(标记位)+ 1(有效位) + 1(脏位)= 32位。

要缓存存32K字数据,而该cache中每行存一个块=1字,所以最少需要有32K行,每行里的非数据位有32位,数据位为1字=32位,相当于每行占64位,共有32K行,总存储位数应该最少为32K*64=2048K。

2019/10/14 15:57
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值