简单模型中,存储器系统是一个线性的字节数组,而CPU能够在一个常数时间内访问每个存储器位置。
 实际上,存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。CPU保存最常用的数据(0个周期),靠近CPU的高速缓存存储器(4-75个周期)为主存储器(上百个周期)中数据和指令的缓冲区域。主存缓存磁盘(几千万个周期)上的数据。磁盘缓存网络上的数据。
 局部性:局部性好的程序倾向于从存储器较高层次访问数据,性能更好。

存储技术

6.1.1随机访问存储器RAM
 RAM分为动态(DRAM)与静态(SRAM),静态更快但更贵。SRAM用于高速缓存存储器,DRAM用于主存等。
 ROM(只读存储器)断电不易失,而RAM断电丢失信息,ROM用途:BIOS
 数据流通过总线在处理器和DRAM主存之间来回。
6.1.2磁盘存储
6.1.3固态硬盘
6.1.4存储技术趋势

6.2局部性

 局部性:引用最近引用过的数据项本身(时间),引用邻近于最近引用过的数据的数据(空间)。
 CPU通过高速缓存存储器保存最近引用的指令和数据,操作系统用主存缓存磁盘中最近使用的数据。
6.2.1对程序数据引用的局部性
 因为数组存储为行优先,所以读取也要行优先。
6.2.2取指令的局部性
 代码区别于数据的重要属性是不能修改,程序正在执行时,CPU只从内存读出指令,很少会重写或修改指令。
6.2.3局部性小结
 局部性原则:
1.重复引用相同变量的程序有好的时间局部性
2.步长越小,空间局部性越好
3.取指令来说,循环体越小,迭代次数越多,局部性越好。

6.3存储器层次结构

第六章:存储器层次结构
6.3.1存储器层次结构中的缓存
 高速缓存是小而快速的存储设备作为大而慢的设备中的数据对象的缓冲区域。
 存储器层次结构的中心思想:上层作为下层的缓存
 数据以大小作为上下层传送单元,上下层之间块大小固定。一般底层块较大,因为底层访问时间长。
 缓存命中:程序需要k+1层对象时,先在k层查找d,如果d缓存在k层中,就是缓存命中。
 缓存不命中:缓存不命中时,k层缓存从k+1层缓存取出包含d的那个快,如果k层缓存满了,可能会覆盖现存块。
 缓存不命中的种类:
1.冷缓存:缓存为空,短暂事件,
2.冲突不命中:如块0和8映射到相同缓存块,交替请求块0和8,每次引用都不命中
3.容量不命中:工作集大小超过缓存大小
6.3.2存储器结构层次小结
 要利用好时间与空间局部性
第六章:存储器层次结构

6.4高速缓存存储器(复习习题6.12及以后,了解过程)

 随着内存和CPU之间的性能差距不断增大,有了L1、L2、L3
6.4.1通用的告诉缓存存储器组织结构
 存储器地址
第六章:存储器层次结构
 高速缓存组:有s组,每组E个行,每行一个块(固定),一块B字节。有效位指明行是否包含有意义的信息,标记位与内存地址标记位长度一样,唯一标识高速缓存行中的块。
第六章:存储器层次结构
第六章:存储器层次结构
 过程:当加载指令指示CPU从主存地址A中读字时,将地址A发到高速缓存,如果缓存包含A处字的副本,缓存命中。
 如何判断缓存命中:1.组选择 2.行匹配 3.字抽取
A中的s个组索引位是到S个组的索引,根据组索引找到组,根据t个标记位找到组中哪一行,当且仅当设置了有效位且该行与A的标记位相匹配时,组中这一行包含这个字,缓存命中,b个块偏移位给出请求的字在B个字节数据块中的字偏移。
第六章:存储器层次结构
6.4.2直接映射高速缓存
 E=1即每组一行的高速缓存称为直接映射高速缓存
 下图中(S,E,B,m)=(4,1,2,4),即4个组,每个组1行,每个高速缓存块2个字节,地址4位。
●标记位和索引为连起来标识了内存中的每个块,块0由地址0和1组成。
●索引位在中间而不是开头,这样可以让连续的块映射到不同的高速缓存组。
●8个内存块,4个组,所以多个块会映射到同一个高速缓存组。如块0和4映射到组0
●映射到同一个组的块由标记位唯一标识。块0为0,块4为1,所以一个组可以映射2^t个块
●交替读块0和块4会发生冲突不命中(抖动)。
第六章:存储器层次结构
 冲突不命中(抖动)
第六章:存储器层次结构
第六章:存储器层次结构
第六章:存储器层次结构
6.4.3组相联高速缓存
 直接映射高速缓存中冲突不命中源于每个组只有一行这个限制。每个组多行的话就算映射到相同组也不会抖动。
 这里的行匹配需要比较多个行,而不是之前的一行。
6.4.4全相联高速缓存
 只有一个组,一个组包含所有的行,内存地址位中没有组索引位。
6.4.5有关写的问题
 心里采用写回和写分配模型,即尽可能推迟更新,加载到缓存再写
 之前讨论的都是读,读比较简单,写分为(要写入的字w已经缓存):
1.直写:立即将w的高速缓存块写回低一层,简单但是引起总线流量
2.写回:尽可能推迟更新,只有该块要被替换时,才写回
 如何处理写不命中:
1.写分配:加载到缓存再写,试图利用空间局部性
2.非写分配:避开高速缓存,直接写到低一层
6.4.6一个真实的高速缓存层次的解剖
 i_cache:保存指令
 d_cache:保存数据
 指令与数据分开比较独立,不同访问模式不同规格,但可能引起容量不命中
6.4.7高速缓存参数的性能影响
1.高速缓存大小的影响
大的提高命中率,但是慢
2.块大小的利弊
块大提高命中率 ,但是慢
3.相联度
即一组几行,行多降低抖动可能性,但是需要更多标记位,增加命中时间。
4.写策略的影响
越往下越可能使用写回

6.5编写高速缓存友好的代码

●反复引用局部变量是好的
●步长为1的引用模式是好的

6.6综合:高速缓存对程序性能的影响

 存储器山即封面图
第六章:存储器层次结构

相关文章: