csapp(第六章 存储器层次结构

6.1        存储技术

6.1.1        随机访问储存器

  • 静态RAM较动态RAM速度更快,更加昂贵,但是大小较小(不超过几mb),而动态RAM通常有几百或几千mb
1.静态RAM

将每个位存储在一个双稳态存储器单元 ,六晶体管电路

  • 有电,无限期保持状态或电压配置
  • 不稳定状态会迅速转为稳态(左右)
  • 亚稳态:也能在垂直位置无限期保持平衡,但是轻微扰动下也会倒下
  • 缺点:抗干扰能力较强,待干扰结束,电路恢复稳定
2.动态RAM

 每个位存储为对一个电容的充电

  • 抗干扰能力较弱,扰乱之后无法恢复
  • 很多原因导致漏电,10~100ms时间内失去电荷,但较时钟周期也比较长
  • 内存系统必须周期性地通过读出,然后重写来刷新内存每一位
3.传统DRAM

  • 元素解释为超单元(字 单元)
  • RAS(行访问脉冲 i)和CAS请求( j )共享相同的DRAM地址引脚
  • 读操作: 内存控制器将RAS和CAS请求传输二维地址后,RAM将对应超单元的内容发回控制器作为响应
  • 二维阵列而非线形数组:降低引脚数量(16二维超单元转为线性需要由2个引脚转为4个引脚)
  • 缺点:必须分为两步发送地址,增加访问时间
4.内存模块

  • 每个超单元存储主存的一个字节,而用8个超单元表示主存中字节地址A处的64位字 
  • 读操作:内存控制器将字节地址A转换成一个超单元地址,发送内存模块,内存模块广播所有的DRAM, DRAM输出对应单元内容,模块电路收集输出合并为一个64位字,返回内存控制器
  • 多个内存模块:控制器收到一个地址A,控制器选择包含A的模块k,将A转换为(i, j)发送到k
5.增强的DRAM
快页模式(FPM DRAM):

不同传统DRAM,访问行中4个单元,需要发送4个RAS/CAS请求

  • FPM DRAM中,访问行中4个单元,发送一个RAS/CAS请求,发送三个CAS请求
  • 初始的RAS/CAS请求将行i复制到行缓冲区,并返回对应超单元,然后三个超单元直接从行缓冲区获取
扩展数据输出(EDO DRAM):
  • FPM DRAM增强形式,允许各个CAS请求在时间上靠得更加紧密
同步(SDRAM):
  • 比FPM DRAM,EDO DRAM这些异步存储器更快输出它的超单元内容
双倍数据速率同步(DDR SDRAM):
  • SDRAM增强,使用两个时钟沿作为控制信号
视频(VRAM):
  • VRAM输出是通过依次对内部缓冲区的整个内容进行移位得到的
  • 对内存并行的读写(在写下一次更新的值的同时,用帧缓冲区中的像素中的像素刷屏幕(读))
6.非易失性存储器(ROM)
  • 以它们能够被重编程(写)的次数和对它们进行重编程所用的机制区分
  • 通电后,运行固件(存储在ROM设备中的程序)
  • 固件也可能会有输入输出(eg.BIOS),可能依赖固件翻译来自CPU(I/O)请求
可编程(PROM):
  • 只能被编程一次,每个存储器单元都有一种熔丝,只能被高电流熔断一次
可擦写可编程(EPROM):
  • 光照射过石英窗口,对应存储单元清除为0
  • 特殊机器写入1
  • 擦除和重编程次数可以达到1000次
电子可擦除PROM(EEPROM):
  • 可以直接在印刷电路卡上编程,可编程次数可达10^{5}
闪存:
  • 提供快速而持久的非易失性存储
7.访问主存:
  • 总线事务:CPU和主存之间的数据传送的步骤
总线设计:
  • 数据和地址信号可以共享同一组导线,也可以不同的导线
  • 两个以上设备也能共享到同一总线
  • 控制线携带的信号会同步事务,并标识当前正在被执行事务的类型(事务是否到主存?,事务是读或写?,总线信息是地址或数据项?)

CPU读写事务的数据传递:
读事务:
写事务:

6.1.2        磁盘存储

1.磁盘(磁盘驱动器)构造:
  • 磁盘有多个盘片构成,盘片有两个面称为表面(覆盖磁性记录材料)
  • 表面由一组同心圆(磁道)构成,每个磁道被划分为一组扇区(包含相等数量的数据位)
  • 扇区间由间隙(存储用来表示扇区的格式化位)分隔
  • 柱面:所有表面相同编号的磁道的集合(3个盘片,6个表面,柱面就是6个磁道k的集合)
  • 盘片中央有可旋转主轴(使盘片固定速率旋转)

 2.磁盘容量:
  • 记录密度:磁道一英寸的段中可以放入的位数(Btyes)
  • 磁道密度:从盘片中心出发半径一英寸段内有的磁道数
  • 面密度:记录密度和磁道密度的乘积

大容量技术:
  • 每个磁道扇区数量相等(扇区数量由最里的磁道所包含的扇区数决定)
  • 面密度的提高,扇区间的间隙变大(分隔越开)
多区记录:
  • 记录区:柱面集合被分割为不相交子集合
  • 每个区包含一组连续柱面
3.磁盘操作
读写结构:
  • 读/写头用于读写存储在磁性表面的位(btye),连接在传动臂一端
  • 读/写头垂直排列,一致行动,在任何时候,所有读/写头都位于同一柱面
干扰:
  • 微小的灰尘也会极大影响读写头(读/写头冲撞),故磁盘总是密封包装

读写时间:
  • 寻道时间:将读写头定位到包含目标扇区的磁道上的时间(通常3~9ms)

  • 旋转时间:定位到磁道后,等待目标扇区的第一个位旋转至读写头下的时间(平均旋转时间即除以2)

   

  • 传送时间:第一个位位于读写头下后,读/写扇区内容的时间

 
 读写时间分析:
  • 访问一个磁盘扇区中512字节的时间主要是寻道时间和旋转延迟
  • 寻道时间和旋转延迟大致相等,所以寻道时间乘2估计磁盘访问时间(简单合理)

 

4.逻辑磁盘块 
  • 不同盘面有不同的记录区,一个B个扇区大小的逻辑块序列,编号1 ~ B-1
  • 磁盘通过小的硬件(磁盘控制器),维护逻辑块号和实际物理磁盘之间的映射关系 
  • 操作系统执行 I/O操作:

格式化磁盘容量(格式化后,才能在磁盘存储数据)
  • 用标识扇区的信息填写扇区之间的间隙
  • 标识表面有故障的柱面并且不使用他们
  • 在每个区中预留出一组柱面作为备用

注意:

  • 若一个或多个柱面出现问题,可以使用备用的柱面(所以格式化容量比最大容量大)
5.连接I/O设备 

  • I/O设备都是通过I/O总线连接到CPU和主存
  • 虽然I/O总线比系统总线和内存总线慢,可以容纳种类繁多的第三方I/O设备
设备类型:
通用串行总线控制器(USB)
  • 连接USB总线的设备的中转机构
  • USB总线是用于连接各种外围I/O设备的广泛使用的标准
图形卡(或适配器)
  • 负责CPU在显示器上画像素
主机总线适配器
  • 将一个或多个磁盘连接到I/O总线
  • 使用特别主机总线接口定义的通信协议

磁盘接口类型:

  • SCSI:更快,更贵,可以支持多个磁盘驱动器
  • SATA:更慢,更便宜,只能支持一个磁盘驱动器
网络适配器
  • 将适配器插入主板上空的扩展槽,从而连接到I/O总线
6.访问磁盘:
  • CPU使用内存映射I/O向I/O设备发送命令:地址空间中有一块地址为与I/O设备通信保留的(每个地址叫做I/O端口)
  • 设备自己执行读或写总线事务而不需要CPU干涉,叫做:直接内存访问 (DMA传送)
对某地址存储命令步骤:
  • CPU发送三条指令(命令字(eg.表明读操作),应该读的逻辑块号,存储磁盘扇区内容的主存地址),告诉磁盘发起一个读(之后CPU执行其他工作)
  • 磁盘翻译逻辑块号为扇区地址,读取,然后传送给主存(DMA传送)
  • DMA传送结束后,通过发送中断通知CPU,CPU跳转某例程记录I/O完成,返回被中断处

6.1.3        固态硬盘

  •  基于闪存,封装插到I/O总线上标准硬盘插槽(eg.USB,SATA)
  • 闪存翻译层,类似磁盘控制器

SSD读写操作:
闪存结构(Flash memory)
  • 一个闪存由B个块序列组成,每个块由P个页组成
  • 每个页大小512B ~ 4KB,块由32 ~ 128页,大小为16KB ~ 512KB
性能分析:

(1)读SSD比写更快,由底层闪存基本属性决定:

  • 数据以页为单位读写,整个页只有擦除后(一般设置为全一)才能重新写
  • 可以对整个块进行擦除,就不需要一个个页擦除
  • 大约100 000次重复写后,块磨损坏

(2)随机写很慢:

  • 擦除块需要较长时间(1ms级),而访问页时间低一个数量级
  • 写操作试图修改一个包含已经有数据的页p,需要先复制到另外一个新块上,才能对页p进行写操作

(3)优点:

  • 半导体存储器构成,随机访问时间比旋转磁盘快,能耗更低,更结实
  • 平均磨损逻辑处理得非常好,SSD虽然磨损,但是最大化每个块的寿命,可以使用很久

(4)缺点:

  • SSD每个字节比旋转磁盘贵大约30倍,存储容量要小100倍

6.1.4        存储技术趋势

  • 不同存储技术有不同价格和性能折中
  • 不同存储技术的价格和性能属性以截然不同的速率变化着
  • 增加密度(降低成本)比降低访问时间更加容易
  • DRAM和磁盘性能滞后CPU的性能
  • 周期时间基本无法大幅增加,但是可以增加处理器数量(多核处理器)

 

6.2 局部性

局部性原理:       
  • 倾向于引用邻近于其他最近引用过的数据项的数据项
  • 最近引用的数据项本身
形式:
时间局部性
  • 被引用过一次的内存位置很可能在不远处的将来再被多次引用
空间局部性
  • 一个内存位置被引用了一次,那么程序可能在不远的将来引用附近的一个内存位置
应用场景
操作系统级
  • 允许系统使用主存作为虚拟地址空间最近被引用块的高速缓存
  • 用主存缓存磁盘文件系统中最近被使用的磁盘块

应用程序设计:

  • Web浏览器将最近的被引用的文档放在本地磁盘(时间局部性)

6.2.1        对程序数据引用的局部性

  • K步长的引用模式:K越大,空间局部性下降
行顺序扫描:
  • 步长为1的引用模式,良好的空间局部性

列顺序扫描:
  • 步长为N的引用模式,空间局部性很差

6.2.2        取指令的局部性

  • 这个代码中的for循环,指令按照连续的内存顺序执行(循环取指令具有良好的空间局部性)

  • 循环体会被执行多次(良好的时间局部性)

代码与程序数据区别:
  • 运行时代码不能被修改,执行程序时,CPU只是从内存中读出它的指令
  • (CPU很少会重写修改指令)

 6.2.3        局部性小结

量化局部性标准:
  • 重复相同变量的程序有良好的时间局部性
  • 对于具有步长为K的引用模式的程序,步长越小,空间局部性越好
  • 取指令,循环有好的时间和空间局部性。循环体越小,迭代次数越多,局部性越好

6.3        存储器层次结构 

  • 中心思想:层次结构每一层都缓存来自较低一层的数据对象 

6.3.1        存储器层次结构中的缓存

  •  中心思想:位于k层的更快更小的存储设备作为位于k+1层的更大更慢的存储设备的缓存

数据传递
  •  数据总是以块大小为传送单元在层间来回复制
  • 任何一对相邻层次之间的块大小是固定的,其他层次对之间可以有不同的块大小(较低层使用较大的块,补偿访问时间的较长的情况)
缓存命中 
  • 定义:        需要k+1层的data,在k层找到对应data
  • 比直接从k+1层访问数据要快
缓存不命中
  • 定义:         需要k+1层的data,没能在k层找到对应data
对应操作:
  • 第k层的缓存从k+1层缓存中取出包含data的块,若k层缓存满了,就会覆盖现存的一个块(替换策略决定)
  • 然后程序再从k层读出data对象
放置策略:
  • 最灵活策略:允许来自k+1层的任何块放置第k层的任何块
  • 更严格(性价比高):k+1层的一个块子集 映射到k层的某个块
种类:
强制性不命中/冷不命中:
  • 出现原因:        k层缓存为空的(冷缓存)

冲突不命中:
  • 出现原因:        保存的被引用的数据对象,映射到同一个缓存块,缓存会一直不命中(放置策略采用低层子集映射高层块)

缓存管理
  • 管理部分:        硬件,软件,或者两者结合
具体实现:
缓存层次结构的最高层
  • 编译器管理寄存器文件
  • 它决定当发生不命中时何时发射加载,以及确定哪个寄存器来存放数据

 6.3.2        存储器层次结构概念小结

  • 缓存在现代计算机系统无处不在
概念说明:
  • TLB:快表
  • NFS:网络文件系统

 6.4        高速缓存存储器

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

结构: 

存储器地址

  • 地址有m位,形成M = 2^m个不同的地址

缓存:

  • 一个有S = 2^s个高速缓存组的        数组

组:

  • 每个组包含E个高速缓存行

行:

  • 一个B =  2^b字节的数据块
  • 一个有效位(是否有意义)
  • t = m - (b + s)个标记位(唯一地标识)

 参数:

 容量:

  • C指的所有块大小的和,标记位和有效位不包括在内
  • C = S*E*B
 缓存查询原理:
  • 组索引解释无符号整数   指向包含字的组
  • t位标记位                       指向包含字具体行(设置了有效位 及 该行标记位和地址标记位匹配)
  • b位偏移位                      指向行中字偏移

6.4.2        直接映射高速缓存  

结构:
  • 每个组只有一行的高速缓存
  • 查询原理和基本原理相符

 替换策略

  • 用新取出的行替换当前的行
注意:
  • 多个块映射同一个高速缓存组(不同块有相同的组索引)
  • 标记位和索引位唯一标识内存每个块
  • 映射到同一个高速缓存组的块由标记位唯一标识

 冲突不命中
1 float dotprod(float x[8], float y[8])
2 {
3 float sum = 0.0;
4 int i;
5
6 for (i = 0; i < 8; i++)
7 sum += x[i] * y[i];
8 return sum;
9 }
  • 抖动(高速缓存反复地加载和驱逐相同地高速缓存组)

解决方法:
  • 在每个数据结尾放B字节的填充(float x[8] -> float x[12])
  • 假设y紧跟x后面

6.4.3        组相联高速缓存 

结构:
  • 相联存储器kv机制         标记位和有效位(key)        ->        块的内容(value)
缓存查询原理:
  • 组中的任何一行都可以包含任何映射到这个组的内存块(找到有效行就命中)
替换策略:
  • 简单:随机选择要替换的行
  • 局部性原理:优先保留最近或频繁使用的数据(LFU,LRU)

6.4.4        全相联高速缓存

结构:
  •  一个包含所有高速缓存行的组
缓存查询:
  • 地址不需要组索引位
  • 和组相联缓存相似
  • 适合做小的高速缓存(eg.虚拟内存系统中的快表TLB,它缓存页表项)
具体的缓存查询步骤:
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值