2017-2018-1 20155331 《信息安全系统设计基础》第13周学习总结
学习目标
找出全书你认为最重要的一章,深入重新学习一下。
第六章教材学习内容重温总结
存储技术
随机访问存储器
随机访问存储器分为:静态RAM(SRAM)和动态RAM(DRAM),静态RAM(SRAM)比动态RAM(DRAM)更快,但也贵很多。
静态RAM:
SRAM将每个位存储在一个双稳态的存储器单元里,每个单元是用一个六晶体管电路来实现的。
SRAM的特点:存储器单元具有双稳态特性,只要有电就会永远保持它的值,干扰消除时,电路就会恢复到稳定值。
动态RAM:
DRAM的特点:每一位的存储是对一个电容的充电,电容约为30×10-15F;对干扰非常敏感,当电容的电压被扰乱之后,它就永远不会恢复了。暴露在光线下会导致电容电压改变。
用途:数码照相机和摄像机的传感器
DRAM存储不稳定的应对机制:存储器系统必须周期性地通过读出,或者重写来刷新存储器的每一位;使用纠错码。
SRAM和DRAM的区别:
只要有电,SRAM就会保持不变,而DRAM需要不断刷新;
SRAM比DRAM快;
SRAM对光和电噪声等干扰不敏感;
SRAM比DRAM需要使用更多的晶体管,所以更昂贵。
传统的DRAM:
行地址i:RAS
列地址j:CAS DRAM组织成二位阵列而不是线性数组的一个原因是降低芯片上地址引脚的数量。
二维阵列组织的缺点是必须分两步发送地址,这增加了访问时间。
存储器模块分类:
168个引脚的双列直插存储器模块,以64位为块传送数据;
72个引脚的单列直插存储器模块,以32位为块传送数据。
增强的DRAM:
快页模式DRAM(FPM DRAM):异步控制信号,允许对同一行连续的访问可以直接从行缓冲区得到服务。
扩展数据输出DRAM(EDO DRAM):异步控制信号,允许单独的CAS信号在时间上靠的更紧密一点
同步DRAM(SDRAM):同步的控制信号,比异步的快
双倍数据速率同步DRAM(DDR SDRAM):使用两个时钟沿作为控制信号,使DRAM速度翻倍。
Rambus DRAM(RDRAM):一种私有技术
视频RAM(VRAM):用在图形系统的帧缓冲区中。
非易失性存储器:ROM是以它们能被重编程的次数和对它们进行重编程所用的机制区分的
可编程ROM(PROM):只能被编程一次
可擦写可编程ROM(EPROM):使用紫外线实现
电子可擦除PROM(EEROM):使用印制电路卡实现
闪存(FM):非易失性存储设备
访问主存:
读事务:从主存传送数据到CPU。
写事务:从CPU传送数据到主存。
总线:一组并行的导线,能携带地址、数据的控制信号。
- 读事务语句:``movl A,%eax``
- 写事务语句:``movl %eax,A``
磁盘存储
磁盘构造:
由盘片构成,每个盘片有两面或者称为表面,表面覆盖着磁性记录材料。盘片中央有一个可以旋转的主轴,使得盘片以固定的旋转速率旋转,通常是5400~15000转每分钟(RPM)
每个表面是由一组称为磁道的同心圆组成;每个磁道被划分成一组扇区;每个扇区包含相等数量的数据位(通常是512字节);这些数据编码在扇区上的磁性材料中。扇区之间由一些间隙分隔开,这些间隙中不存在数据位。间隙存储用来标识扇区的格式化位。
磁盘容量:
一个磁盘上可以记录的最大位数称为它的最大容量/容量。
磁盘容量的决定因素:记录密度:磁道一英寸的段可以放入的位数;磁道密度:从盘片中心出发半径上一英寸的段
内可以有的磁道数;面密度:记录密度与磁道密度的乘积。
计算磁盘容量的公式:磁盘容量 = 字节数/扇区 X 平均磁盘数/磁道 X 磁道数/表面 X 表面数/盘片 X 盘片数/磁盘
磁盘操作:
磁盘用读写头来读写存储在磁性表面的位,而读写头连接到一个转动臂一端。寻道就是通过沿着半径轴前后移动这个转动臂,使得驱动器可以将读写头定位在盘面上的任何磁道上。
磁盘以扇区大小的块来读写数据。
访问时间=寻道时间+旋转时间+传送时间;
寻道时间:移动传送臂所需要的时间
旋转时间:一旦读写头定位你到了期望的磁道,驱动器等待目标扇区的第一个位旋转到读写头下。 该性能依赖于当
读写头到达目标磁道时盘面的位置和磁盘的旋转速度。最大旋转延迟=1/RPM X 60secs/1min (s),平均旋转时间是最大旋转时间的一半
传送时间:一个扇区的传送时间依赖于旋转速度和每条磁道的扇区数目。平均传送时间=1/RPM x 1/(平均扇区数/磁道) x 60s/1min,一个磁盘扇区内容的平均时间为平均寻道时间、平均旋转延迟和平均传送时间之和。
逻辑磁盘块:
磁盘控制器:磁盘中一个小的硬件、固件设备,维护着逻辑块号和实际物理磁盘扇区之间的映射关系。
三元组(盘面,磁道,扇区):唯一地表示了对应的物理扇区。
连接到I/O设备:
外围设备互连(PCI):连接到CPU和主存 I/O总线的分类
通用串行总线(USB):包括键盘、鼠标、调制解调器、数码相机、游戏操纵杆、打印机、外部磁盘驱动器和固态硬盘等
图形卡(适配器):负责代表CPU在显示器上画像素
主机总线适配器:使用特别的主机总线接口定义的通信协议
访问磁盘:
CPU使用一种存储器映射I/O技术来向I/O设备发出命令,在使用存储器映射I/O的系统中,地址空间中有一块地址是
为与I/O设备通信保留的,称为I/O端口。当一个设备连接到总线时,它与一个或多个端口相连。
直接存储器访问:设备可以自己执行读或者写总线事务,而不需要
基本思想:中断会发信号到CPU芯片的一个外部引脚上。这会导致CPU暂停它当前正在做的工作,跳转到一个操作系统例程。这个程序会记录下I/O已经完成,然后将控制返回到CPU被中断的地方。
固态磁盘
固态硬盘是一种基于闪存的存储技术。
一个SSD包由一个或多个闪存芯片和闪存翻译层组成,闪存芯片替代传统旋转磁盘中机械驱动器;闪存翻译层(一个硬件/固件设备)替代磁盘控制器,将对逻辑块的请求翻译成对底层物理设备的访问。
性能特性:顺序读和写(CPU按顺序访问逻辑磁盘块)性能相当,顺序读比顺序写稍快一点;随机顺序访问逻辑块时,写比读慢一个数量级;读写性能差别是由底层闪存基本属性决定的。
优点:由半导体构成,没有移动的部件;随机访问时间比旋转磁盘要快、能耗低、结实。
缺点:易磨损、更贵
存储技术趋势
不同的存储技术有不同的价格和性能折中
不同存储技术的价格和性能属性以截然不同的速率变化着(增加密度从而降低成本比降低访问时间更容易)
DRAM和磁盘的性能滞后于CPU的性能
局部性
局部性:倾向于引用邻近与其他最近引用过的数据项的数据项,或者最近引用过的数据项本身,这种倾向性,被称为局部性原理。
局部性包括时间局部性和空间局部性
时间局部性:被引用过一次的存储器位置很可能在不远的将来再被多次引用。
空间局部性:一个存储器位置被引用了一次,那么程序很可能在不远的将来引用附近的一个存储器位置。
有良好局部性的程序比局部性差的程序运行得更快
硬件层:局部性原理允许计算机设计者通过引入高速缓存存储器来保存最近被引用的指令和数据项,从而提高对主存的访问速度。
操作系统级:局部性原理允许系统使用主存作为虚拟地址空间最近被引用块的高速缓存,用主存来缓存磁盘文件系统中最近被使用的磁盘块。
应用程序中:例如,Web浏览器将最近被引用的文档放在本地磁盘上。
对程序数据引用的局部性
步长为k的引用模式:一个连续变量中,每隔k个元素进行访问。
顺序引用模式:具有步长为1的引用模式
一般来说,随着步长增加,空间局部性下降。
取指令的局部性
程序指令是存放在存储器中的,CPU必须取出(读出)这些指令。
代码区别于程序数据的一个重要属性是在运行时它是不能被修改的。当程序正在执行时,CPU只从存储器中读出它的指令,CPU绝不会重写或修改这些指令。
存储器层次结构
存储技术:不同的存储技术的访问时间差异很大,速度较快的技术每字节的成本要比速度较慢的技术高,而且容量较小,CPU和主存之间的速度差距在增大。
计算机软件:一个编写良好的程序倾向于展示出良好的局部性。
存储器层次结构中的缓存
高速缓存:是一个小而快速地存储设备,它作为存储在更大、也更慢的设备中的数据对象的缓冲区域。
缓存:使用高速缓存的过程。
块:第k+1层的存储器被划分成连续的对象片。每个块有一个唯一的地址或名字,使之区别于其他的块。
传送单元:数据总是以块大小为传送单元。
缓存命中:
当程序需要第k+1层的某个数据对象d时,首先在当前存储在第k层的一个块中查找d,如果d刚好缓存在第k层中,就
称为缓存命中。
该程序直接从第k层读取d,比从第k+1层中读取d更快。
缓存不命中:第k层中没有缓存数据对象d
这时第k层缓存会从第k+1层缓存中取出包含d的那个块。如果第k层缓存已满,就可能会覆盖现存的一个块;覆盖一个现存的块的过程称为替换/驱逐这个块;被驱逐的块有时也称为牺牲块。
替换策略:决定替换哪个块;随机替换策略:随机选择一个牺牲块;最近最少被使用替换策略(LRU):选择最后被访问的时间距现在最远的块。
缓存不命中的种类:
强制性不命中/冷不命中:即第k层的缓存是空的(称为冷缓存),对任何数据对象的访问都不会命中。通常是短暂事件,不会在反复访问存储器使得缓存暖身之后的稳定状态中出现。
冲突不命中:由于一个放置策略:将第k+1层的某个块限制放置在第k层块的一个小的子集中,这就会导致缓存没有满,但是那个对应的块满了,就会不命中。
容量不命中:当工作集的大小超过缓存的大小时,缓存会经历容量不命中,就是说缓存太小了,不能处理这个工作集。
缓存管理:某种形式的逻辑必须管理缓存,而管理缓存的逻辑可以是硬件、软件,或者两者的集合。
高速缓存存储器
存储器层次结构只有三层:CPU寄存器、DRAM主存储器和磁盘存储。
通用的高速缓存存储器结构
每个存储器地址有m位,形成M=2^m个不同的地址。
高速缓存组:S = 2^m个高速缓存组的数组
高速缓存行:B = 2^m字节的数据块组成
有效位:指明这个行是否包含有意义的信息
标记位:唯一地标识存储在这个高速缓存行中的块,t = m -(b+s)
直接映射高速缓存
直接映射高速缓存:每个组只有一行的高速缓存。
高速缓存确定一个请求是否命中,然后抽取出被请求的字的过程,分为三步:(1)组选择(2)行匹配(3)字抽取
组选择:
高速缓存从w的地址中间抽取出s个组索引位
组索引位:一个对应于一个组号的无符号整数。
行匹配:
判断缓存命中的两个充分必要条件:该行设置了有效位;高速缓存行中的标记和w的地址中的标记相匹配
字选择:确定所需要的字在块中是从哪里开始的。
组相联高速缓存
组选择:与直接映射高速缓存中的组选择一样,组索引位标识组。
行匹配和字选择:
把每个组看做一个小的相关联存储器,是一个(key,value)对的数组,以key为输入,返回对应数组中的value值。高速缓存必须搜索组中的每一行,寻找有效 的行其标记与地址中的相匹配。
形式是(key, value),用key作为标记和有效位去匹配,匹配上了之后返回value。
组中的任意一行都可以包含任何映射到这个组的存储器块,所以告诉缓存必须搜索组中的每一行。
组相连高速缓存中不命中时的行替换:
随机替换
最不常使用策略LFU:替换在过去某个时间窗口内引用次数最少的那一行。
最近最少使用策略LRU:替换最后一次访问时间最久远的那一行。
全组相连高速缓存:
组选择:只有一个组,没有组索引位。
行匹配和字选择:与组相连高速缓存是一样的,但规模大很多,因此只适合做小的高速缓存,例如虚拟存储系统中的翻译备用缓冲器。
写命中时,更新低一层中的拷贝的方法
直写:立即将w的高速缓存块协会到紧接着的低一层中;缺点:每次写都会引起总线流量。
写回:只有当替换算法要驱逐更新过的块时,才写到紧接着的低一层中。优点:符合局部性原理,显著的减少总线流量;缺点:增加了复杂性,必须为每个高速缓存行维护一个额外的修改位
写不命中的处理方法:
写分配(对应写回):加载相应的低一层中的块到高速缓存中,然后更新这个高速缓存块。
非写分配(对应直写):避开高速缓存,直接把这个字写在低一层中
课后习题部分
习题6.2
计算这样一个磁盘的容量。它有2个盘片,10 000个柱面,每条磁道平均有400个扇区,每个扇区平均有512个字节。
根据磁盘容量公式
可得:磁盘容量 = 512(字节)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字节的逻辑块组成,存储在有如下特性的磁盘驱动器上(旋转速率:10000RPM,
Taveseek=5ms,平均扇区/磁道 = 1000)。
(1)最好的情况:给定逻辑块到磁盘扇区的最好的可能的映射(即,顺序的),估计读这个文件需要的最优时间
(2)随机的情况:如果块是随机地映射到磁盘扇区的,估计读这个文件需要的时间
首先明确:1MB=2^20字节,即数据存储在2000个逻辑块中;对于磁盘,
Taverotation=0.51/10000RPM60secs/1min1000ms/s=3ms则:
(1)T=Taveseek+Taverotation+2Tmaxrotation=5ms+3ms+26ms=20ms
(2)在这种情况下,块被随机的映射到扇区上,读2000块的每一块都需要Taveseek+Tavgrotation=8ms。所以读这个文件的总时间为T = 8ms2000=16000ms=16s
习题6.7
改变下面函数中的循环顺序,使得它以步长为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(i=0;k<N;i++)
{
for(j =0;i<N;j++)
{
for(k=0;j<N;k++)
{
sum+=a[k][i][j];
}
}
}
return sum;
}
习题6.10
在前面dotprod的例子中,在我们对数组x做了填充之后,所有对x和y的引用的命中率是多少?
在填充了之后,对于x和y数组,只有在引用第0个和第4个元素的时候发生不命中。因而命中率为75%
习题6.11
一般而言,如果一个地址的高s位被用作组索引,那么存储块连续的片会映射到同一个高速缓存组。
A.每个这样连续的数组有片多少个块?
B.考虑下面的代码;它运行在一个高速缓存形式为(S,E,B,m)=(512,1,32,32)的系统上
int array[4096]
for(i=0;i<4096;i++)
sum+=array[i];
在任意时刻,存储在高速缓存中的数组块的最大数量是多少?
A.用高位做索引,每个连续的数组片(chunk)由2^t个块组成,这里t是标记位数,因此,数组头2^t个连续的块都会映射到组0,接下来的2^t个块会映射到组1,以此类推。
B.对于直接映射高速缓存(S.E.B.m)=(512,1,32,32),高速缓存容量是512个32子节的块,每个高速缓存行中有t=18个标记位。因此,数组中头2^18个块会映射到组0,接下来2^18个块会映射到组1.因为我们的数组只由(4095*4)/32=512个块组成,所以数组中所有的块都被映射到组0.因此,在任何时刻,高速缓存之多只能保存一个数组块,即时数组足够小,能够完全放到高速缓存中。很明显,用高位做索引不能充分利用高速缓存。