读书笔记系列深入理解计算机系统之存储器层次结构

前言

存储器系统是一个具有不同容量,成本和访问时间的存储设备的层次结构。高层次相对于低层次的存取效率更高一些,但是每个比特位更贵一些。

随机访问存储器

随机访问存储器(RAM)分为两类:静态和动态。静态比动态更快,但也更贵。前者用来作为高速缓存存储器,经常位于cpu上或左右;后者用来作为主存和图形系统帧缓冲区。

静态RAM

SRAM将每个位存储在一个双稳态单元,这个单元由六个晶体管组成,始终在任何时候都只有两个稳定的配置和状态。

动态RAM

DRAM将每个位存储为对一个电容的充电,每个单元由一个电容和一个访问晶体管组成。其特点时对干扰敏感,当电容电压被扰乱后,永远不会恢复,内存系统通过周期性的读出,重写刷新内存每一位或使用纠错码来保证进行纠正。

传统DRAM DRAM芯片中单元(位)被分成d个超单元,每个超单元由W个DRAM单元组成。超单元被组织成一个r行c列的长方形阵列.如图:

此处输入图片的描述 这是一个16x8的DRAM芯片组织,16个超单元,每个单元8位。信息通过引脚流入流出,每个引脚携带一个位。下图由2个地址引脚,8个数据引脚,其他控制信息引脚未给出。每个DRAM芯片被连接内存控制器的电路,这个电路一次传送w位到每个DRAM芯片或从芯片读取w位。

首先,通过传送2位addr地址获取指定行所有超单元信息,复制到内部缓冲区,然后传送2位指定列从内部缓冲区获取指定超单元信息,通过data引脚传送出去,做成行列结构而不是一行可以节省2个引脚,但是需要两次传送addr信息。

内存模块 DRAM芯片封装在内存模块中,插到主板的扩展槽上,i7使用240引脚双列直插内存,以64位块作为块传送数据到内存控制器。如图: 此处输入图片的描述

该模块用了8个64Mbit的8Mx8DRAM芯片,总共64MB数据,每个超单元存储8位,总共8个芯片8个超单元64位数据,按照高低位排序传输。

增强DRAM

非易失去性存储器 如果断电,SRAM和DRAM会失去信息,非易失去性存储器即使在关电后,仍然保持信息。比如ROM只读存储器,ROM通过能够被重写次数和进行重写所用机制进行区分分为可擦写可编程ROM,闪存(固态硬盘)。ROM中存储的程序称为固件。

访问主存

数据通过总线在处理器和DRAM主存之间传输。传输过程可分为读事务,写事务。如图:

此处输入图片的描述 I/O桥接器负责系统总线电子信号和内存总线电子信号之间的转换

磁盘存储

磁盘相比RAM能够存储大量数据,但读数据毫秒级,比DRAM慢10万倍,比SRAM慢100万倍。

磁盘构造

磁盘时由盘片构成,每个盘片有两面或称为表面,表面覆盖磁性记录材料。盘中间有可以旋转的主轴,盘片依靠主轴每分钟5400~15000转。磁盘表面由一组称为磁道的同心圆组成,每个磁道划分为一组扇区,每个扇区包含相等数量的数据位(通常512字节),扇区之间由间隙分隔,间隙不存储数据位。描述多个盘片构造经常用柱面来描述,柱面是所有盘片表面上到主轴中心的距离相等的磁道的集合。如图: 此处输入图片的描述

磁盘容量

磁盘容量由以下因素决定:

磁盘容量计算公式 磁盘容量=字节数/扇区 * 平均扇区数/磁道 * 磁道数/表面 * 表面数/盘片 * 盘片数/磁盘

磁盘操作

磁盘用读/写头来读写存储在磁性表面的位,读写头连接一个传送臂一端,通过机械臂沿半径前后移动,读写头可以到达盘面任何位置,这种运动称为寻道,多个盘片每个盘面都有一个独立读写头,读写头垂直排列,一致行动,任何时候都位于同一柱面上。如图: 此处输入图片的描述

读写头和盘面之间高度约为0.1微米,每一粒细小微尘都会使其停下来,所谓读/写头冲撞,为此,磁盘总是密封包装的。

上面三个时间加起来就是就是一个扇区的访问时间

逻辑磁盘块

一个B个扇区的逻辑块的序列,编号为0~B-1,磁盘中有一个小的硬件/固件设备,称为磁盘控制器,维护逻辑块号和实际磁盘扇区之间映射关系。当操作系统执行I/O操作时,读取数据到内存,操作系统发送命令道磁盘操作器,让读取某个逻辑块号,控制器通过固件执行一个快速表查找对应的以盘面,磁道,扇区三元组的物理地址,读取数据进缓存,然后复制到主存中

###连接I/O设备 在cpu,内存,外接I/O设备之间都是通过各种类型的总线进行互联的,系统总线和内存总线与CPU有关,诸如PCI这种I/O总线跟底层CPU无关,可以容纳种类繁多的第三方I/O设备。但是比系统和内存总线慢。

常见I/O总线

  • 通用串行总线(USB),通常连接鼠标,键盘,移动硬盘等外设。USB3.0最大带宽525mb/s
  • 图形卡,负责代表CPU在显示器上画像素
  • 主机总线适配器(SATA,SCSI),将一个或多个磁盘连接到I/O总线,使用特别的主机总线接口定义的协议。

访问磁盘

CPU使用一种内存映射I/O来向I/O设备发射命令。在使用内存映射I/O的系统中,有一块为了和I/O设备通信的专门的地址,每个地址称为一个I/O端口。一个设备总是与一个或多个端口相连。

例子:

  • 磁盘控制器映射到端口0xa0,cpu通过三个对地址0xa0的存储指令,进行磁盘读。
    • 1发送一个读的命令字,同时附带其他参数(读完成是否cpu中断)
    • 2指明读数据的逻辑块号
    • 3指明存储磁盘扇区内容的内存地址
  • 指令发出后,cpu继续执行其他指令;磁盘控制器接收到命令后,翻译逻辑块号到物理地址,读取数据到内存中。设备可以执行读或写总线事务,不需要cpu干涉,这个过程称为直接内存访问。数据传送称为DMA传送。
  • DMA完成后,磁盘控制器向CPU发送中断信号,CPU收到信号后,暂停当前工作,跳转到一个操作系统例程,记录下I/O已完成,然后控制返回给暂停中断的地方

固态硬盘

SSD是一种基于闪存的技术。SSD封装到I/O总线上的USB或SATA插槽,一个SSD由一个或多个闪存芯片和闪存翻译层组成。 闪存芯片代替传统旋转磁盘机械驱动器;闪存翻译层是一个硬件/固件设备,对应磁盘控制器。

此处输入图片的描述

如上图:一个闪存由B个块组成,每个块由P(32~128)页,一页大小512字节~4KB,每个块16KB~512KB。数据以页为单位读写。每个页只有在所属块被擦除(全置为1)才能重新写。大约100000次重复写后块就会损坏,永久不能使用。

此处输入图片的描述 随机写很慢原因

  1. 擦除块需要相对长时间 ms级
  2. 写一个已经有数据(不全为1)的页,这个块中数据会复制到另一个块中。

局部性

上述倾向被称为局部性原理,上述两者有其一,我们就称为程序具有良好局部性。具有良好局部性的程序比局部性差的程序运行得快。在硬件层,计算机设计者通过引入称为高速缓存存储器来保存最近被引用的指令和数据项;在操作系统级,系统使用主存作为虚拟地址空间最近被引用块的高速缓存。

例子 我们程序中常使用的数组,当我们访问数据时,通过下标来进行数据访问,且数组中每个元素之间步长为1,称为引用模式。随着步长增长,空间局部性下降。在一个for循环程序中使用的取指令,指令被执行多次情况下,具有良好的时间局部性。而这些指令从内存中读出,cpu很少会重写或修改这些指令。

存储器层次结构

此处输入图片的描述

存储器层次结构中心思想:位于k层的更小更快设备作为位于k+1层更大更慢的存储设备的缓存。在任何时候第k层缓存包含第k+1层块的一个子集的副本

数据总是以块作为传送单元来进行传输,层次之间除开相邻层次之间每块大小是固定的以外,其他层次之间有不同的块大小。

缓存命中 当我们需要在k+1层某个数据对象d时,先在第k层查找d,如果d刚好在k层,那么称为缓存命中。

缓存不命中 反之,如果没有在k层中找到,我们称为缓存不命中。当发生缓存不命中时,从第k+1层中取出需要的数据对象,放入 k层当中,如果k层满了,则覆盖一个块,覆盖的策略通常是最少使用策略(LRU)

缓存不命中的种类