20145236《信息安全系统设计基础》第7周学习总结
第六章 存储器层次结构
在简单模型中,存储器系统是一个线性的字节数组,而CPU能够在一个常数时间内访问每个存储器位置。实际上,存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。CPU寄存器保存着最常用的数据。靠近CPU的小的、快速的高度缓存存储器作为一部分存储在相对慢速的主存储器中的数据和指令的缓冲区域。 存储器层次结构是可行的。
CPU寄存器、高速缓存存储器、主存储器、磁盘。
6.1 存储技术
6.1.1 随机访问存储器
随机反问存储器分为两类:静态的(SRAM)和动态的(DRAM)。
1.静态RAM
SRAM将每个位存储在一个双稳态的存储单元里。只要有电,他就会永远保持他的值。即使有干扰来扰乱电压,当干扰消除时,电路就会恢复稳定值。
2.动态RAM
DRAM将每个位存储为对一个电容的充电。与SRAM不同,DRAM存储单元易受干扰。当电容的电压被扰乱后,他就永远不会恢复了。
-
只要供电SRAM就会保持不变。
-
SRAM的存取比DRAM快。
-
SRAM对干扰不敏感。
-
SRAM单元比DRAM单元使用更多晶体管,密度较低,更贵,功耗更大。
3.传统的DRAM
行地址i:RAS
列地址j:CAS DRAM组织成二位阵列而不是线性数组的一个原因是降低芯片上地址引脚的数量。
二维阵列组织的缺点是必须分两步发送地址,这增加了访问时间。
4.存储器模块
DRAM芯片包装在存储器模块中,他是插到主板的扩展槽位上的。常见的包括168个引脚的双列直插存储器模块,以64位为块传送数据到存储控制器和从存储控制器传出数据,还包括72个引脚的单列直插存储器模块,以32位为块传送数据。
通过将多个存储器模块连接到存储控制器,能够聚合主存,当控制器收到一个地址A时,控制器选择包含A的模块k,将A转换为它的(i, j)的模式,并将(i, j)发送到模块k。
5.增强的DRAM
快页模式DRAM(FPM DRAM):异步控制信号,允许对同一行连续的访问可以直接从行缓冲区得到服务。
扩展数据输出DRAM(EDO DRAM):异步控制信号,允许单独的CAS信号在时间上靠的更紧密一点
同步DRAM(SDRAM):同步的控制信号,比异步的快
双倍数据速率同步DRAM(DDR SDRAM):使用两个时钟沿作为控制信号,使DRAM速度翻倍。
Rambus DRAM(RDRAM):一种私有技术
视频RAM(VRAM):用在图形系统的帧缓冲区中。
6.非易失性存储器
如果断电,DRAM和SRAM会丢失他们的信息,所以他们是易失的。
非易失性存储器,即使是在关电以后,也仍然保存着他们的信息。他们整体上都称为只读存储器(ROM)。
ROM以他们能够被重新编程的次数和对他们进行重编程所用的机制来区分的。
PROM 只能被编程一次。
可擦可编程ROM,有个透明的石英窗口,允许光到达存储单元。
闪存,是一类非易失性存储器,基于EEPROM,他已经成为了一种重要的存储技术。
存储在ROM中的程序通常称为固件。
7.访问主存
数据流通过称为总线(bus)的共享电子电路在处理器和DRAM主存之间来来回回。每次CPU和主存之间的数据传送都是通过一系列步骤来完成的,这些步骤称为总线事务。
读事务:从主存传送数据到CPU
写事务:从CPU传送数据到主存
总线:一组并行的导线,能携带地址、数据和控制信号。
6.1.2 磁盘存储
磁盘是保存大量数据的存储设备。
1.磁盘构造
磁盘是由盘片构成的。每个盘片有两个盘面,表面覆盖着磁性记录材料。盘片中央有个可以旋转的主轴,使得盘片以固定的旋转速率旋转。
旋转速率:通常5400~15000/min
磁道:同心圆们
扇区:每个磁道被划分为一组扇区
数据位:每个扇区包含相等数量的~,通常为512字节
间隙:存储用来标识扇区的格式化位
磁盘驱动器-磁盘-旋转磁盘
柱面:所有盘片表面上到主轴中心的距离相等的磁道的集合。
2.磁盘容量
计算磁盘容量的公式:
磁盘容量 = 字节数/扇区 X 平均磁盘数/磁道 X 磁道数/表面 X 表面数/盘片 X 盘片数/磁盘
3.磁盘操作
磁盘以扇区大小的块来读写数据。
访问时间的分类:
-
寻道时间——移动传动臂所用的时间。
依赖于读/写头以前的位置和传动臂在盘面上移动的速度。
通常为3-9ms,最大可达20ms。
-
旋转时间——驱动器等待目标扇区的第一个位旋转到读/写头下
依赖于盘面位置和旋转速度。
最大旋转延迟=1/RPM X 60secs/1min (s)
平均旋转时间是最大值的一半。
-
传送时间
依赖于旋转速度和每条磁道的扇区数目
平均传送时间= 1/RPM x 1/(平均扇区数/磁道) x 60s/1min
访问一个磁盘扇区内容的平均时间为平均寻道时间,平均旋转延迟和平均传送时间之和。
3.连接到I/O设备
像图形卡、监视器、鼠标键盘和磁盘这样的输入/输出(I/O)设备,都是通过I/O总线连接到CPU和主存的。
虽然I/O总线比系统总线和存储器总线慢,但它可以容纳种类繁多的第三方I/O设备。
4.访问磁盘
DMA:直接存储器访问
——设备可以自己执行读或者写总线事务,而不需要CPU干涉的过程。
6.1.3固态硬盘(SSD)
一个SSD包由一个或多个闪存芯片和闪存翻译层组成,闪存芯片代替传统旋转磁盘中的机械驱动器,而闪存翻译层是一个硬件/固件设备,扮演与磁盘控制器相同的角色,将对逻辑块的请求翻译成对底层物理设备的访问。
随机读和写的性能差别是由底层闪存基本属性决定的。
6.1.4 存储技术趋势
不同的存储技术有不同的价格和性能折中
不同存储技术的价格和性能属性以截然不同的速率变化着
增加密度从而降低成本比降低访问时间更容易
DRAM和磁盘的性能滞后于cpu的性能
6.2 局部性
一个编写良好的计算机程序通常具有良好的局部性。他们倾向于引用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。这种倾向称为局部性原理。局部性有两种不同形式:时间局部性和空间局部性。有良好局部性的程序比局部性差的程序运行的更快。
6.2.2 取指令的局部性
循环体里的指令是按照连续的存储器顺序执行的,因此循环有良好的空间局部性,因为循环体会被执行多次,所以它也有良好的时间局部性。
代码区别于程序数据的一个重要属性时在运行时是不能被修改的。
6.2.3 局部性小结
量化评价一个程序中局部性的简单原则:
重复引用同一个变量的程序有良好的时间局部性
对于具有步长为k的引用模式的程序,步长越小,空间局部性越好
对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
6.3 存储器层次结构
6.3.1 存储器层次结构中的缓存
高速缓存:是一个小而快速地存储设备,它作为存储在更大、也更慢的设备中的数据对象的缓冲区域。 缓存:使用高速缓存的过程。
1.缓存命中
但程序需要第k+1层的某个数据对象d时,它首先在当前存储在第k层的一个块中查找d,如果d刚好缓存在第k层中,那么就是我们说的缓存命中。
2.缓存不命中
若第k层中没有缓存数据对象d,那么就是我们所说的缓存不命中。
替换或驱逐:覆盖一个现存的块的过程。
牺牲块:被驱逐的这个块。
替换策略:决定应该替换哪个块。
3.缓存不命中的种类
冷缓存(强制不命中冷不命中):一个空的缓存,对于有效位为0的情况
缓存暖身:反复访问存储器使缓存暖身之后的稳定状态
放置策略:发生了不命中,第k层的缓存就必须执行某个放置策略,确定把它从第k+1层中取出来的块放在哪里。
硬件缓存通常使用的是更严格的放置策略。例如:第k+1层的块0、4、8、12会映射到第k层的块0;块1、5、9、13会映射到块1;以此类推。
冲突不命中:限制性的放置策略会引起的一种不命中。
工作集:程序是按照一系列阶段来运行的,每个阶段访问缓存块的某个相对稳定不变的集合。 容量不命中:当工作集的大小超过缓存的大小时。
4.缓存管理
缓存管理:某个东西要将缓存划分成块,在不同的层之间传送块,判定是命中还是不命中,并处理它们。
编译器管理寄存器文件,缓存层次结构的最高层。
L1、L2、L3层的缓存完全是由内置在缓存中的硬件逻辑来管理的。
DRAM主存是有操作系统软件和CPU上的地址翻译硬件共同管理的。
6.4 高速缓存存储器
存储器层次结构只有三层:CPU寄存器、DRAM主存储器和磁盘存储。
6.4.1 通用的高速缓存存储器结构
每个存储器地址有m位,形成M=2^m个不同的地址。
高速缓存组:S = 2^m个高速缓存组的数组
高速缓存行:B = 2^m字节的数据块组成
有效位:指明这个行是否包含有意义的信息
标记位:唯一地标识存储在这个高速缓存行中的块,t = m -(b+s)
一般而言,高速缓存的结构可以用元组(S,E,B,m)来描述。高速缓存的大小(或容量)C指的是所有块的大小的和。标记位和有效位不包括在内。因此,C=SEB.
6.4.2 直接映射高速缓存
直接映射高速缓存:每个组只有一行的高速缓存。
高速缓存确定一个请求是否命中,然后抽取出被请求的字的过程,分为三步:组选择、行匹配、字抽取
。
根据E(每个组的高速缓存行数)高速缓存被分为不同的类。每个组只有一行的高速缓存被称为直接映射高速缓存。
1.直接映射高速缓存中的组选择
2.直接映射高速缓存中的行匹配和字选择
3.直接映射高速缓存中不命中时的行替换
如果缓存不命中,那么需要从存储器层次结构中的下一层取出被请求的块,然后将新的块存储在组索引位指示的组中的一个高速缓行中。
替换规则:用新取出的行替换当前的行。
4.后运行中的直接映射高速缓存
标记位和索引位连起来唯一的标识了存储器中的每个块
映射到同一个高速缓存组的块由标记位唯一地标识
6.4.3 组相联高速缓存
每个组都保存有多于一个的高速缓存行
1、组相联高速缓存中的组选择
2.组相联高速缓存中的行匹配和自选择
基本思路:组中的任何一行都可以包含任何映射到这个组的存储器块。
3.组相联高速缓存中不命中时的行替换
随机选择替换策略:最简单
最不常使用策略:替换在过去某个时间窗口内引用次数最少的那一行
最近最少使用策略:替换最后一次访问时间最久远的那一行
6.4.4 全相联高速缓存
1.组选择
只有一个组,默认组0,没有索引位,地址只被划分成了一个标记和一个块偏移。
2.行匹配和字选择
同组相联。
只适合做小的高速缓存。
6.4.5 有关写的问题
直写,立即将w的高速缓存块协会到紧接着的低一层中
缺点:每次写都会引起总线流量。
写回,只有当替换算法要驱逐更新过的块时,才写到紧接着的低一层中
优点:符合局部性原理,显著的减少总线流量
缺点:增加了复杂性,必须为每个高速缓存行维护一个额外的修改位
写分配,通常写回对应
加载相应的低一层中的块到高速缓存中,然后更新这个高速缓存块。
非写分配,通常直写对应
避开高速缓存,直接把这个字写在低一层中。
6.4.6 一个真实的高速缓存层次结构的剖析
高速缓存既保存数据,也保存指令。
只保存指令的:i-cache
只保存程序数据的:d-cache
既保存指令又保存数据的:统一的高速缓存
6.4.7 高速缓存参数的性能影响
不命中率:不命中数量/引用数量 命中率:1-不命中率 命中时间:组选择、行确认和字选择的时间 不命中处罚:不命中需要的额外的时间。
1.高度缓存大小的影响
较大的高速缓存可能会提高命中率,但也可能增加命中时间。
2.块大小的影响
较大的块能利用程序中可能存在的空间局部性,帮助提高命中率。快越大意味着高速缓存行数越少,对不命中处罚也有负面影响。
3.相联度的影响
相联度E较高,降低了高速缓存由于冲突不命中出现抖动的可能性。 但价格昂贵,运行速度慢,不命中处罚增加。
4.写策略的影响
直写高速缓存能使用独立于高速缓存的写缓冲区,用来更新存储器。高速缓存越往下层,可能使用写回而不是直写。
课后习题
1.P391 6.2
【计算这样一个磁盘的容量。它有2个盘片,10 000个柱面,每条磁道平均有400个扇区,每个扇区平均有512个字节】 磁盘容量 = 512字节/扇区400扇区/磁道10 000磁道/表面2表面/盘片2盘片/磁盘 = 8 192 000 000 字节 = 8.192GB
2.P393 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
3.P394 6.4
【假设1MB的文件由512字节的逻辑块组成,存储在有如下特性的磁盘驱动器上(旋转速率:10 000RPM,Taveseek=5ms,平均扇区/磁道 = 1000)。
(1)最好的情况:给定逻辑块到磁盘扇区的最好的可能的映射(即,顺序的),估计读这个文件需要的最优时间
(2)随机的情况:如果块是随机地映射到磁盘扇区的,估计读这个文件需要的时间】
首先明确:1MB=2^20字节,即数据存储在2000个逻辑块中;对于磁盘,Taverotation=0.51/10000RPM60secs/1min*1000ms/s=3ms
则:(1)T=Taveseek+Taverotation+2Tmaxrotation=5ms+3ms+26ms=20ms
(2)在这种情况下,块被随机的映射到扇区上,读2000块的每一块都需要Taveseek+Tavgrotation=8ms。所以读这个文件的总时间为T = 8ms*2000=16000ms=16s
4.P404 6.8
【改变下面函数中的循环顺序,使得它以步长为1的引用模式扫描三维数组a】
int sumarray3d(int a[N][N][N])
{
int i,j,k,sum=0;
for(i=0;i<N;i++)
{
for(j =0;j<N;j++)
{
for(k=0;k<N;k++)
{
sum+=a[k][i][j];
}
}
}
return sum;
}
只需要对三层嵌套循环体的顺序进行调整即可:
int sumarray3d(int a[N][N][N])
{
int i,j,k,sum=0;
for(k=0;k<N;i++)
{
for(i =0;i<N;j++)
{
for(j=0;j<N;k++)
{
sum+=a[k][i][j];
}
}
}
return sum;
}
5.P415 6.11
【在前面dotprod的例子中,在我们对数组x做了填充之后,所有对x和y的引用的命中率是多少?】 在填充了之后,对于x和y数组,只有在引用第0个和第4个元素的时候发生不命中。因而命中率为75%
6.P415 6.12
【一般而言,如果一个地址的高s位被用作组索引,那么存储块连续的片会映射到同一个高速缓存组。
1.每个这样连续的数组有片多少个块?
2.考虑下面的代码;它运行在一个高速缓存形式为(S,E,B,m)=(512,1,32,32)的系统上
int array[4096]
for(i=0;i<4096;i++)
sum+=array[i];
在任意时刻,存储在高速缓存中的数组块的最大数量是多少?】 1.2^t个块
【这道题揭示了我们为什么不用高s位做组索引;这样的话,前2^t个地址都映射到一个组中(详细解释见下)】
2.如果地址的前s=9位做组索引,那么之后的t=18位做标记位;高速缓存容量是512个32字节的块。数组只需要(4096*4)/32=512个块;这些块均会被映射到组0中(数组是连续存放的),因此,在任何时刻,高速缓存中只能保存一个数组块(尽管它的容量可以存放数组)。这样极大降低了高速缓存利用率。
本周代码拖管
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 200/400 | 2/4 | 18/38 | |
第三周 | 100/500 | 1/5 | 10/48 | |
第四周 | 250/750 | 1/6 | 10/58 | |
第五周 | 100/850 | 1/7 | 10/68 | |
第六周 | 100/950 | 1/8 | 12/80 | |
第七周 | 200/1150 | 1/9 | 12/92 |