第六章 存储器层次结构
存储器系统 是一个具有不同容量、成本和访问时间的存储设备的层次结构。
1.CPU寄存器:容量小,成本高,访问快
2.高速缓存存储器:CPU和主存之间的缓存区域
3.主存:磁盘上大容量,成本低,慢速
随机访问存储器分为两类:静态,动态。SRAM比DRAM更快,更贵。SRAM作为高速缓存存储器。DRAM作为主存。
SRAM将每个位存储在一个双稳态存储单元里。只要有电,它就保持他的值。
DRAM将每个位存储为对一个电容的充电。DRAM单元在10-100ms内失去电荷,所以需要刷新或者其他的方法保证数据正确性。
DRAM表示一般写成N*W,w是一个单元的位数,N是单元数。本身称这个单元是超单元。然后N又表示为r*c,这样的表示是寻址的时候地址引脚不会太多,比如N=16,就要4个引脚。4*4的话,4需要两个引脚。但是这种二维阵列组织有个缺点:两步发送地址,增加了访问时间。
DRAM的增强型有:FPM DRAM,EDO DRAM,SDRAM,DDR SDRAM(DDR,DDR2,DDR3),Random DRAM,VRAM。
PC使用的DRAM历史:95之前FPM,96-99EDO,-02SDRAM和DDR,-10DDR3。
非易失性存储器,SRAM和DRAM都是易失的。
ROM称为只读存储器是历史原因,很多ROM都是可写的。ROM的分类是以它们能够被重编程(写)的次数和对他们进行重编程的机制来划分的。
ROM包括:PROM,EPROM,EEPROM,闪存(基于EEPROM)。
存储在ROM设备中的程序通常称为固件。
总线事物:读事物——从主存传送数据到cpu,写事物——从cpu传送数据到内存。
磁盘是广为应用的保存大量数据的存储设备:盘片,表面,主轴,RPM,磁道,扇区,柱面。
对于SRAM和DRAM,KMGT通常是1024为基,但对于磁盘,KMGT以1000为基。
像图形卡,监视器,鼠标,键盘和磁盘这样的I/O设备,都是通过I/O总线(PCI)连接到cpu和主存的。
系统总线和存储器总线是与cpu总线相关的,但pci这样的总线和底层cpu无关。
I/O总线总是比系统总线和存储器总线慢,但是它可以容纳种类繁多的第三方I/O设备。主机总线适配器将一个或多个磁盘连接到I/O总线,最常用的是SCSI和SATA,前者更贵,更快。
cpu使用一种称为存储器映射I/O的技术,在使用该技术的系统中,地址空间中有一块地址是为与I/O设备通信保留的。每个这样的地址称为一个I/O端口。当一个设备连接到总线上时,它与一个或多个端口相联系。
cpu从磁盘读数据时发生的步骤:cpu通过将命令、逻辑块号和目的存储器地址写到与磁盘相关联的存储器映射地址,发起一个磁盘读;磁盘控制器读扇区,并执行到主存的DMA传送;DMA传送完成时,磁盘控制器用中断的方式通知CPU。
现代磁盘将他们的构造呈现为一个简单的视图,一个B个扇区大小的逻辑块序列。磁盘控制器维护着逻辑块号和实际(物理)磁盘扇区之间的映射关系。这里看到,逻辑块对应扇区。
SSD包,由一个或多个闪存芯片和闪存翻译层组成。
存储器和磁盘技术的一个基本事实:增加密度比降低访问时间更容易。
DRAM和磁盘的性能滞后于cpu的性能。现代计算机频繁的使用基于SRAM的高速缓存,试图弥补处理器-存储器之间的差距。这种方法可行是因为应用程序的局部性。
局部性
一个编写良好的计算机程序尝尝具有良好的局部性。也就是说,他们倾向于引用临近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。
这种倾向性,被称为局部性原理,是一个持久的概念,对硬件和软件系统的设计和性能都有着极大的影响。
局部性通常有两种不同的形式:时间局部性和空间局部性。
两者的区别在于时间对的是一个存储器位置,空间对的是附近的存储器位置。
被引用过一次的存储器位置很可能在不远的将来再被多次引用——时间。一个存储器位置被引用了一次,那么程序很可能在不远的将来引用附近的一个存储器位置——空间。
对于空间局部性,步长为1的引用模式称为顺序引用模式,这种模式具有最好的空间局部性,如数组,一个一个的顺序访问具有最好的空间局部性。
多维数组,按照行优先顺序,具有最好的空间局部性。
量化评价一个程序中局部性的简单原则:
- 重复引用同一个变量的程序有良好的时间局部性。
- 对于具有步长为k的引用模式的程序,步长越小,空间局部性越好。具有步长为1的引用模式的程序有很好的空间局部性。
- 对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好
存储器模块
DRAM芯片包装在存储器模块中,他是插到主板的扩展槽位上的。常见的包括168个引脚的双列直插存储器模块,他以64位为块传送数据到存储控制器和从存储控制器传出数据,还包括72个引脚的单列直插存储器模块,他以32位为块传送数据。
非易失性存储器
如果断电,DRAM和SRAM会丢失他们的信息,所以他们是易失的。
非易失性存储器,即使是在关电以后,也仍然保存着他们的信息。他们整体上都称为只读存储器(ROM)。
ROM以他们能够被重新编程的次数和对他们进行重编程所用的机制来区分的。
磁盘存储
磁盘是保存大量数据的存储设备。
1.磁盘构造
磁盘是由盘片构成的。每个盘片有两个盘面,表面覆盖着磁性记录材料。盘片中央有个可以旋转的主轴,使得盘片以固定的旋转速率旋转。
每个表面由一组称为磁道的同心圆组成的。每个磁道被划分为一组扇区,每个扇区包含相等数量的数据位,这些数据编码在扇区上的磁性材料中,扇区由一些间隙隔开,间隙存储用来标识扇区的格式化,不存储数据位。
2.磁盘容量
3.磁盘操作
磁盘用读/写头来读写存储在磁性表面的位,而读写头连接到一个传送臂一端,如图:
通过沿着半径轴前后移动这个传送臂。驱动器可以将读/写头定位在盘面的任何磁道上。这样的机械运动称为寻道。
3.逻辑磁盘块(重要)
4.连接到I/O设备
像图形卡、监视器、鼠标键盘和磁盘这样的输入/输出(I/O)设备,都是通过I/O总线连接到CPU和主存的。
虽然I/O总线比系统总线和存储器总线慢,但它可以容纳种类繁多的第三方I/O设备。
局限性
一个编写良好的计算机程序通常具有良好的局部性。他们倾向于引用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。这种倾向称为局部性原理。
局部性有两种不同形式:时间局部性和空间局部性。
有良好局部性的程序比局部性差的程序运行的更快。
存储器层次结构
存储器层次结构是组织存储器系统的方法,人想的,现在所有的计算机系统都使用了这种方法。
一般而言,高速缓存是一个小而快速的存储器设备,它作为存储在更大,也更慢的设备中的数据对象的缓冲区域。使用高速缓存的过程称为缓存。
存储器层次结构的中心思想是:对于每个k,位于k层的更快更小的存储设备作为位于k+1层的更大更慢的存储设备的缓存。
也就是说层次结构的每一层都缓存来自较低一层的数据对象。
这里必须强调一下,这也就是说数据时不可以越级的吗?
数据总是以块大小为传送单元在第k层和第k+1层之间来回拷贝的。例子:L1和L0的传送是1个字的块,L2和L1之间是8-16个字的块。
一些概念:缓存命中,缓存不命中,牺牲块,替换策略,冷缓存,强制性不命中,冷不命中,放置策略,冲突不命中,容量不命中。
- 编译器管理寄存器文件,缓存层次结构的最高层。
- L1,L2和L3的缓存完全是由内置在缓存中的硬件逻辑来管理的。
- DRAM主存作为存储在磁盘上的数据块得缓存,是由操作系统和cpu上的地址翻译硬件共同管理的。
- AFS这样的分布式文件系统,本地磁盘作为缓存,它是由运行在本地机器上的AFS客户端进程管理的。
概况来说,基于缓存的存储器层次结构行之有效,是因为较慢的存储设备比较快的存储设备更便宜,同时,还因为程序往往展示局部性。
高速缓存存储器
高速缓存结构(S,E,B,m):高速缓存组、高速缓存行、块映射
一般而言,高速缓存的结构可以用元组(S,E,B,m)来描述。高速缓存的大小(或容量)C指的是所有块的大小的和。标记位和有效位不包括在内。因此,C=S*E*B.
直接映射高速缓存
高速缓存确认一个请求是否命中,然后抽取出被请求的字的过程,分为三步:组选择、行匹配、字抽取
根据E(每个组的高速缓存行数)高速缓存被分为不同的类。每个组只有一行的高速缓存被称为直接映射高速缓存。
1.直接映射高速缓存中的组选择
2.直接映射高速缓存中的行匹配和字选择
3.直接映射高速缓存中不命中时的行替换
如果缓存不命中,那么需要从存储器层次结构中的下一层取出被请求的块,然后将新的块存储在组索引位指示的组中的一个高速缓行中。
替换规则:用新取出的行替换当前的行。
组相联高速缓存
每个组都保存有多于一个的高速缓存行
1.组相联高速缓存中的组选择
与直接映射高速缓存一样,组索引位标识组。
2.组相联高速缓存中的行匹配和字选择
比直接映射高速缓存更复杂
3.组相联高速缓存中不命中时的行替换
全相联高速缓存
一个全相联高速缓存是由一个包含所有高速缓行的组(E=C/B)组成的。
基本结构:
1.全相联高速缓存中的组选择
只有一个组,所以很简单
2.全相联高速缓存中的行匹配和字选择
全相联高速缓存与组相联高速缓存一样
编写高速缓存友好的代码
局部性比较好的程序更容易有较低的不命中率,而不命中率较低的程序往往比不命中率较高的程序运行的更快。
下面就是我们用来确保代码高速缓存友好的基本方法:
让最常见的情况运行得快。程序通常把大部分时间都花在少量的核心函数上,而这些函数通常把大部分时间都花在了少量循环上。
每个循环内部缓存不命中数量最小。(对局部变量的反复引用是好的,步长为1的引用模式是好的)
资料引用《深入理解》教材PDF版
问题:对组相联高速缓存中不命中时的行替换还不能够完全理解。
家庭作业
6.29
由练习题6.13图得
组7中命中的十六进制存储器地址为:
(1101111011100)=0x1BDC
(1101111011101)=0x1BDD
(1101111011110)=0x1BDE
(1101111011111)=0x1BDF
组5中命中的十六进制存储器地址为:
(0111000110100)=0x0E34
(0111000110101)=0x0E35
(0111000110110)=0x0E36
(0111000110111)=0x0E37
组4中命中的十六进制存储器地址为:
(1100011110000)=0x18F0
(1100011110001)=0x18F1
(1100011110010)=0x18F2
(1100011110011)=0x18F3
(0000010110000)=0x00B0
(0000010110001)=0x00B1
(0000010110010)=0x00B2
(0000010110011)=0x00B3
组2中没有命中的存储器地址。
6.30
A.
CT | CT | CT | CT | CT | CT | CT | CT | CI | CI | CO | CO |
B.
操作 | 地址 | 命中? | 读出的值(或未知) |
读 | 0x409 | 否 | - |
写 | 0x40A | 是 | - |
读 | 0x833 | 是 | 0xD0 |