文章目录
存储器层次结构
存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。
CPU寄存器保存着最常用的数据。高速缓存存储器是主存储器和CPU之间的数据和指令的缓冲区。主存缓存存储在容量较大、慢速的磁盘上,这些磁盘常常又作为存储在通过网络连接的其他机器的磁盘或磁带上的数据的缓冲区。
存储器层次越高程序访问的速度就越快。
存储技术
随机访问存储器
- 随机访问存储器(Random-Access Memory, RAM)分为两类:静态(SRAM)动态(DRAM).
-
静态RAM
-
SRAM将每个位存储在一个双稳态存储器单元里,用晶体管电路实现——可以无期限地保持在两个不同的电压配置或状态之一。
-
其他任何状态都是不稳定的——从不稳定状态开始,电路会迅速的转移到两个稳定状态中的一个:
-
只要有电SRAM就会永远的保持它的值。
-
-
动态RAM
-
DRAM将每个位存储为对一个电容的充电——每个单元由一个电容和一个访问晶体管组成。
-
DRAM是不稳定的,内存系统必须周期性地通过读出,然后重写来刷新内存每一位。
-
只要有供电,SRAM就会保持不变。与DRAM不同,不需要刷新。SRAM的存取比DRAM快。SRAM对诸如光和电噪声这样的干扰不敏感,代价是SRAM单元比DRAM单元使用更多的晶体管,因而密集度低,而且更贵,功耗更大。
-
-
传统的DRAM
-
DRAM芯片中的单元(位)被分成d个超单元,每个超单元由w个DRAM单元组成。一个d X w的DRAM总共存储了dw位信息。
-
超单元组成一个r行c列的长方形阵列其中每个一格都是一个超单元。
-
信息通过称为**引脚(pin)**的外部连接器流入和流出芯片,如16X8的DRAM芯片组织:2个addr引脚——携带2位的行和列超单元地址。8个data引脚——传送一个字节到芯片或从芯片传出一个字节。
-
为了读出超单元(i,j)的内容,内存控制器将行地址i发送到DRAM,然后是列地址j。DRAM把超单元(i,j)的内容发回给控制器作为响应。
-
行地址i称为RAS(Row Access Strobe 行访问选通脉冲)请求。列地址j称为CAS(Column Access Strobe 列访问选通脉冲)请求。
-
-
内存模块
-
DRAM芯片封装在内存模块中,它插到主板的扩展槽上。
-
要取出内存地址A处的一个字,内存控制器将A转换成一个超单元地址(i,j),并将它发送到内存模块,然后内存模块再将i和j 广播到每个DRAM。作为响应,每个DRAM输出它的(i,j)超单元的8位内容。模块中的电路收集这些输出,并把它们合并成一个64位字,在返回给内存控制器。
- 增强的DRAM
-
快页模式DRAM(Fast Page Mode DRAM, FPM DRAM):
- 要从一个传统的DRAM的行i中读4个超单元,内存控制器必须发送4个RAS/CAS请求,因为传统的DRAM将超单元的一整行复制到它的内部缓冲区中,使用一个,然后丢弃剩余的。
- 快页模式将行i复制到缓冲区,第一次请求时发送第一个RAS/CAS请求后跟着三个CAS请求,三个CAS请求从缓冲区中读取。
-
扩展数据输出DRAM(Extended Data Out DRAM, EDO DRAM)。快页模式的增强形式,允许各个CAS信号在时间上靠的更紧密一点。
-
同步DRAM(Synchronous DRAM, SDRM),常规的、快页模式、扩展数据输出模式都是异步的。同步的DRAM比异步的快。
-
双倍数据速率同步DRAM(Double Data-Rate Synchronous DRAM, DDR SDRAM).同步DRAM的增强。
-
视频RAM(Video RAM, VRAM)。思想与快页模式类似。
主要区别:
- VRAM的输出是通过依次对内部缓冲区的整个内容进行移位得到的
- VRAM允许对内存并行地读和写
- 非易失性存储器
- DRAM和SRAM都是易失性存储器:断电后保存的信息消失。
- **ROM(只读存储器)**以可重编程次数和重编程机制区分。
- PROM(programmer ROM, 可编程ROM)。PROM的每个存储单元有一种熔丝,只能用高电流熔断一次。
- 可擦写可编程ROM(Erasable Programmable ROM, EPROM)通过紫外线照射编程。
- 电子可擦除PROM(Electrically Erasable PROM, EEPROM)可直接在印刷电路卡上编程。
- 闪存(flash memory)是非易失性存储器,基于EEPROM,一种新型的基于闪存的磁盘驱动器,称为固态硬盘。
- 存储在ROM设备中的程序通常被称为固件。
- 访问主存
- 数据流通过总线在处理器和DRAM主存之间来回,每次CPU和主存之间的数据传送都是通过一系列步骤来完成的,这些步骤称为总线事务。
- 读事务:从主存传送数据到CPU。写事务:从CPU传送数据到主存。
磁盘存储
-
磁盘构造
-
磁盘由盘片构成,每个盘片有两面或者称为表面,表面覆盖着磁性记录材料。
-
盘片中央有一个可以旋转的主轴,使得盘片以固定的旋转速率旋转。
-
磁盘包含一个或多个这样的盘片,并封装在一个密封的容器内。
-
每个表面是由一组称为磁道的同心圆组成。每个磁道被划分为一组扇区。每个扇区包含相等数量的数据位,这些数据编码在扇区上的磁性材料中。扇区间由一些间隙分隔开,这些间隙中不存储数据位。间隙存储用来表示扇区的格式化位。
-
磁盘由多个盘片堆叠而成被封装在一个密封的包装里,整个装置通常被称为磁盘驱动器,简称磁盘,称磁盘为旋转磁盘来区分固态硬盘。
-
柱面是所有盘片表面上到主轴中心的距离相等的磁道的集合。
-
-
磁盘容量
- 一个磁盘可以记录的最大位数称为它的最大容量,或者简称为容量。
- 磁盘容量由一下因素决定:
- 记录密度(位/英寸):磁道一英寸的段中可以放入的位数。
- 磁道密度(道/英寸):从盘片中心出发半径上一英寸的段内可以有的磁道数。
- 面密度(位/平方英寸):记录密度与磁道密度的乘积。
- 磁盘操作
-
磁盘用读/写头来读写存储在磁性表面的位,读写头连接到一个传动臂的一端,读写头定位磁道称为寻道。
-
有多个盘片的磁盘针对每个盘面都有一个独立的读/写头,读/写头垂直排列,一致行动,在任何时刻,所有的读写头都位于同一个柱面上。
-
读/写头的速度大约为80km/h, 盘面上的一粒微小的灰尘都会导致读/写头冲撞,因此磁盘总是密封包装的。
-
磁盘以扇区大小的块来读写数据,对扇区的访问时间有三个主要的部分:寻道时间、旋转时间和传送时间。
- 逻辑磁盘块
- 磁盘封装中有一个小的硬件/固件设备,称为磁盘控制器,维护者逻辑块号和实际(物理)磁盘扇区之间的映射关系。
- 操作系统将一个读信号发送给磁盘控制器,磁盘控制器执行一个快速表查找,将一个逻辑块号翻译成一个**(盘面、磁道、扇区)的三元组**,唯一的标识一个物理扇区。
- 控制器上的硬件会解释这个三元组,将读/写头移动到适当的柱面,等待扇区移动到读/写头下,将读/写头感知到的位放到控制器上的一个小缓冲区中,然后将它们复制到主存中。
- 磁盘控制器必须对磁盘进行格式化:
- 格式化包括用标识扇区的信息填写扇区之间的间隙,标识出表面有故障的柱面并且不使用它门,以及在每个区中预留一组柱面作为备用,如果区中一个或多个柱面在磁盘使用过程中坏掉了,就可以使用这些备用的柱面。
- 所以磁盘制造商所说的格式化容量比最大容量要小。
- 连接I/O设备
-
所有I/O设备都是通过I/O总线连接到I/O桥接器,I/O桥接器在通过系统总线连接CPU,通过内存总线连接主存。
- 通用串行总线(Universal Serial Bus, USB)控制器连接外围I/O设备到I/O总线上。
- **图形卡(或适配器)**包含硬件和软件逻辑,负责代表CPU在显示器上画像素。
- 主机总线适配器将一个或多个磁盘连接到I/O总线。
- 访问磁盘
-
CPU使用一种称为**内存映射I/O(memory-mapped I/O)**的技术来向I/O设备发射命令。
在使用内存映射I/O的系统中,地址空间中有一块地址是为与I/O设备通信保留的,称为I/O端口(I/O port)。
当一个设备连接到总线时,它与一个或多个端口相关联(或它被映射到一个或多个端口)。
-
CPU通过内存映射I/O发起磁盘读:
- 第一条指令告诉磁盘读,并且携带参数,例如当读完成后,是否中断CPU。
- 第二条指令指明应该读的逻辑块号。
- 第三条指令指明应该存储磁盘扇区内容的主存地址。
-
当磁盘进行读的时候CPU处于阻塞状态,是非常浪费资源的,此时就有新的处理方法直接内存访问(DMA)——在磁盘控制器收到来自CPU的读命令之后,将逻辑块号翻译成一个扇区地址,读该扇区的内容,然后将这些内容直接传送到主存,不需要CPU的干涉。
这种数据传送称为DMA传送。
-
当DMA传送完毕后,磁盘控制器用中断的方式通知CPU。
固态硬盘
-
一个SSD封装由一个或多个闪存芯片和闪存翻译层组成
-
读SSD比写要快,数据是以页为单位读写的。只有在一页所属的块整个被擦除之后,才能写这一页(通常指该块中的所有位都被设置为1)。
-
SSD随机访问时间比旋转磁盘要快,能耗更低,同时也更结实。但是因为反复写之后,闪存块会磨损,存在读写寿命。
局部性
局部性有两种不同的形式:
- 时间局部性:被引用过一次的内存位置很可能在不远的将来再被多次引用。
- 空间局部性:如果一个内存位置被引用了一次,那么程序很可能在不远的将来引用附近的一个内存位置。
对程序数据引用的局部性
对一个向量的元素求和程序的局部性:
-
sum变量在每次循环中都被引用一次,所以对于sum来说具有良好的时间局部性。
但是sum是一个标量,所以没有空间局部性。
-
向量v的元素是按存储顺序读取的,所以对于变量V函数具有良好的空间局部性。
-
步长为1的引用模式是程序中空间局部性常见和重要的来源。一般而言,随着步长的增加,空间局部性下降。
对于二维数组,先循环行再循环列时步长为1,具有良好的空间局部性:
先循环列,在循环行会导致空间局部性很差:
局部性小结
- 重复引用相同变量的程序有良好的时间局部性
- 对于具有步长为k的引用模式的程序,步长越小,空间局部性越好。具有步长为1的引用模式的程序有很好的空间局部性。在内存中以大步长跳来跳去的程序空间局部性会很差。
- 对于取指令来说,循环有很好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
存储器层次结构
存储器层次结构中的缓存
-
高速缓存(cache)是一个小而快速的存储设备,作为存储在更大、也更慢的设备中的数据对象的缓冲区域。
-
缓存(caching):使用高速缓存的过程。
-
对于存储器层次结构,第k层是第k+1层的缓存,每一个缓存层都被划分为连续的数据对象组块,称为块。
如第k层缓存了第k+1层的4,9,14,3的副本。
- 缓存命中
- 如要到k+1层取4,而4的副本刚好在第k层中有,那么就直接从第K层中读取。
- 缓存不命中
- 如要到第k+1层中取1,而第k层中没有1的副本,此时就是缓存不命中。
- 当缓存不命中时,会将1的副本写入第k层,如果第k层已满的话就会覆盖(替换)已有的一个块。
- 缓存不命中的种类
- 如果第k层的缓存是空的,那么对任何数据对象的访问都会不命中。一个空的缓存被称为冷缓存,此类不命中称为强制性不命中或冷不命中。
- 只要发生了不命中,第k层的缓存就必须执行某个放置策略,确定把它从第k+1层中取出的块放在哪里。
- 随机放置策略在较低层的缓存中适用。
- 对于高层的缓存(靠近CPU)使用硬件缓存,速度最优。
- 这个策略将第k+1层的某个块限制放置在第k层块的一个小的子集中。
- 程序中的循环访问缓存块中的某个相对稳定不变的集合。这个块的集合称为这个阶段的工作集。当工作集的大小超过缓存的大小时,缓存会经历容量不命中。
- 缓存管理
- 通过软件和硬件结合的一种逻辑将缓存划分成块,在不同的层之间传送块,判断是命中还是不命中,并处理它们。
- 缓存命中
高速缓存存储器
通用高速缓存存储器组织结构
-
对于一个计算机系统,其中每个存储器地址有m位,形成M=2m个不同的地址。
-
高速缓存(S,E,B,m)的通用组织。
- 高速缓存是一个高速缓存组的数组。每个组包含一个或多个行,每个行包含一个有效位,一些标记位,以及一个数据块。
- 高速缓存的结构将m个地址划分成t个标记位、s个索引位和b个块偏移量位。
- 高速缓存的大小C=SXEXB。
直接映射高速缓存
-
每个组只有一行的高速缓存称为直接映射高速缓存。
-
高速缓存确定一个请求是否命中,然后抽取出被请求的字的过程,分为三步:
-
直接映射高速缓存中的组选择
如组索引位00001被解释为一个选择组1的整数索引:
-
直接映射高速缓存中的行匹配
当确定了组索引后,需要下边三步确定是否缓存命中:
- 有效位是否为1
- 高速缓存行中的标记位必须与地址中的标记位相匹配
- 如果前两部满足,那么高速缓存命中,块偏移就选择起始字节。
-
直接映射高速缓存中的字抽取
当命中后,快偏移确定字的索引位置。
-
直接映射高速缓存中不命中时的行替换
- 如果缓存不命中,从下一层取出被请求的块,然后将新的块存储在索引位指示的组中的一个高速缓存行中。
-
组相连高速缓存
- 就是每组有多行。
-
组相连高速缓存中的组选择
组索引位标识组
-
组相连高速缓存中的行匹配和字选择
- 组中的任何一行都可以包含任何映射到这个组的内存块,所以高速缓存必须搜索组中的每一行,寻找一个有效的行,其标记与地址中的标记相匹配。
- 组中的任何一行都可以包含任何映射到这个组的内存块,所以高速缓存必须搜索组中的每一行,寻找一个有效的行,其标记与地址中的标记相匹配。
全相联高速缓存
- 就是一个组包含所有的行
-
全相联高速缓存中的组选择
只有一个组,直接选择,地址中没有组索引位,地址只被划分成了一个标记和一个块偏移。
-
全相联高速缓存中的行匹配和字选择
与组相联高速缓存一样,只是规模不同。
真实的高速缓存层次结构的解剖
- 只保存指令的高速缓存称为i-cache.
- 只保存程序数据的高速缓存称为d-cache。
- 两者都保存的称为统一高速缓存(unified cache)
对于一个4核CPU芯片如下:
高速缓存参数的性能影响
- 不命中率:不命中数量/引用数量
- 命中率:1-不命中率
- 命中时间:从高速缓存传送一个字到CPU的所需时间。
- 不命中处罚:由于不命中所需要的额外的时间。
- 高速缓存大小的影响
- 较大的高速缓存可能会提高命中率,但是越大的高速缓存可能会增加命中时间,所以L1高速缓存比L2小,L2比L3小。
- 块大小的影响
- 较大的块能利用程序中的空间局部性,帮助提高命中率
- 但是对于给定的高速缓存大小,块越大行越少,会损坏时间局部性比空间局部性更好的程序中的命中率。
- 块越大,传送时间越长。
- 相联度的影响
- 较高的相联度的优点是降低了高速缓存由于冲突不命中出现抖动的可能性。
- 但是成本较高,速度不会变快,处罚大。
命中时间:从高速缓存传送一个字到CPU的所需时间。
- 不命中处罚:由于不命中所需要的额外的时间。
- 高速缓存大小的影响
- 较大的高速缓存可能会提高命中率,但是越大的高速缓存可能会增加命中时间,所以L1高速缓存比L2小,L2比L3小。
- 块大小的影响
- 较大的块能利用程序中的空间局部性,帮助提高命中率
- 但是对于给定的高速缓存大小,块越大行越少,会损坏时间局部性比空间局部性更好的程序中的命中率。
- 块越大,传送时间越长。
- 相联度的影响
- 较高的相联度的优点是降低了高速缓存由于冲突不命中出现抖动的可能性。
- 但是成本较高,速度不会变快,处罚大。