20145218 《信息安全系统设计基础》第六周学习总结
教材学习内容总结
在简单模型中,存储器系统是一个线性的字节数组,而cpu能够在一个常数时间嫩访问每个存储器位置。实际上,存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。
6.1 存储技术
随机访问存储器(RAM)
- 静态RAM(SRAM):用来作为高速缓存存储器,每个位存储在一个双稳态的存储器单元里。双稳态:电路可以无限期的保持在两个不同的电压配置或者状态之一。只要供电,就会保持不变。即使有干扰,例如电子噪音来扰乱电压,当干扰消除后,电路就会恢复到稳定值。
- 动态RAM(DRAM):用来作为主存以及图形系统的帧缓冲区。将每个位存储为对一个电容的充电,当电容的电压被扰乱之后,他就永远都不会再恢复了。暴露在光线下会导致电容电压改变。
- SRAM与DRAM的对比:
SRAM DRAM
不需要刷新 以纳秒为周期刷新
存取速度快 存取速度慢
对光电噪声不敏感 光电因素易导致电压改变
晶体管多密集度低 电容小,密集度高
功耗贵代价高 功耗低
SRAM DRAM
每位晶体管数 6 1
相对访问时间 1x 10x
持续的? 是 否
敏感的? 否 是
相对花费 100x 1x
应用 高速缓存存储器 主存,帧缓冲区
- 传统的DRAM
- DRAM芯片中的单元(位)被分成了d个超单元,每个超单元都由w个DRAM单元组成, 一个d*w的DRAM共存储dw位信息。超单元被组织成一个r行c列的长方形阵列,rc=d。每个超单元的地址用(i,j)来表示(从零开始)。设计成二维矩阵是为了降低芯片上地址引脚的数量。
- 信息通过称为引脚的外部连接器流入/流出芯片,每个引脚携带一个1位信号。
- 每个DRAM信号被连接到称为存储控制器的电路,电路每次传输量为8位。行地址i,RAS请求;列地址j,CAS请求共享相同的DRAM地址引脚。组织成二维阵列而不是线性数组的一个原因是降低芯片上地址引脚的数量。
- 二维阵列阻止的缺点是必须分两步发送地址,这增加了访问时间。
- 电路设计者将DRAM组织成二维阵列而不是线性数组的一个原因是降低芯片上地址引脚的数量。
- 而为真理组织的缺点是必须分两步发送地址,这增加了访问时间。
- 存储器模块
- 双列直插存储器模块(DIMM):168个引脚,以64位为块传入/传出数据到存储控制器。
- 单列直插存储器模块(SIMM):72个引脚,以32位为块传入/传出数据到存储控制器。
- 增强的DRAM
- 快页模式DRAM:允许对同一行连续的访问可以直接从行缓冲区得到服务,避免内部行缓冲区使用一个丢弃其他的现象。
- 扩展数据输出DRAM:允许单独的CAS信号在时间上靠的更紧密一点。
- 同步DRAM:用驱动存储控制器相同的外部时钟信号的上升沿来替代许多的异步信号,速度更快。
- 双倍数据速率同步DRAM:通过使用两个时钟沿作为控制信号,使得DRAM的速度翻倍。
- RambusDRAM:增大了最大带宽
- 视频DRAM:用在图形系统的帧缓冲区中,允许对存储器并行的读和写。
- 访问主存
- 总线:数据流通过称为总线的共享电子电路在处理器和DRAM之间传送。是一组并行的导线,能携带地址、数据和控制信号。
- 总线事务:CPU和主存之间的数据传送的过程。读事务,从主存传数据到CPU;写事务,从CPU传数据到主存。
- I/O桥:将系统总线的电子信号翻译成存储器总线的电子信号。系统总线连接CPU和I/O桥,控制总线连接I/O桥和主存。
非易失性存储器(ROM)
如果断电,DRAM和SRAM都会丢失信息,非易失性存储器——只读存储器:ROM。ROM是以他们能够被重编程的次数和对他们重编程的机制来区分的。
- 可编程ROM(PROM):只能被编程一次。PROM每个存储单元有一种熔丝,只能用高电流熔断一次。
- 可擦写可编程ROM(EPROM):紫外线光照射过窗口,EPROM就被清除为0,被擦除和重编程的次数为1000次。
- 电子可擦除ROM(EEPROM):不需要一个物理上独立的编程设备,因此可以直接在印制电路卡上编程,能够编程的次数为10^5。
- 闪存:基于EEPROM,为大量的电子设备提供快速而持久的非易失性存储。
磁盘存储
- 磁盘构造:磁盘由盘片构成,表面覆盖着磁性记录材料,中央有一个可以旋转的主轴 ,旋转速率大约为5400-15000每分钟。磁盘的每个表面是一组称为磁道的同心圆组成,每个磁道被划分为一组扇区,扇区之间由一些间隙隔开,间隙存储用来标识扇区的格式化位。
- 磁盘容量由以下技术因素决定:
- 记录密度(位/英寸):磁道一英寸的段中可以放入的位数。
- 磁道密度(道/英寸):从盘片中心出发半径上一英寸的段内可以有的磁道数
- 面密度(位/平方英寸):记录密度与磁道密度的乘积。
- 现代大容量磁盘使用一种称为多区记录的技术,柱面的集合被分割称为不相交的子集合,称为记录区,每个区包含一组连续的柱面。
- 磁盘操作:磁盘用读/写头来读写存储在磁性表面的位,而读写头连接到一个传动臂 一端,通过移动转动臂将读写头定位在磁道上的机械运动称为寻道。磁盘以扇区大小的块来读写数据,对扇区的访问时间有三个主要的组成部分:
- 寻道时间:转动臂将读/写头定位到包含目标扇区的磁道上所需时间。
- 旋转时间:驱动器等待目标扇区的第一个位旋转到读/写头下的时间。最大为
- 平均旋转时间是Tmax的一半。
- 传送时间:读写并传送该扇区内容的时间。平均传送时间为:
- 逻辑磁盘块:现代磁盘将盘面的构造视为一个B个扇区大小的逻辑块序列,磁盘控制器维护着逻辑块号和实际磁盘扇区之间的映射关系。逻辑块号可识别为一个盘面、磁道、扇区三元组,唯一的标识了相对应的物理扇区。内存可以看成字节数组、磁盘可以看成块数组。
- 连接到I/O设备:所有的I/O设备都是通过I/O总线连接到CPU和主内存。有三种不同类型:
通用串行总线:一个广泛的使用标准,用于连接各种外围I/O设备。 - 图形卡(或适配器):包含硬件和软件逻辑,代表CPU在显示器上画像素。
- 主机总线适配器: 将一个或者多个磁盘连接到I/O总线,使用一个特别的主机总线接口定义的通信协议。
- 访问磁盘:CPU使用一种称为存储器映射I/O的技术向I/O设备发出命令,地址空间中为I/O设备通信保留的地址称为I/O端口。
固态硬盘
- 固态硬盘是一种基于闪存的存储技术。一个硬盘包由一个或者多个闪存芯片和内存翻译层组成,闪存芯片替代旋转磁盘中的机械驱动器,而闪存翻译层将对逻辑块的请求翻译成对底层物理设备的访问
存储技术趋势
- 不同的存储技术有不同的价格和性能折中。
- 不同存储技术的价格和性能属性以截然不同的速率变化着
- DRAM和磁盘的性能滞后于CPU的性能。
6.2局部性
局部性原理:一个编写良好的计算机程序倾向于引用邻近于其他最近引用过的数据项,或者最近引用过的数据项本身。有良好局部性的程序比局部性差的程序运行的更快,在硬件层引入高速缓存存储器就体现了局部性原理。
对程序数据引用的局部性
- 时间局部性(temporal locality):被引用过一次的存储器位置在未来会被多次引用(通常在循环中)。
- 空间局部性(spatial locality):如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。
- 一个连续向量中,每隔k个元素进行访问,被称为步长为k的引用模式,具有步长为1的引用模式称为顺序引用模式,随着步长增加空间局部性下降。
- 双重嵌套循环按照行优先顺序读取数组元素。(因为C数组在存储器中是按照行顺序来存放的)
取指令的局部性
- 程序指令是存放在存储器中的,CPU读取这些指令的过程中评价一个程序关于取指令的局部性。
- 代码区别与程序数据的一个重要属性就是在运行时指令是不能被修改的。
局部性小结
- 重复引用同一个变量的程序有良好的时间局部性
- 对于具有步长为k的引用模式的程序,步长越小,空间局部性越好。
- 对于取指令来说,循环具有良好的时间和空间局部性。循环体越小,迭代次数越多局部性越好。
v6.3存储器层次结构
存储器层次结构中的缓存
- 高速缓存是一个小而快速的存储设备,作为存储在更大、更慢的设备中的数据对象的缓冲区域。每一层存储器被划分成连续的数据对象片,称为块,每个块都有唯一的对象和名字。数据总是以块大小为传送单元在第k层和第k+1层之间来回拷贝。
- 缓存命中:当程序需要第k+1层的某个数据对象d时,首先在当前存储的第k层的一个块中查找d,如果d刚好在第k层中,则称为缓存命中。
- 缓存不命中:如果k层中没有缓存数据d,则称为缓存不命中,此时要从k+1层取出包含d的块,可能会覆盖(替换/驱逐)现在的一个块(牺牲块)。决定该替换哪个快是缓存的替换策略来控制的。(例如,随机替换策略/LRU策略)
- 缓存不命中的种类
- 强制性不命中/冷不命中:第k层缓存是空的(冷缓存),只是短暂的状态,不会在反复访问存储器使得缓存暖身之后的稳定状态出现。
- 冲突不命中:第k+1层的第i块,必须放置在第k层的块(i mod 4)中,这种限制性的放置策略引起冲突不命中。
存储器层次结构概念小结
- 利用时间局部性: 一旦一个数据在第一次不命中时被拷贝到缓存中,我们就会期望后面对该目标有一系列的访问命中。
- 利用空间局部性:块通常包含多个数据对象,我们通常期望后面对该块中其他对象的访问能够补偿不命中后拷贝该块的花费。
v6.4高速缓存存储器
通用的高速缓存存储器结构
- 一个计算机系统每个存储地址有m位,形成M=2^m个不同的地址。
- 高速缓存被组织成一个有S=2s个高速缓存组的数组,每个组包含E个高速缓存行,每个行是由一个B=2b字节的数据块、一位有效位以及t=m-(b+s)个标记位组成,唯一标识存储在这个高速缓存行中的块。
- 高速缓存的结构用元组(S,E,B,m)来描述,高速缓存的大小C = S * E * B。
地址: t位 s位 b位
标记 组索引 块偏移
- s个组索引位:一个无符号整数,说明字必须存储在哪个组中。
- t个标记位:组中的哪一行包含这个字。
- b个块偏移位:在B个字节的数据块中的字偏移。
直接映射的高速缓存
- 每组只有一行(E=1)的高速缓存称为直接映射高速缓存。高速缓存确定一个请求是否命中,然后抽取出被请求字的过程分为三步:1)组选择,2)行匹配,3)字抽取。
- 直接映射高速缓存中的组选择:高速缓存从要抽取的字的地址中抽取出S个组索引位,这些位被解释成一个对应于一个组号的无符号整数。
- 直接映射高速缓存中的行匹配:当且仅当设置了有效位,而且高速缓存行标记与w的地址中的行标记相匹配时,这一行中包含w的一个拷贝。
- 直接映射高速缓存中的字抽取:块偏移位提供了所需要的字的第一个字节的偏移。
- 直接映射高速缓存中不命中时的行替换:需要从存储器层次结构中的下一层取出被请求的块,然后将新的块存储在组索引位指示的组中的一个高速缓存行中。
组相连高速缓存
- 组相连高速缓存中的组选择:与直接映射高速缓存中的组选择一样,组索引位标识组。
- 组相连高速缓存中的行匹配和字选择:把每个组看做一个小的相关联存储器,是一个(key,value)对的数组,以key为输入,返回对应数组中的value值。高速缓存必须搜索组中的每一行,寻找有效的行其标记与地址中的相匹配。
- 组相连高速缓存中不命中时的行替换:最简单的替换策略是随机选择要替换的行,其他复杂的策略则使用了局部性原理,例如最不常使用、最近最少使用,等。
全相连高速缓存
- 全相连高速缓存中的组选择:只有一个组,没有组索引位。
- 全相连高速缓存中的行匹配和字选择:与组相连高速缓存是一样的,但规模大很多,因此只适合做小的高速缓存,例如虚拟存储系统中的翻译备用缓冲器。
有关写的问题
- 写命中
- 直写:立即将w的高速缓存块写回紧接着的低一层中,虽然简单但每次都会引起总线流量。
- 写回:尽可能地推迟存储器更新,只有当替换算法要驱逐更新过的块时,才把它写到低一级的块中。减少流量但增加了复杂性。
- 写不命中
- 写分配:加载相应的低一层中的块到高速缓存中,然后更新这个高速缓存块。(写回)
- 非写分配:避开高速缓存,直接把这个字写到低一层中。(直写)
高速缓存参数的性能影响
- 不命中率:不命中数量/引用数量
- 命中率:1-不命中率
- 命中时间:从高速缓存传送一个字到CPU所需的时间,包括组选择,行匹配,字抽取的时间。
- 不命中处罚:由于不命中所需要的额外时间。
影响性能的因素
- 高速缓存大小的影响:较大的高速缓存可能会提高命中率,但使大存储器运行的更快是更难一些的。
- 块大小的影响:较大的块能利用程序中可能存在的空间局部性,帮助提高命中率;但块越大意味着高速缓存行较少,损害时间局部性。
- 相联度的影响:相联度较大(E值较大)优点是降低了高速缓存由于冲突不命中出现抖动的可能性,但成本较高。
- 写策略的影响:直写高速缓存易实现,而且能使用独立于高速缓存的写缓冲区,用来更新存储器,不命中开销小。写回高速缓存引起的传送比较少,允许更多的到存储器的宽带用于执行DMA的I/O设备。越下层越可能使用写回。
6.5编写高速缓存友好的代码
确保代码高速缓存友好的基本方法:
- 让最常见的情况运行的快。
- 在每个循环内部缓存不命中数量最小。
- 对局部变量的反复引用是好的,因为编译器能够将他们缓存在寄存器文件中。
- 步长为1的引用模式是好的,因为存储器层次结构中所有层次上的缓存都是将数据存储为连续的块(空间局部性)。
6.6综合:高速缓存对程序性能的影响
存储器山
- 一个程序从存储系统中读数据的速率称为读吞吐量,或者读带宽,通常以兆字节每秒(MB/s)为单位。
- 读带宽的时间和空间局部性的二维函数称为存储器山。
根据代码驱动的程序设计学习建立的项目结构
-
首先建立所需文件夹
-
通过命令
sudo apt install tree
进行安装
-
将本周代码存入ch07文件夹后,输入
tree
即可
课后作业中的问题和解决过程
习题6.2
计算这样一个磁盘的容量。它有2个盘片,10 000个柱面,每条磁道平均有400个扇区,每个扇区平均有512个字节
磁盘容量 = (512/400)*400*10000*2*2= 8 192 000 000 字节 = 8.192GB
习题6.3
估计访问下面的一个磁盘上的一个扇区需要的时间(以ms为单位)。旋转速率:15000RPM;Taveseek = 8ms;每条磁道的平均扇区数:500
访问时间 = Taveseek+Taverotation+Tavetransfer = 8ms+0.51/15000RPM60secs.min1000ms/s+1/15000RPM1/50060secs/min1000ms/s=8ms+2ms+0.008ms=10.008ms
习题6.4
假设1MB的文件由512字节的逻辑块组成,存储在有如下特性的磁盘驱动器上(旋转速率:10 000RPM,Taveseek=5ms,平均扇区/磁道 = 1000)。
(1)最好的情况:给定逻辑块到磁盘扇区的最好的可能的映射(即,顺序的),估计读这个文件需要的最优时间
(2)随机的情况:如果块是随机地映射到磁盘扇区的,估计读这个文件需要的时间
(1)T=Taveseek+Taverotation+2Tmaxrotation=5ms+3ms+26ms=20ms
(2)在这种情况下,块被随机的映射到扇区上,读2000块的每一块都需要Taveseek+Tavgrotation=8ms。所以读这个文件的总时间为T = 8ms*2000=16000ms=16s
习题6.11
在前面dotprod的例子中,在我们对数组x做了填充之后,所有对x和y的引用的命中率是多少?
在填充了之后,对于x和y数组,只有在引用第0个和第4个元素的时候发生不命中。因而命中率为75%
本周代码托管截图
代码托管链接:https://git.oschina.net/senlinmilelu/ISdesign20145218/tree/master
其他(感悟、思考等,可选)
本次学习过程总体来说较上一次轻松,因为概念性知识点并不晦涩,而代码部分也并不困难。同时,本章节各部分之间的联系性增强,只要好好阅读课本,课本上练习题都不是问题,基本上都有公式。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 3/4 | 18/38 | |
第三周 | 500/1000 | 4/7 | 22/60 | |
第四周 | 300/1300 | 4/9 | 30/90 | |
第五周 | 200/500 | 5/4 | 18/38 | |
第六周 | 120/1000 | 6/7 | 22/60 | |
第七周 | 70/1300 | 7/9 | 30/90 |