存储器层次结构
- 存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。
- CPU寄存器保存着最常用的数据。
- 主存储器(简称主存)暂时存放存储在容量较大的、慢速磁盘上的数据。
- 高速缓存存储器作为一部分存储在主存中的数据和指令的缓冲区域。
- 访问周期由小到大:CPU<高速缓存<主存<磁盘
存储技术
随机访问存储器(RAM)
- 其分为两类:
- 静态RAM(SRAM)
- 作为高速缓存存储器
- 可在CPU芯片上,也可以在芯片下
- 动态RAM(DRAM)
- 作为主存以及图形系统的帧缓冲区
- SRAM比DRAM更快而且贵。
- 静态RAM(SRAM)
静态RAM
- 其将每个位存储在一个双稳态的存储器单元里。每个单元是用一个六晶体管电路来实现的。
- 六晶体管电路的属性:它可以无限期地保持在两个不同的电压配置或状态之一。其他任何状态都不稳定的。可通过p383的倒转的钟摆进行理解。
- 原则上钟摆可以在垂直的为止无限期地保持平衡,但这种状态是亚稳态,最细微的扰动都可以破坏它的平衡,而且一旦破坏就无法恢复到垂直的位置。
动态RAM
- DRAM将每个位存储为对一个电容的充电。该电容大小非常小,通常大约为30x10-15法拉。
- DRAM对干扰非常敏感。当电容的电压被扰乱后,它就永远不会恢复了。
- 暴露在光线下会导致电容电压改变。
- 数码相机的传感器本质就是DRAM单元的阵列。
两者的对比
- 供电状态下,SRAM保持不变,而DRAM需要刷新。
- 存取速度方面,SRAM>DRAM
- 干扰敏感度方面,SRAM对诸如光和电噪声灯干扰不敏感
- 晶体管使用量方面,SRAM单元比DRAM单元使用更多的晶体管,从而密集度低,贵,功耗大。
传统的DRAM
- DRAM芯片中的单元(位)被分成d个超单元,每个超单元都由w个DRAM单元组成。一个dxw的DRAM总共存储dw位信息。
- 超单元被组织成一个r行c列的长方形阵列,rc=d。每个超单元有形如(i,j)的抵制,这里i表示行,j表示列。
- 选择行(RAS请求) 选择列(CAS请求) 通过行列的选择读取一个超单元内容。
- 二维阵列组织的缺点是必须分两步发送地址,这增加了访问时间。
存储器模块
- DRAM芯片包装在存储器模块中,它是插到主板的扩展槽上的。
- 168个引脚的双列直插存储器模块,它以64位为块传送数据到存储器控制器和从存储器控制器传出数据
- 72个引脚的单列直插存储器模块,它以32位为块传送数据。
增强的DRAM
- 快页模式DRAM(FPM DRAM):允许对同一行连续地访问可以直接从行缓冲区得到服务。例如读第i行四个超单元,只需发送第一个RAS/CAS请求,后面跟着三个CAS请求即可。
- 扩展数据输出DRAM(EDO DRAM):允许单独的CAS信号在时间上靠得更紧密一点。
- 同步DRAM(SD DRAM):用于驱动存储器控制器相同的外部时钟信号的上升沿来替代许多这样的控制信号。
- 常规的、FPM和EDO DRAM与存储控制器通信使用一组异步的控制信号。
- 双倍数据速率同步DRAM(DDR SDRAM):对SDRAM的一种增强,通过使用两个时钟沿作为控制信号,从而时DRAM的速度翻倍。
- 按照预取缓冲区的大小来划分:DDR(2位),DDR2(4位),DDR3(8位)
- Rambus DRAM(RDRAM):它的最大带宽比DDR SDRAM更高。
- 视频RAM(VRAM):用在图形系统的帧缓冲区中。
- 与FPM的区别:
- VRAM的输出是通过依次对内部缓冲区的整个内容进行移位得到的。
- VRAM允许对存储器并行地读和写。
- 与FPM的区别:
非易失性存储器
- 易失:如果断点,DRAM和SRAM会丢失它们的信息。
- 非易失性存储器:即使在关电后,仍然保存着它们的信息。
- ROM(只读存储器):Read-Only Memory,其中有些类型是既可以读也可以写的。
- 按照能够被重编程(写)的次数和对它们进行冲编辑所用的机制区分:
- PROM:只能被编程一次。
- 可擦写可编程ROM(EPROM):允许光到达存储器,数量级可以达到1000次。
- 电子可擦除PROM(EEPROM):可以直接在印制电路卡上棉城,数量级可以达到10^5次。
- 闪存(flash memory):基于EEPROM重要的存储计数,例如数码相机、手机灯都运用到它。
- 固态硬盘(SSD):基于闪存的磁盘驱动器,能够提供相对于传统旋转磁盘更快速、更强健和更低能耗的选择。
- 按照能够被重编程(写)的次数和对它们进行冲编辑所用的机制区分:
- 存储在ROM设备中的程序成为固件
访问主存
- 数据通过成为总线(bus)的共享电子电路在处理器和DRAM主存之间来来回回。
- 总线是一组并行地导线,能够携带地址、数据和控制信号。
- 每次CPU和主存之间的数据传送通过总线事务来完成的。
- 读事务:从主存传送数据到CPU
- 写事务:从CPU传送数据到主存
磁盘存储
磁盘构造
- 磁盘驱动器(磁盘)是由一个或多个叠放在一起的盘片组成,被封装在一个密封的包装里。
- 每个盘片都有两面或者成为表面,表面覆盖着磁性记录材料
- 每个表面都由一组磁道的同心圆组成。
- 每个磁道被划分为一组扇区,扇区之间用一些间隙分隔开。(间隙不存储数据位,而用来表示扇区的格式化位)
- 每个表面都由一组磁道的同心圆组成。
- 盘片*由一个可以旋转的主轴,使得盘片以固定的旋转速率旋转。
- 每个盘片都有两面或者成为表面,表面覆盖着磁性记录材料
- 磁盘制造商用柱面来描述多个盘片驱动器的构造。
- 旋转磁盘与固态磁盘是两种不同的工作方式
磁盘容量
- 一个磁盘上可以记录的最大位数成为它的最大容量,简称容量。
- 由一下技术因素决定
- 记录密度
- 磁道密度
- 面密度
- 计算公式: 磁盘容量=(字节数/扇区)(平均盘区数/磁道)(磁道数/表面)(表面数/盘片)(盘片数/磁盘)
- 对于与DRAM和SRAM容量相关的计量单位:K=2^10 M=2^20 G=2^30 T=2^40
- 对于磁盘和I/O设备容量相关的伎俩单位:k=10^3 M=10^6 G=10^9 T=10^12(字节)
磁盘操作
- 磁盘用读/写头来读写存储在磁性表面的位
- 读写头连接到一个传动臂的一端来寻道
- 对扇区的访问时间由三个主要部分:p392
- 寻道时间
- 旋转时间
- 传送时间
逻辑磁盘块
- 磁盘控制器:维护着逻辑块号和实际磁盘扇区之间的映射关系
- 当操作系统想要执行一个I/O操作时,操作系统会发送一个命令到磁盘控制器,让它读某个逻辑块号。控制器上的固件执行一个快速表查找,将一个逻辑块号翻译成一个(盘面,磁道,扇区)的三元组,该三元组唯一地表示了对应的物理扇区。
格式化容量比最大容量要小
连接到I/O设备
- 三个不同类型的设备连接到总线
- 通用串行总线(USB)
- 图形卡或适配器
- 主机总线适配器
- 插入主板上空的扩展槽进行使用,例如网络适配器
访问磁盘
- CPU使用存储器映射I/O技术来向I/O设备发出命令。
- I/O端口:地址空间中有一块地址是为了与I/O设备通信保留的。
- 读取一个磁盘扇区的步骤
- CPU同故宫将命令、逻辑块号和目的存储器地址写到与磁盘相关联的存储器映射地址,发起一个磁盘读
- 磁盘控制器读扇区,并执行到主存的DMA传送
- 当DMA传送完成时,磁盘控制器用中断的方式通知CPU
固态硬盘
- 一个SSD包由一个或多个闪存芯片和闪存翻译层组成。
- 闪存芯片对应传统旋转磁盘中的机械驱动器
- 闪存翻译器对应传统旋转磁盘中的磁盘控制器
- 一个闪存由B个块的序列组成
- 一个块由P页组成
- 页的大小是512~4KB
- 块由32~128页组成,大小为16~512KB
- 数据是以页为单位读写的。
- SSD的优点:
- 由半导体存储器构成,没有移动的部件
- 随机访问时间比旋转磁盘快,能耗更低,同时结实
- SSD的缺点:
- 反复写之后,闪存块会磨损。
- SSD每字节比旋转磁盘贵大约100倍,因此常用的存储容量是旋转磁盘的1%
局部性
- 计算机程序倾向于引用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。
- 该倾向成为局部性原理。
- 局部性的两种不同形式:
- 时间局部性
- 空间局部性
- 步长为k的引用模式:每隔k个元素进行访问
- 步长为1的引用模式是程序中空间局部性常见和重要的来源。随着步长的增加,空间局部性下降。
- 重复引用同一个变量的程序有良好的时间局部性。
- 对于取指令来说,循环有号的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
存储器层次结构p405
- 存储技术:不同的存储技术的访问时间差异很大
- 计算机软件:一个编写良好的程序倾向于展示处良好的局部性
- 存储器层次结构:硬件和软件的基础属性互相补充的完美,使人想到一种组织存储器系统的方法。
存储器层次结构中的缓存
- 高速缓存(cash)是一个小而快速的存储设备,使用高速缓存的过程成为缓存
- 最小的缓存——CPU寄存器集合
- 数据总是以块大小为传送单元在第k层和第k+1层之间来回拷贝。
- 缓存命中:当程序需要第k+1层的某个数据对象d时,它首先在当前存储在第k层的一个块中查找d,如果d刚好缓存在第k层中的情况。
- 缓存不命中:第k层中没有缓存数据对象d的情况
- 强制性不命中或冷不命中:k层的缓存是空的——冷缓存
- 冲突不命中:限制性的放置策略引起的不命中
- 容量不命中:工作集的大小超过缓存的大小时。
- 替换或驱逐:替换一个现存的块的过程。
- 牺牲快:被驱逐的这块。
- 替换策略:控制决定该替换哪个块的策略
利用时间的局部性:由于时间局部性,同一数据对象可能会被多次使用。
利用空间的局部性:块通常包含有多个数据的对象。
高速缓存存储器
- CPU寄存器文件和主存之间插入一个小的SRAM高速缓存存储器——L1高速缓存(一级缓存)
- 在L1高速缓存和主存之间插入一个更大的高速缓存——L2高速缓存
- 比L2更大的高速缓存——L3高速缓存
通用的高速缓存存储器结构
- 每个寄存器地址有m位,形成M=2^m个不同的抵制
- 高速缓存被组织成一个有S=2^s个高速缓存组的数组
- 每个组包含E个高速缓存行
- 每个行由一个B=2^b字节的数据块组成的
- 一个有效位指明这个行是否包含有意义的信息
- t=m-(b+s)个标记位是当前块的存储器地址的位的子集
- 高速缓存的大小C:指的是所有块的大小的和,标记位和有效位不包含在内,C=S×E×B
直接映射高速缓存
- E=1的高速缓存称为直接映射高速缓存。
- 高速缓存确定一个请求是否命中,然后抽取出被请求的字的过程:
- 组选择
- 行匹配
- 字抽取
- 如果缓存不命中,需要从存储器层次结构中的下一层取出被请求的块。然后将新的块存储在组索引位指示的组中的一个高速缓存行中。
组相联高速缓存
- 每个组都保存有多于一个的高速缓存行。
- 一个1<E<C/B的高速缓存通常称为E路组相联高速缓存。
- 它的组选择与直接映射高速缓存的组选择一样,组索引位标志组。
- 最不常使用(LFU)策略会替换在过去某个时间窗口内引用次数最少的那一行。
- 最近最少使用(LRU)策略会替换最后依次访问时间最久远那一行。
全相联高速缓存
- 由一个包含所有高速缓存行的组(E=C/B)组成的。
- 它只有一个组,地址中没有组索引位,地址只被划分成了一个标志和一个块偏移。
关于写的问题
- 如何更新w在层次结构中紧接着低一层中的拷贝:
- 直写:立即将w的高速缓存块写回到紧接着的低一层中。
- 写回:尽可能地推迟存储器更新,只有当替换算法要驱逐更新过的块时,才把它写到紧接着的低一层中。
- 如何处理写不命中:
- 写分配:加载相应的低一层的块到高速缓存中,然后更新这个高速缓存块。写回高速缓存为写分配。
- 非写分配:避开高速缓存,直接把这个字写到低一层中。直写高速缓存为非写分配。
- i-cache:只保存指令的高速缓存
- d-cache:只保存程序数据的高速缓存
- 统一的高速缓存:保存指令和程序数据的高速缓存。
高速缓存参数的性能影响:
- 不命中率:不命中数量/引用数量
- 命中率:1-不命中率
- 命中时间:从高速缓存传送一个字到CPU所需的时间
- 不命中处罚:由于不命中所需要的额外的时间
- 较大的高速缓存可能会提高命中率,但使大存储器运行得更快总是要难一些。
- 较大的的块能利用程序中可能存在的空间局部性,帮助提高命中率。但会损害时间的局部性比空间局部性更好的程序中的命中率,并且传送时间会变长。
- 较高的相联度(E的值越大)能够降低高速缓存由于冲突不命中出现抖动的可能性。但也会产生造成较高的成本。
- 高速缓存越往下层,越可能使用写回而不是直写。
高速缓存行、组和块的区别p423
编写高速缓存友好的代码
- 让最常见的情况运行得快。
- 在每个循环内部缓存不命中数量最小。
高速缓存对程序性能的影响
存储器山
- 读吞吐量(读带宽):一个程序从存储系统中读数据的速率
- 读带宽的时间和空间局部性的二维函数,称为存储器山
程序中利用局部性
- 将注意力集中在内循环上,大部分计算和存储器访问都发生在这里。
- 通过按照数据对象存储在存储器中的顺序、以步长为1的来读数据。从而使得程序中的空间局部性最大
- 一旦从存储器中读入一个数据对象,尽可能地使用它,从而使得程序中的时间局部性最大。
遇到的问题
对于存储器山的概念不是很明白,各条山脊线所表示的内容,步长的变化引起读吞吐量的变化也并未搞清楚。
希望通过再阅读相关内容来进行理解。
参考文献
- 《Computer.Systems.A.Programmer's.Perspective.2nd.CN》教材
- 《内存山介绍和图解析》http://www.2cto.com/os/201501/366825.html