第六章 存储器层次结构
本章概况:了解存储设备的类型和特点。重点理解局部性原理和缓存思想在存储层次结构中的应用。
6.0前言
1、存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。CPU寄存器保存着最常用的数据。靠近CPU的小的、快速地高速缓存存储器作为一部分存储在相对慢速的主存储器中的数据和指令的缓冲区域。主存暂时存放在容量较大的、慢速磁盘上的数据,而这些磁盘常常又作为存储在通过网络连接的其他机器的磁盘或磁带上的数据的缓冲区域。
2、数据是存储在CPU寄存器中的,那么在指令的执行期间,在零个周期内就能访问到它们。如果存储在高速缓存中,需要1-30个周期。如果存储在主存中,需要50-200个周期,如果存储在磁盘上,需要大约几千万个周期。
3、计算机系统中的一个基本而持久的思想:若能理解系统是如何将数据存储在存储器层次结构中上上下下移动的,那么你就可以编写你的应用程序,使得它们的数据项存储在层次结构中较高的地方,在哪里CPU能更快地访问它们。这个思想围绕着计算机程序一个称为局部性的基本属性。
4、本章会提及基本的存储技术:SRAM存储器、DRAM存储器、ROM存储器、旋转的和固态的硬盘。
5、高速缓存存储器是作为CPU和主存之间的缓存区域,因为它们对应用程序的性能的影响最大。
存储器山:是一种描绘某台机器上存储器层次结构的性能的有趣方法。,它给出的读访问时间是局部性的一个函数。
6.1存储技术
本节要求: 了解三种常见存储技术:RAM、ROM、磁盘; RAM有SRAM、DRAM,特点及应用; ROM有PROM、EPROM、E2PROM、FLASH; 磁盘是重点,涉及到后面的I/O和文件系统,要求做好相关练习; 磁盘结构:盘片、磁道、扇区、间隙、柱面; 磁盘驱动器; 磁盘容量; 访问时间:寻道、旋转、传送; 逻辑磁盘块:这个很重要,内存可以看成字组数组、磁盘可以看成块数组。
1、随机访问存储器
随机访问存储器分为两类:静态和动态。静态RAM(即SRAM)比动态RAM(即DRAM)更快,但也贵得多。SRAM用来作为高速缓存存储器,既可以在CPU芯片上,也可以在片下。DRAM用来作为主存以及图形系统的帧缓冲区。
1)静态RAM
a.SRAM将每个位存储在一个双稳态的存储器单元里。每个单元是用一个六晶体管电路来实现的。可以无限期地保持在两个不同的电压配置或状态之一。其他任何状态都是不稳定的——从不稳定状态开始,电路会迅速转移到两个稳定状态中的一个。
b.原理类似于“倒转的钟摆”。
c.SRAM存储器单元的双稳态特性,只要有电,他就会永远保持它的值。
2)动态RAM
DRAM将每个位存储为对一个电容的充电。DRAM存储器单元对干扰非常敏感。
3)传统的DRAM
DRAM芯片中的单元(位)被分成d个超单元,每个超单元都由w个DRAM单元组成。
每个d*w的DRAM共有dw位信息。超单元呗组织称一个r行c列的长方形阵列,这里rc=d。每个超单元有形如(i,j)的地址,这里i代表行,j代表列。
信息通过称为引脚的外部链接器流入和流出芯片,每个引脚携带一个1位的信号。
每个DRAM芯片被连接到某个称为存储控制器的电路,这个电路可以一次传送w位到每个DRAM芯片或一次从每个DRAM芯片传出w位。为了读出超单元(i,j)的内容发回给控制器作为响应。
电路设计者将DRAM组织称二维阵列而不是线性数组的一个原因是降低芯片上地址引脚的数量。
二维阵列组织的缺点是必须分两步发送地址,这增加了访问时间。
4)存储器模块
DRAM芯片包装在存储器模块中,它是插到主板的扩展槽上的。常见包装包括168个引脚的双列直插存储器模块,它以64位为块传送数据到存储控制器和从存储控制器传出数据,还包括72个引脚的单列直插存储器模块,它以32位为块传送数据。
通过将多个存储器模块连接到存储控制器,能够聚合主存。
5)增强的DRAM
>>快页模式DRAM >>扩展数据输出DRAM >>同步DRAM >>双倍数据速率同步DRAM >>RambusDRAM(RDRAM) >>视频RAM
6)非易失性存储器
a.RAM断电丢失数据,是易失的;ROM是非易失的,统称为只读存储器。共有以下几种类型:
PROM-可编程ROM,只能被编程一次 EPROM-可擦写可编程ROM,能够被擦除和编写的次数的数量级大概为1000次 EEPROM,电子可擦除PROM,能够被编程的次数的数量级在100000次
b.闪存FLASH
基于EEPROM,为大量的电子设备提供快速而持久的非易失性存储。 应用场合:数码相机、手机、音乐播放器、PDA、笔记本、台式机、服务器计算机系统。
c.存储在ROM设备中的程序通常被称为固件,当一个计算机系统通电以后,他会运行存储在ROM中的固件。
7)访问主存
a.总线是一组并行的导线,能携带地址、数据和控制信号。
b.总线的种类:
①系统总线——连接CPU和I/O桥
②存储器总线——连接I/O桥和主存
③I/O总线:I/O桥将系统总线的电子信号翻译成存储器总线的电子信号,也将系统总线和存储器总线连接到I/O总线。
2、磁盘存储
磁盘是广为应用的大量数据的存储设备。
1)磁盘构造
>>盘片 >>表面:每个盘片有两个表面 >>主轴:盘片中央,可旋转 >>旋转速率:通常5400~15000/min >>磁道:同心圆 >>扇区:每个磁道被划分为一组扇区 >>数据位:每个扇区包含相等数量的数据位,通常为512字节 >>间隙:存储用来标识扇区的格式化位 >>磁盘驱动器-磁盘-旋转磁盘 >>柱面:所有盘片表面上到主轴中心的距离相等的磁道的集合。
2)磁盘容量:一个磁盘上可以记录的最大位数。决定因素如下:
记录密度:位/英寸 磁道密度:道/英寸 面密度:位/平方英寸 其中,提高面密度即可提高容量。
磁盘容量计算公式:
3)磁盘操作
磁盘以扇区大小的块来读写数据。
访问时间由三部分组成,访问一个磁盘扇区内容的平均时间为平均寻道时间,平均旋转延迟和平均传送时间之和。
a.寻道时间
即移动传动臂所用的时间。 依赖于读/写头以前的位置和传动臂在盘面上移动的速度。 通常为3-9ms,最大可达20ms。
b.旋转时间
即驱动器等待目标扇区的第一个位旋转到读/写头下 依赖于盘面位置和旋转速度。 最大旋转延迟=1/RPM X 60secs/1min (s) 平均旋转时间是最大值的一半。
c.传送时间
依赖于旋转速度和每条磁道的扇区数目 平均传送时间= 1/RPM x 1/(平均扇区数/磁道) x 60s/1min
4)逻辑磁盘块
盘面,磁道,扇区,这个三元组唯一的标识了对应的物理扇区。
5)连接到I/O设备(I/O总线)
I/O总线连接了CPU,主存和I/O设备。
通用串行总线USB:2.0最大带宽60MB/S,3.0最大带宽600MB/S 图形卡(适配器) 主机总线适配器
6)访问磁盘
DMA:直接存储器访问。设备可以自己执行读或者写总线事务,而不需要CPU干涉的过程。
CPU使用一种称为存储器映射I/O的技术来向I/O设备发出命令。
3、固体磁盘
固态硬盘是一种基于闪存的存储技术。区别于旋转磁盘,固态磁盘没有移动的部分。
1)结构
一个SSD包由一个或多个闪存芯片和闪存翻译层组成:
闪存芯片——对应旋转磁盘中机械驱动器 闪存翻译层(硬件/固件设备)——对应磁盘控制器
2)特点
由半导体构成,没有移动的零件 随机访问时间比旋转磁盘要快 能耗更低 更结实 更容易磨损 更贵
4、存储技术优势
不同的存储技术有不同的价格和性能折中 不同存储技术的价格和性能属性以截然不同的速率变化着 增加密度从而降低成本比降低访问时间更容易 DRAM和磁盘的性能滞后于cpu的性能
6.2局部性
本节要求: 局部性原理:时间局部性,空间局部性(p429最后一段“存储器山”); 数据引用局部性; 取指令局部性。
局部性原理:一个编写良好的计算机程序,常常倾向于引用临近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。其中包含空间局部性和时间局部性。
>>不同领域的应用
①硬件层:通过引入高速缓存存储器来保存最近被引用的指令和数据项,从而提高对主存的访问速度。 ②操作系统级:系统使用主存作为虚拟地址空间最近被引用块的高速缓存,用主存来缓存磁盘文件系统中最近被使用的磁盘块 ③应用程序中:Web浏览器将最近被引用的文档放在本地磁盘上。
1、对程序数据引用的局部性
1)步长为k的引用模式:一个连续变量中,每隔k个元素进行访问,就被称为步长为k的引用模式。
步长为1的引用模式:就是顺序访问一个向量的每个元素,有时也被称为顺序引用模式,它是程序中 空间局部性常见和重要的来源。
>>一般来说,随着步长增加,空间局部性下降。
2)多维数组:见书中例子。
2、取指令的局部性
程序指令是存放在存储器中的,CPU必须取出(读出)这些指令。 但是代码区别于程序数据的一个重要属性是:在运行时它是不能被修改的。
3、局部性小结
量化评价一个程序中局部性的简单原则: ①重复引用同一个变量的程序有良好的时间局部性 ②对于具有步长为k的引用模式的程序,步长越小,空间局部性越好 ③对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
6.3存储器层次结构
本节要求: 系统观“1+1>2”(举一反三:对称不对称加密形成的混合加密系统,混合动力汽车); 中心思想:每层存储设备都下一层的“缓存”。
1、缓存
高速缓存:是一个小而快速的存储设备,它作为存储在更大、更慢的设备中的数据对象的缓冲区域。 缓存:使用高速缓存的过程称为缓存。 数据总是以块大小为传送单元在第k层与第k+1层之间来回拷贝。任一对相邻的层次之间块大小是固定的,但是其他的层次对之间可以有不同的块大小。 特点:层越低,块越大。
1)缓存命中
当程序需要第k+1层的某个数据对象d时,首先在当前存储在第k层的一个块中查找d,如果d刚好缓存在第k层中,就称为缓存命中。 该程序直接从第k层读取d,比从第k+1层中读取d更快。
2)缓存不命中
即第k层中没有缓存数据对象d。 这时第k层缓存会从第k+1层缓存中取出包含d的那个块。如果第k层缓存已满,就可能会覆盖现存的一个块
<<替换(覆盖、驱逐)策略:
随机替换策略-随机牺牲一个块 最近最少被使用替换策略LRU-牺牲最后被访问的时间距离现在最远的块。
3)缓存不命中的种类
a.强制性不命中/冷不命中
即第k层的缓存是空的(称为冷缓存),对任何数据对象的访问都不会命中。
b.冲突不命中
由于一个放置策略:将第k+1层的某个块限制放置在第k层块的一个小的子集中,这就会导致缓存没有满,但是那个对应的块满了,就会不命中。
c.容量不命中
当工作集的大小超过缓存的大小时,缓存会经历容量不命中,就是说缓存太小了,不能处理这个工作集。
4)缓存管理
某种形式的逻辑必须管理缓存,而管理缓存的逻辑可以是硬件、软件,或者两者的集合。
2、存储器层次结构概念小结
6.4高速缓存存储器
本节要求: 高速缓存结构(S,E,B,m),高速缓存组,高速缓存行、块;映射、命中、缓存管理。
①L1高速缓存:位于CPU寄存器文件和主存之间,访问速度2-4个时钟周期 ②L2高速缓存:位于L1高速缓存和主存之间,访问速度10个时钟周期 ③L3高速缓存:位于L2高速缓存和主存之间,访问速度30或40个时钟周期
1、通用的高速缓存存储器结构
高速缓存是一个高速缓存组的数组,它的结构可以用元组(S,E,B,m)来描述:
S:这个数组中有S=2^s个高速缓存组 E:每个组包含E个高速缓存行 B:每个行是由一个B=2^b字节的数据块组成的 m:每个存储器地址有m位,形成M=2^m个不同的地址
除此之外还有标记位和有效位:
有效位:每个行有一个有效位,指明这个行是否包含有意义的信息 标记位:t=m-(b+s)个,唯一的标识存储在这个高速缓存行中的块 组索引位:s 块偏移位:b
高速缓存的结构将m个地址划分成了t个标记位,s个组索引位和b个块偏移位。
1)高速缓存的大小/容量C:指所有块的大小的和,不包括标记位和有效位,所以:
C=S*E*B
2)工作过程
S,B将m个地址位分为了三个字段:
先通过s个组索引位找到这个字必须存储在哪个组中 然后t个标记位告诉我们这个组中的哪一行包含这个字(当且仅当设置了有效位并且该行的标记位与地址中的标记位相匹配时) b个块偏移位给出来在B个字节的数据块中的字偏移
2、直接映射高速缓存
根据E(每个组的高速缓存行数)划分高速缓存为不同的类,E=1的称为直接映射高速缓存。
高速缓存确定一个请求是否命中,然后取出被请求的字的过程,分为三步:
1.组选择 2.行匹配 3.字抽取
1)组选择
高速缓存从w的地址中间抽取出s个组索引位 组索引位:一个对应于一个组号的无符号整数。 类比:高速缓存-关于组的一位数组,组索引位就是到这个数组的索引。
2)行匹配
判断缓存命中的两个充分必要条件: 该行设置了有效位 高速缓存行中的标记和w的地址中的标记相匹配
3)字选择
块-关于字节的数组,字节偏移是到这个数组的一个索引。
4)缓存不命中时的行替换
5)后运行中的直接映射高速缓存
标记位和索引位连起来唯一的标识了存储器中的每个块 映射到同一个高速缓存组的块由标记位唯一地标识
>>CPU执行读的一系列动作
1.先利用索引位,确定是针对哪个组 2.然后看对应的组是否有效: 1)如果无效则缓存不命中,高速缓存从存储器或低一层中取出要找的块,存储在对应的组中,再把有效位置1,返回需要的值 2)如果有效,再根据标记找是否有匹配的标记: ①如果有,则缓存命中,返回需要的值 ②如果没有,则替换行,然后返回。
6)直接映射高速缓存中的冲突不命中
抖动:高速缓存反复的加载和驱逐相同的高速缓存块的组 原因:这些块被映射到了同一个高速缓存组。 解决方法:在每个数组的结尾放B字节的填充从而使得他们映射到不同的组。
3、组相联高速缓存
E路组相联高速缓存:1<E<C/B
1)组选择
2)行匹配和字选择:形式是(key, value),用key作为标记和有效位去匹配,匹配上了之后返回value。
重要思想:组中的任意一行都可以包含任何映射到这个组的存储器块,所以告诉缓存必须搜索组中的每一行。
判断匹配的标准依旧是两个充分必要条件:①有效②
标记匹配
3)行替换:有空行替换空行,没有空行,应用替换策略:
随机替换 最不常使用策略LFU:替换在过去某个时间窗口内引用次数最少的那一行。 最近最少使用策略LRU:替换最后一次访问时间最久远的那一行。
4、全相联高速缓存(E=C/B)
1)组选择:只有一个组,默认组0,没有索引位,地址只被划分成了一个标记和一个块偏移。
2)行匹配和字选择:同组相联。
<<只适合做小的高速缓存。
5、写
1)写命中时,更新低一层中的拷贝的方法:
a.直写,立即将w的高速缓存块协会到紧接着的低一层中.但是每次写都会引起总线流量。 b.写回,只有当替换算法要驱逐更新过的块时,才写到紧接着的低一层中。符合局部性原理,显著的减少总线流量。但是增加了复杂性,必须为每个高速缓存行维护一个额外的修改位。
2)写不命中的处理方法
a.写分配---通常写回对应:加载相应的低一层中的块到高速缓存中,然后更新这个高速缓存块。 b.非写分配---通常直写对应:避开高速缓存,直接把这个字写在低一层中。
6、真实的高速缓存层次结构
高速缓存既保存数据,也保存指令。 只保存指令的:i-cache 只保存程序数据的:d-cache 既保存指令又保存数据的:统一的高速缓存
7、高速缓存参数的性能影响
1)性能:
不命中率 = 不命中数量/引用数量 命中率 = 1 - 不命中率 命中时间 不命中处罚:因为不命中所需要的额外的时间
2)具体影响
高速缓存大小:命中率+,命中时间+ 块大小:空间局部性+,命中率+,高速缓存行数-,时间局部性-,不命中处罚+ 相联度:E值大,抖动-,价格+,命中时间+,不命中处罚+,控制逻辑+【折中为不命中处罚低的,相联度低,不命中处罚高的,使用高相联度】 写策略:越往下,越可能用写回而不是直写
6.5编写高速缓存友好的代码
1.基本方法
让最常见的情况运行的快 在每个循环内部缓存不命中数量最小
2.重要问题
对局部变量的反复引用是好的(时间局部性) 步长为1的引用模式是好的(空间局部性)
6.6存储器山
这是一个重要的理解概念。帮助我们理解计算机系统底层存储的结构。
======================================================================
遇到的问题
6.11/6.12/6.13不太能够理解解题思路,觉得有点费解。前面的题目比较好理解,对照一些图、公式、表格里的小结就能做好。这种数学型的计算题还是我比较擅长的。我一直认为学习的时候理解学到的东西永远要比记忆的来的知识要牢固。但是对于底层的一些比较抽象的概念我还是不太懂,也很少能够在平时学习用到,不知道学习它的意义何在,所以学起来一直会走神,效率特别低,完全是因为要求学才去学。希望之后会有一些对代码什么的感悟实践能去动手操作让我进入状态吧。
另外,总线的部分以前在学汇编的时候绪论那节课老师有稍微提到一些,ROM、RAM的区别在上上学期的数字逻辑电路最后一章也有稍微提及。但由于不是考核重点,学过也就忘了,这次的再次学习让我对计算机学科的内部综合有了一些理解,明白了有的东西不考核不代表就不重要,没学扎实的话,欠下的债总是要还的TAT。后面补学起来还是很费劲的。
参考文献
1、《深入理解操作系统》pdf
2、闫佳歆同学的博客总线部分的图以及后两节的知识概括(博客链接:http://www.cnblogs.com/20135202yjx/p/4907828.html)
3、《数字逻辑电路》(用于参照理解)