第六次学习笔记
存储器层次结构
存储器系统是一个具有不同容量、成本和访问时间的存储折本的层次结构。
CPU寄存器保存着最常用的数据。
高速缓存存储器是靠近CPU的小的,快速的。为一部分存储在相对慢速的主存储器中
执行期间找寻的速度:CPU寄存器>高速缓存>主存>磁盘
计算机的一个基本属性局部性:具有良好局部性的程序倾向于一次又一次地访问相同的数据项集合。
存储技术
随机访问存储器
分为两类:静态RAM(SRAM)和动态RAM(DRAM)
静态比动态更快,但是也更贵
静态作为高速缓存存储器,可在CPU芯片上,或者芯片下。一般不会超过几兆字节
动态用来存以及图形系统的帧缓冲区。可以有几百或者几千兆字节
静态RAM
SRAM将每个位存储在一个双稳态的存储单元器里,每个单元是用一个六晶体电路来实现
它无限保持在两个不同的电压配置或者状态之一。其他任何状态都是不稳定的。
将其比作钟摆。可以在垂直位置无限保持平衡,但是这个状态是亚稳态的。一点点干扰也能让其失去平衡
动态RAM
DRAM将每个位存储为对一个电容的充电(该电容非常小)。DRAM存储器可以制造得非常密集。但与SRAM不同它对干扰非常敏感,当电容的电压被扰乱之后,它就永远不会恢复了。而且暴露在光线下会导致电容电压改变。
二者的区别
传统的DRAM
DRAM芯片中的单元被分成D个超单元,每个超单元都由W个DRAM单元组成。一个D乘W的DRAM总共存储了DW位信息。
超单元被组织成为一个R行C列的长方形阵列,RC=D,每个超单元有形如(I,J)的地址,这里I表示行,而J表示列
存储器模块
DRAM芯片包装在存储器模块中,它是插到主板的扩展槽上的,常见的包装包括168个引脚的双列直插存储器模块,它以64位为块传送数据到存储控制器和从存储控制器传出数据,还包括72和引脚的单列直插存储器模块,它以32位为块传送数据。
增强的DRAM
快页模式DRAM(FPM DRAM):允许对同一行连续地访问可以直接从行缓冲区得到服务.
扩展数据输出DRAM(EDO DRAM):FPM DRAM的一个增强的形式,它允许单独的CAS信号在时间上靠的更紧密一些
同步DRAM(SDRAM):SDRAM用与驱动存储控制器相同的外部时钟信号的上升沿来代替许多这样的控制信号
双倍数据速率同步DRAM(DDR SDRAM):DDR SDRAM是对SDRAM的一种增强,它通过使用两个时钟沿作为控制信号,从而使DRAM的速度翻倍。不同类型的DDR SDRAM是用提高有效带宽很小的预取缓冲区的大小来划分的:DDR(2位)、DDR2(4位)、DDR3(8位)
Rambus DRAM(RDRAM):这是另一种私有技术,它的最大带宽比DDR SDRAM更高
视频RAM(VRAM):与FPM的区别:
VRAM的输出是通过依次对内部缓冲区的整个内容进行移位得到的。RAM允许对存储器并行地读和写。
非易失性存储器
易失:如果断电,DRAM和SRAM会丢失他们的信息
非易失性存储器:即使在关电之后,也依然保存着他们的信息。
只读存储器:ROM中既可以读也可以写
PROM:只能被编程一次
可擦可编程ROM:有一个透明的石英窗口
访问主存
读事务:从主存传送数据到CPU
写事务:从CPU传送数据到主存
总线:一组并行的导线,能携带地址、数据和控制信号
磁盘存储
盘片
表面:每个盘片有两个表面
主轴:盘片中央,可旋转
旋转速率:通常5400~15000/min
磁道:同心圆们
扇区:每个磁道被划分为一组扇区
数据位:每个扇区包含相等数量的~,通常为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执行对地址的存储命令,发起磁盘读:
第一条指令时发送一个命令字;第二条指令指明应该读的逻辑块号;第三条指令指明应该存储磁盘扇区内内容的主存地址。
直接存储器访问:设备可以自己执行读或者写总线事务,而不需要CPU干涉的过程。这种数据传送称为DMA传送
基本思想:中断会发信号到CPU芯片的一个外部引脚上。这会导致CPU暂停它当前正在做的工作,跳转到一个操作系统例程。这个程序会记录下I/O已经完成,然后将控制返回到CPU被中断的地方。
固态硬盘(SSD)
一个SSD包由一个或多个闪存芯片和闪存翻译层组成,闪存芯片代替传统旋转磁盘中的机械驱动器,而闪存翻译层是一个硬件/固件设备,扮演与磁盘控制器相同的角色,将对逻辑块的请求翻译成对底层物理设备的访问。
随机读和写的性能差别是由底层闪存基本属性决定的。
读写很慢的原因:
1、擦除块需要相对较长的时间2、写操作试图修改一个包含已经有数据的页p,那么这个二块中的所有带有用数据的页都必须被拷贝到一个新(擦除过的)块,然后才能进行对页p的写。
SSD比旋转磁盘更好地优点:随机访问时间比旋转磁盘块,能耗更低,更结实。
缺点是:闪存翻译层中的平均磨损逻辑试图通过将擦除平均分布在所有的块上来最大化每个块的寿命。
存储技术趋势
不同的存储技术有不同的价格和性能折中。
不同存储技术的价格和性能属性以截然不同的速率变化着。
增加密度从而降低成本比降低访问时间更容易。
DRAM和磁盘的性能滞后于CPU的性质。
局部性
局部性:倾向于引用邻近与其他最近引用过的数据项的数据项,或者最近引用过的数据项本身,这种倾向性,被称为局部性原理。
局部性包括时间局部性和空间局部性。
时间局部性:被引用过一次的存储器位置很可能在不远的将来再被多次引用。
空间局部性:一个存储器位置被引用了一次,那么程序很可能在不远的将来引用附近的一个存储器位置。
对程序数据引用的局部性
步长为k的引用模式:一个连续变量中,每隔k个元素进行访问。
顺序引用模式:具有步长为1的引用模式
随着步长的增加,空间局部性下降。
int sumarraycols(int a[M][N])
{
int i,j,sum = 0;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
sum += a[i][j];
return sum;
}
该程序有良好的空间局部性,是因为数组是按照与它存储在存储器中一样的行优先顺序来被访问的。
int sumarraycols(int a[M][N])
{
int i,j,sum = 0;
for(j=0;j<M;j++)
for(i=0;i<N;i++)
sum += a[i][j];
return sum;
}
该程序的空间局部性很差,这是因为它使用步长为N 的引用模式来扫描存储器。
取指令的局部性
循环体里的指令是按照连续的存储器顺序执行的,因此循环有良好的空间局部性,因为循环体会被执行多次,所以它也有良好的时间局部性。
代码区别于程序数据的一个重要属性时在运行时是不能被修改的。
局部性小结
评价一个程序中局部性的简单原则:
重复引用同一个变量的程序有良好的时间局部性;
对于具有步长为k的引用模式的程序,步长越小,空间局部性越好;
对于取指令来说,循环有好的时间和空间局部性,循环体越小,循环迭代次数越多,局部性越好。
存储器层次结构
存储器层次结构:硬件和软件的这些基本属性(存储技术、计算机软件)互相补充得很完美,这种互相补充的性质使人想到一种组织存储器系统的方法。
存储器层次结构中的缓存
高速缓存(cash)是一个小而快速的存储设备,使用高速缓存的过程成为缓存
最小的缓存——CPU寄存器集合
数据总是以块大小为传送单元在第k层和第k+1层之间来回拷贝。
缓存命中:当程序需要第k+1层的某个数据对象d时,它首先在当前存储在第k层的一个块中查找d,如果d刚好缓存在第k层中的情况。
缓存不命中:第k层中没有缓存数据对象d的情况
强制性不命中或冷不命中:k层的缓存是空的——冷缓存
冲突不命中:限制性的放置策略引起的不命中
容量不命中:工作集的大小超过缓存的大小时。
替换或驱逐:替换一个现存的块的过程。
牺牲快:被驱逐的这块。
替换策略:控制决定该替换哪个块的策略
利用时间的局部性:由于时间局部性,同一数据对象可能会被多次使用。
利用空间的局部性:块通常包含有多个数据的对象。
高速缓存存储器
CPU寄存器文件和主存之间插入一个小的SRAM高速缓存存储器——L1高速缓存(一级缓存)
在L1高速缓存和主存之间插入一个更大的高速缓存——L2高速缓存
比L2更大的高速缓存——L3高速缓存
通用的高速缓存存储器结构
每个寄存器地址有m位,形成M=2^m个不同的抵制
高速缓存被组织成一个有S=2^s个高速缓存组的数组
每个组包含E个高速缓存行
每个行由一个B=2^b字节的数据块组成的
一个有效位指明这个行是否包含有意义的信息
t=m-(b+s)个标记位是当前块的存储器地址的位的子集
高速缓存的大小C:指的是所有块的大小的和,标记位和有效位不包含在内,C=S×E×B
直接映射高速缓存中的行匹配
当且仅当设置了有效位,而且高速缓存行中的标记与w的地址中的标记相匹配时,这一行中包含w的一个拷贝。
直接映射高速缓存中的自选择
直接映射高速缓存中不命中时的行代替
用新取出来的行替换当前的行。
直接映射高速缓存中的冲突不命中
抖动:高速缓存反复地加载和驱逐相同的高速缓存块的组。
组相联高速缓存
E路组相联高速缓存:1<E<C/B
组相联高速缓存中的组选择
组相联高速缓存中的行匹配和自选择
基本思路:组中的任何一行都可以包含任何映射到这个组的存储器块。
组相联高速缓存中不命中时的行替换
随机选择替换策略:最简单 ****最不常使用策略:替换在过去某个时间窗口内引用次数最少的那一行最近最少使用策略:替换最后一次访问时间最久远的那一行
有关写的问题
直写:立即将w的高速缓存块写回到紧接着的第一层中
缺点是每次写都会引起总线流量。
写回:只有当替换算法要驱逐更新过的块时,才能把它写到紧接着的低一层中,由于局部性,写回能显著减少总线流量。
缺点是增加了复杂性。
高速缓存必须为每个高速缓存行维护一个额外的修改位,表明这个高速缓存块是否被修改过。
另一个问题是如何处理写不命中。
每写分配:加载相应的低一层中的块到高速缓存中,然后更新这个高速缓存块。
缺点是次不命中都会导致一个块从低一层传送到高速缓存。
非写分配:避开高速缓存,直接把这个字写到低一层中。
直写高速缓存通常是非写分配的。写回高速缓存是写分配的。
存储器层次结构中较低层的缓存更可能使用写回,而不是直写。
例如,虚拟存储器系统只使用写回。
一个真实的高速缓存层次结构的剖析
即保存指令有包括数据的高速缓存称为统一的高速缓存。
现代处理器包括独立的i-cache和d-cache。
有不同的高速缓存的优点是确保了数据访问不会与指令访问形成冲突不命中,缺点是可能引起容量不命中增加。
高速缓存参数的性能影响
不命中率:不命中数量/引用数量 命中率:1-不命中率 命中时间:组选择、行确认和字选择的时间 不命中处罚:不命中需要的额外的时间。
高度缓存大小的影响:较大的高速缓存可能会提高命中率,但也可能增加命中时间。
块大小的影响:较大的块能利用程序中可能存在的空间局部性,帮助提高命中率。快越大意味着高速缓存行数越少,对不命中处罚也有负面影响。
相联度的影响:相联度E较高,降低了高速缓存由于冲突不命中出现抖动的可能性。 但价格昂贵,运行速度慢,不命中处罚增加。
写策略的影响:直写高速缓存能使用独立于高速缓存的写缓冲区,用来更新存储器。高速缓存越往下层,可能使用写回而不是直写。
遇到的问题
对于存储层次结构的时间局部性和空间局部性理解有点小问题
参考文献
1、池彬宁的博客http://www.cnblogs.com/Spr1ngxx/p/4908764.html
2、深入理解计算机系统课本第六章
3、每周重点:http://group.cnblogs.com/topic/73069.html