《深入理解计算机系统》(6)存储器层次结构

文章目录

  • 1、存储技术
    • 1.1、 静态RAM
      • 1、SRAM
      • 2、DRAM
      • 3、传统的DRAM
      • 4、内存模块
      • 5、增强的DRAM
        • 6、非易失性存储器
      • 7、访问主存
    • 1.2、 磁盘存储
      • 1、磁盘构造
      • 2、磁盘容量
      • 3、磁盘操作
      • 4、逻辑磁盘块
      • 5、连接I/O设备
      • 6、访问磁盘
    • 1.3、 固态硬盘
    • 1.4、 存储技术趋势
  • 2、局部性
    • 2.1、对程序数据引用的局部性
    • 2.2、取指令的局部性
    • 2.3、局部性小结
  • 4、高速缓存存储器
    • 4.1、通用的高速缓存存储器组织结构
    • 4.2、 直接映射高速缓存
      • 1、直接映射高速缓存中的组选择
      • 2、直接映射高速缓存中的行匹配和字选择
      • 3、直接映射高速缓存中不命中时的行替换
      • 4、使用中间为做组索引的原因
    • 4.3、 组相联高速缓存
      • 1、组相联高速缓存中的组选择
      • 2、组相联高速缓存中的行匹配和字抽取
      • 3、组相联高速缓存中不命中时的行替换
    • 4.4、 全相联高速缓存
      • 1、全相联高速缓存中的组选择
      • 2、全相联高速缓存中的行匹配和字选择

1、存储技术

  • 随机访问存储器,分为两类:
    • RAM,同时也是易失性存储器,也分为两类:
      - SRAM:静态随机访问存储器,速度快,价格高。多用来作为高速缓存存储器
      - DRAM:动态随机访问存储器,速度慢,价格低。多用来作为主存图形系统的帧缓冲器
    • ROM,同时也是非易失性存储器闪存属于 ROM,固态硬盘就是基于闪存开发而来。
  • 机械硬盘
  • 固态硬盘

1.1、 静态RAM

1、SRAM

  • SRAM 将每个位存储在一个双稳态的存储器单元内。每个单元由六个晶体管组成(等价于RS触发器)。
    《深入理解计算机系统》(6)存储器层次结构_第1张图片
  • 双稳态即该电路无限期地稳定保持在两个不同的电压状态。
  • 对于 SRAM,只要有电,就永远地保持它的值。即使有干扰,当干扰消除,电路也会恢复到稳定值。

2、DRAM

  • DRAM 将每个位存储为对一个电容的充电。每个 DRAM 单元由一个电容和一个访问晶体管组成。
    《深入理解计算机系统》(6)存储器层次结构_第2张图片
  • DRAM 对干扰非常敏感。当电容的电压被扰乱后,就永远不会恢复了。暴露在光线下会使电容电压改变,数码照相机和摄像机中的传感器本质上就是DRAM单元的阵列。
  • DRAM会有漏电现象——在10~100ms时间内失去电荷,所以内存系统必须周期性读出,然后重新刷写内存的每一位
  • 下面是SRAM与 DRAM的比较在这里插入图片描述

3、传统的DRAM

DRAM芯片中的单元(位)被分成d个超单元( supercell),每个超单元都由w个DRAM单元组成。一个 d × w的DRAM总共存储了dw位信息。超单元被组织成一个r行c列的长方形阵列,这里rc=d。每个超单元有形如(i,j)的地址,这里i表示行,而j表示列。
例如,如下图所示是一个16×8的DRAM芯片的组织,有d=16个超单元,每个超单元有w=8位,r=4行,c=4列。带阴影的方框表示地址(2,1)处的超单元。信息通过称为引脚(pin)的外部连接器流入和流出芯片。每个引脚携带一个1位的信号。下图给出了两组引脚:8个data引脚,它们能传送一个字节到芯片或从芯片传出一个字节,以及2个addr引脚,它们携带2位的行和列超单元地址。其他携带控制信息的引脚没有显示出来。
《深入理解计算机系统》(6)存储器层次结构_第3张图片
每个DRAM芯片被连接到某个称为内存控制器( memory controller)的电路,这个电路可以一次传送w位到每个DRAM芯片或一次从每个DRAM芯片传出w位。为了读出超单元(i,j)的内容,内存控制器将行地址i发送到DRAM,然后是列地址j。DRAM把超单元(i,j)的内容发回给控制器作为响应。行地址i称为RAS( Row Access strobe,行访问选通脉冲)请求。列地址j称为CAS( Column Access strobe,列访问选通脉冲)请求。注意,RAS和CAS请求共享相同的DRAM地址引脚。
例如,要从图6-3中16×8的DRAM中读出超单元(2,1),内存控制器发送行地址2,如下图a所示。DRAM的响应是将行2的整个内容都复制到一个内部行缓冲区。接下来,内存控制器发送列地址1,如下图b所示。DRAM的响应是从行缓冲区复制出超单元(2,1)中的8位,并把它们发送到内存控制器。
《深入理解计算机系统》(6)存储器层次结构_第4张图片
电路设计者将DRAM组织成二维阵列而不是线性数组的一个原因是降低芯片上地址引脚的数量。例如,如果示例的128位DRAM被组织成一个16个超单元的线性数组,地址为0~15,那么芯片会需要4个地址引脚而不是2个。二维阵列组织的缺点是必须分两步发送地址,这增加了访问时间。

4、内存模块

  • 许多 DRAM 芯片封装在内存模块中,插到主板的扩展槽上。常用的是双列直插内存模块 (DIMM),以 64 位为块与内存控制器交换数据。

比如一个内存模块包含 8 个 DRAM 芯片,每个 DRAM 包含 8M 个超单元,每个超单元存储一个字节。使用 8 个 DRAM 芯片上相同地址处的超单元来表示一个 64 位字,DRAM 0 存储第一个字节,DRAM 1 存储第 2 个字节,依此类推。
《深入理解计算机系统》(6)存储器层次结构_第5张图片
要取出内存地址 A 处的一个字,内存控制器先将 A 转换为一个超单元地址 (i,j),然后内存模块将 i,j 广播到每个 DRAM。作为响应,每个 DRAM 输出它的 (i,j) 超单元的 8 位内容,合并成一个 64 位字,再返回给内存控制器。此外,主存由多个内存模块连接到内存控制器聚合成。

5、增强的DRAM

  • 快页模式 DRAM (Fast Page Mode DRAM,FPM DRAM):当连续访问位于同一行的超单元时,第二次以后,FPM DRAM 可以直接从行缓冲区获取数据。
  • 扩展数据输出 DRAM (Extended Data Out DRAM,EDO DRAM):FPM DRAM 的一个增强的形式,更快一些。
  • 同步 DRAM (Synchronous DRAM,SDRAM):常规的、FPM 和 EDO 都是异步的。从效果而言,SDRAM 可以比异步存储器更快地输出它的超单元的内容。
  • 双倍数据速率同步 DRAM(Double Data-Rate SDRAM,DDR SDRAM):对 SDRAM 的一种增强,使速度翻倍。不同的 DDR SDRAM 以提高有效带宽的很小的预留缓冲区的大小来划分:DDR(2位)、DDR2(4位)、DDR3(8位)。位越多速度越快,近乎翻倍。
  • 视频 RAM (VRAM):用在图形系统的帧缓冲区中,其思想与 FPM DRAM 类似。VRAM 允许对内存进行并行地读和写。因此系统可以在写下一次更新的新值时(写),用帧缓冲区的像素刷屏幕(读)。

6、非易失性存储器

  • DRAM 和 SRAM 会在断电后丢失信息,因此是易失性存储器。ROM 是非易失性存储器,在断电后仍保存着信息。
  • ROM 是只读存储器,但是实际上有些 ROM 既可以读也可以写。
  • 几种常见的非易失性存储器:
    • 可编程 ROM (PROM):只能被编程一次。
    • 可擦写可编程 ROM (EPROM):可以被擦除和重编程上千次。
    • 电子可擦除 PROM (EEPROM):类似于 EPROM,但是可以被重编程十万次。
    • 闪存:基于 EEPROM 的一种存储技术。闪存无处不在,固态硬盘就是一种基于闪存的磁盘驱动器。
    • 存储在 ROM 设备中的程序通常称为固件,当计算机系统通电后,会运行存储在 ROM 中的固件。(BIOS程序存储在固件中)

7、访问主存

  • 数据流通过总线在处理器与主存间来往,每次处理器和主存间的数据传送的一系列步骤称为总线事务
  • 总线是一组并行的导线,能携带地址、数据和控制信号。
  • 系统总线连接 CPU 和 IO 桥接器,内存总线连接 IO 桥接器和主存。IO 桥同时也连接着 I/O 总线。
    《深入理解计算机系统》(6)存储器层次结构_第6张图片
  • 读事务的三个步骤(movq A,%rax):
    • CPU 将地址 A 放到内存总线上。
    • 主存从总线读出 A,取出字 x,然后将 x 放到总线上。
    • CPU 从总线读出字 x,并将它复制到相应寄存器中。
      《深入理解计算机系统》(6)存储器层次结构_第7张图片
  • 写事务的三个步骤(movq %rax,A):
    • CPU 将地址 A 放到内存总线。主存读出这个地址,并等待数据字。
    • CPU 将数据字 y 放到总线上。
    • 主存从总线读数据字 y,并将它存储在地址 A。

《深入理解计算机系统》(6)存储器层次结构_第8张图片

1.2、 磁盘存储

1、磁盘构造

  • 磁盘由盘片组成,每个盘片有两个表面,表面上覆盖着磁性记录材料。一个磁盘包含一个或多个盘片。
  • 每个表面由多个同心圆(称为磁道)组成,每个磁道被划分为一组扇区,每个扇区包含相同的数据位(一般为512字节)。
  • 扇区之间由间隙分隔开,间隙中不存储数据位,而存储用来标识扇区的格式化位。
  • 名词柱面用来表示距离主轴相等的磁道的集合。比如一个磁盘有 3 个盘片,那么每个柱面就有 6 个磁道。
    《深入理解计算机系统》(6)存储器层次结构_第9张图片

2、磁盘容量

  • 决定磁盘容量的因素:
    • 记录密度:磁道一英寸的段中可以放入的位数。
    • 磁道密度:从盘片中心出发半径上一英寸的段内可以有的磁道数。
    • 面密度:记录密度与磁道密度的乘积。
  • 现代大容量磁盘使用一种称为多区记录技术,即柱面的集合被分割成不相交的集合,称为记录区。每个区包含一组连续的柱面。磁盘格式化会填写间隙、标识出有故障的柱面、在每个区中预留出一组柱面作为备用。所以格式化容量要比最大容量小。
  • 计量上需要注意的:DRAMSRAM 相关的单位中 K = 2^10,磁盘、网络、速率、吞吐量相关的单位中 K=10^3

3、磁盘操作

  • 磁盘用读写头来读写存储在磁性表面的位。每个表面都有一个读写头,任何时候所有的读写头都位于同一个柱面上。
  • 磁盘读写数据时以扇区为单位,即一次读写一个扇区大小的块。
    《深入理解计算机系统》(6)存储器层次结构_第10张图片
  • 对扇区的访问时间包括三部分:
    • 寻道时间:为了读取目标扇区的内容,传动臂首先要将读写头定位到包含目标扇区的磁道上。

    • 旋转时间:读写头定位到期望的磁道后,要等待目标扇区的第一个位旋转到读写头下。

    • 传送时间:平均传送时间是读写头读写完整个扇区的时间。

    • 旋转时间一般和寻道时间差不多,而传送时间相对可以忽略不计,因此从磁盘读取一个扇区的时间约为 10 ms。

4、逻辑磁盘块

  • 现代磁盘呈现为一个逻辑块的序列,每个逻辑块大小为一个扇区,即 512 字节。
  • 当操作系统读写磁盘时,发送一个逻辑块号到磁盘控制器(维护着逻辑块号和实际(物理)磁盘扇区之间的映射关系),控制器上的固件将逻辑块号翻译为一个(盘面、磁道、扇区)的三元组。

5、连接I/O设备

  • 系统总线与内存总线都是与 CPU 相关的,而 IO 总线与 CPU 无关
    • Intel 的外部设备互连总线(PCI)就是一种 IO 总线。
  • IO 总线速度相比于系统总线和内存总线慢,但是可以容纳种类繁多的第三方 IO 设备。
    • 通用串行总线(USB):USB 总线是一个广泛使用的标准,连接各种 IO 设备,包括键盘、鼠标等。
    • 显卡/显示适配器:负责代表 CPU 在显示器上画像素。
    • 主机总线适配器:连接磁盘。常总的磁盘接口是 SCSI 和 SATA。其中 SCSI 比 SATA 更快也更贵。
      《深入理解计算机系统》(6)存储器层次结构_第11张图片

6、访问磁盘

  • CPU 使用内存映射 IO 技术来向 IO 设备发射命令。在使用内存映射 IO 的系统中,地址空间中有一块地址是专为与 IO 设备通信保留的,每个这样的地址称为一个 IO 端口。当一个设备连接到总线时,它与一个或多个端口相关联。

  • 假设磁盘控制器映射到端口 0xa0,读一个磁盘扇区的步骤如下:

    • CPU 依次发送命令字、逻辑块号、目的内存地址到 0xa0,发起一个磁盘读。因为磁盘读的时间很长,所以此后 CPU 会转去执行其他工作。
    • 磁盘收到读命令后,将逻辑块号翻译成一个扇区地址,读取该扇区的内容,并将内容直接传送到主存,不需要经过 CPU (这称为直接内存访问(DMA))。
    • DMA 传送完成后,即磁盘扇区的内容安全地存储在主存中后,磁盘控制器给 CPU 发送一个中断信号来通知 CPU。

    《深入理解计算机系统》(6)存储器层次结构_第12张图片

1.3、 固态硬盘

  • 固态硬盘 (SSD) 是一种基于闪存的存储技术。
    《深入理解计算机系统》(6)存储器层次结构_第13张图片

    • 一个固态硬盘中封装了一个闪存翻译层和多个闪存芯片。闪存翻译层是一个硬件/固件设备,功能类似磁盘控制器,将对逻辑块的请求翻译成对底层物理设备的访问。
    • 一个闪存由 B 个块的序列组成,每个块由 P 页组成,页的大小为 512byte~4kb数据以页为单位进行读写
    • 对于 SSD 来说,读比写快。因为只有在一页所属的块整个被擦除后,才能写这一页。重复写十万次后,块就会磨损,因此固态硬盘寿命较低
  • 随机写 SSD 很慢的两个原因

    • 擦除块需要相对较长的时间。
    • 如果写操作试图修改一个已经有数据的页,那么这个块中所有带有用数据的页都必须复制到一个新的块,然后才能向该页写数据。
  • SSD 相比于旋转磁盘的优缺点

    • 优点:由半导体存储器构成,没有移动部件,所以更结实,随机访问也更快,能耗更低
    • 缺点:更容易磨损,不过现在的 SSD 已经可以用很多年了。
  • 一个商业硬盘的性能特性
    《深入理解计算机系统》(6)存储器层次结构_第14张图片

1.4、 存储技术趋势

  • 性能上:SRAM > DRAM > SSD > 旋转磁盘
  • 发展速度上:增加密度(降低成本) > 降低访问时间
  • 近年来磁盘、DRAM和CPU速度之间差距
    《深入理解计算机系统》(6)存储器层次结构_第15张图片
    • DRAM 和 磁盘的性能滞后于 CPU 的性能提升速度,两者之间的差距越来越大。
    • 有效CPU周期时间:一个单独的CPU的周期时间除以它的处理器核心数
    • CPU性能曲线在2003年附近的突然变化反映的是多核处理器的出现(2004年出现双核处理器,2007年出现四核处理器),在这个分割点之后,可以看到单个核的周期时间(单核性能)变化不大,而多核性能持续上升

2、局部性

  • 局部性是程序的一个基本属性。具有良好局部性的程序倾向于重复地访问相同的数据 (时间局部性),或倾向于访问邻近的数据 (空间局部性),因此运行更快。
  • 局部性有两种形式:时间局部性空间局部性
  • 现代计算机系统的各个层次,从硬件到操作系统到应用程序都利用了局部性。

2.1、对程序数据引用的局部性

  • 例子1
    《深入理解计算机系统》(6)存储器层次结构_第16张图片
    • 本例中向量v的元素是被顺序读取的,因此对于向量v,函数有很好的空间局部性,但是时间局部性很差,因为每个元素只被访问一次。
    • 本例中变量sum具有良好的时间局部性。
    • 对于循环体中的每个变量,这个函数也么有好的空间局部性,要么有好的时间局部性,所以我们可以断定sumvec函数有良好的局部性。
  • 例子2
    《深入理解计算机系统》(6)存储器层次结构_第17张图片
    • 步长为1的引用模式,所以函数sumarrayrows具有良好的空间局部性。
  • 例子3
    《深入理解计算机系统》(6)存储器层次结构_第18张图片
    • 步长为N的引用模式,所以函数sumarraycols的空间局部性很差。

2.2、取指令的局部性

  • 程序指令存放在内存中,CPU 需要读这些指令,因此取指令也有局部性。比如 for 循环中的指令具有好的时间局部性和空间局部性。
  • 代码区别于程序数据的一个重要属性是运行时它是不能被修改的。当程序正在执行时,CPU只从内存中读取它的指令。CPU很少会重写或修改这些指令。

2.3、局部性小结

  • 评价局部性的简单原则
    • 重复引用相同变量的程序有好的时间局部性。
    • 对于步长为 k 的引用模式的程序,k 越小,空间局部性越好。
    • 对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。

4、高速缓存存储器

  • 为什么要加入高速缓存存储器?
    早期计算机系统的存储器层次结构只有三层:CPU寄存器、DRAM主存和磁盘存储。随着时间的推移,CPU和主存之间的速度逐渐拉开差距,因此便引入了SRAM高速缓存存储器,它位于CPU寄存器文件和主存之间。
    《深入理解计算机系统》(6)存储器层次结构_第19张图片

  • L1 高速缓存的访问速度约为 4 个时钟周期,L210 个周期,L350 个周期。

  • CPU 执行一条读内存字 w 的指令,它首先向 L1 高速缓存请求这个字,如果 L1 没有就向 L2请求,如果 L2 没有就向L3请求,如果L3没有就向内存请求。

4.1、通用的高速缓存存储器组织结构

  • 高速缓存被组织成 S=2^s 个高速缓存组,每个组包含 E 个高速缓存行,每个行为一个数据块,包含一个有效位,t=m-(b+s) 个标记位,和 B=2^b 字节的数据块。高速缓存的容量 = S*E*B
    《深入理解计算机系统》(6)存储器层次结构_第20张图片

    假设一个计算机系统中的存储器地址有 m,形成 M =2^m 个不同的地址。m 个地址为划分为 t 个标记位,s 个组索引位,b 个块偏移位
    《深入理解计算机系统》(6)存储器层次结构_第21张图片

  • 高速缓存可以通过简单地检查地址位来找到所请求的字,当 CPU 要从地址 A(由m个地址位组成) 处读一个字时,分三步走:

    1. 组选择A中的 s 个组索引位告诉我们在哪个组中
    2. 行匹配A 中的 t 个标记位告诉我们在这个组中的哪一行:当且仅当这一行设置了有效位并且标记位与 A 中的标记位匹配时,才说明这一行包含这个字
    3. 字抽取A 中的 b 个块偏移位告诉我们在 B 个字节的数据块中的字偏移。
  • 高速缓存有以下几类:

    1. 直接映射高速缓存:每个组只有一行,即 E=1。
    2. 组相联高速缓存:每个组有多行,1
    3. 全相联高速缓存:只有一个组,E=C/B。

4.2、 直接映射高速缓存

  • 直接映射高速缓存:每个组只有一行,即 E=1。
    《深入理解计算机系统》(6)存储器层次结构_第22张图片

1、直接映射高速缓存中的组选择

  • wm 位地址中抽取出 s 个组索引位,并据此选择相应的高速缓存组。在这个例子中,组索引 0000 1 2 00001_2 000012 被解释为一个选择组1的整数索引。
    《深入理解计算机系统》(6)存储器层次结构_第23张图片

2、直接映射高速缓存中的行匹配和字选择

  • 当且仅当设置了有效位,而且高速缓存行中的标记与w的地址中的标记相匹配时,这一行中包含w的一个副本。最后一步确定所需要的字在块中是从哪里开始的。在这个示例中,块偏移位是 10 0 2 100_2 1002,它表明w的副本是从块中的字节4开始的(我们假设字长为4字节)。
    《深入理解计算机系统》(6)存储器层次结构_第24张图片
    • 直接映射高速缓存的运行示例和冲突不命中等情况,自行查看《深入理解计算机系统》P429-P432

3、直接映射高速缓存中不命中时的行替换

  • 如果缓存不命中,那么它需要从存储器层次结构中的下一层取出被请求的块,然后将新的块存储在组索引位指示的组中的一个高速缓存行中。一般而言,如果组中都是有效高速缓存行了,那么必须要驱逐出一个现存的行。对于直接映射高速缓存来说,每个组只包含有一行,替换策略非常简单:用新取出的行替换当前的行

4、使用中间为做组索引的原因

  • 如果高位用做索引,那么一些连续的内存块就会映射到相同的高速缓存块。相比较而言,以中间位作为索引,相邻的块总是映射到不同的高速缓存行。
    《深入理解计算机系统》(6)存储器层次结构_第25张图片

4.3、 组相联高速缓存

  • 组相联高速缓存:每个组有多行,1 《深入理解计算机系统》(6)存储器层次结构_第26张图片

1、组相联高速缓存中的组选择

  • 与直接映射高速缓存一样,组索引位标识组。
    《深入理解计算机系统》(6)存储器层次结构_第27张图片

2、组相联高速缓存中的行匹配和字抽取

  • 组相联高速缓存中的行匹配更复杂,组中的任意一行都可能包含映射到这个组的内存块,因此必须搜索组中的每一行,寻找一个有效且标记位相匹配的行。字抽取的直接映射高速缓存相同。
    《深入理解计算机系统》(6)存储器层次结构_第28张图片

3、组相联高速缓存中不命中时的行替换

  • 因为存储器层次结构中越靠下,不命中开销越大,好的替换策略越重要。下面有几种替换策略:
    • 随机替换策略:随机选择要替换的行
    • 最不常使用策略(Least-Frequently-Used,LFU):替换在过去某个时间窗口内引用次数最少的一行。
    • 最近最少使用策略(LeastRecently-Used,LRU):替换最后一次访问时间最久远的那一行。

4.4、 全相联高速缓存

  • 全相联高速缓存:只有一个组,E=C/B。
    《深入理解计算机系统》(6)存储器层次结构_第29张图片
  • 因为高速缓存电路必须并行地搜索许多相匹配的标记,构造一个又大又快的相联高速缓存很困难,而且很昂贵。因此,全相联高速缓存只适合做小的高速缓存,例如虚拟内存系统中的翻译备用缓冲器(TLB) ,它缓存页表项

1、全相联高速缓存中的组选择

  • 全相联高速缓存只有一个组,地址中没有组索引位,地址只被划分成了一个标记和一个块偏移。
    《深入理解计算机系统》(6)存储器层次结构_第30张图片

2、全相联高速缓存中的行匹配和字选择

  • 与组相联高速缓存一样。与组相联高速缓存的区别在于规模大小
    《深入理解计算机系统》(6)存储器层次结构_第31张图片

你可能感兴趣的:(《深入理解计算机系统》,嵌入式硬件,计算机)