2017-2018-1 20155303 《信息安全系统设计基础》第九周学习总结
————————CONTENTS————————
教材内容总结
零 存储器层次结构的主要思想
存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构,主要由CPU、高速缓存存储器、主存、磁盘构成。一个存储器层次是下一层次的缓存(从集合论上看可理解为子集)。
由于成本原因,主存无法用快速访问的SRAM制造。又由于编写良好的程序具有局部性的特点,它更倾向于频繁访问某一层次上的存储设备。所以与CPU直接访问DRAM主存相比,利用存储器层次化的系统在(少数次)访问底层存储设备的更大开销(指的是CPU等待存取的时钟周期)可以通过多数次访问高速缓存得到补偿。存储器层次结构的整体效果就是存储器池的成本与层次结构底层最便宜的存储设备相当,但是却以接近于层次结构顶部存储设备的高速率向程序提供数据。
壹 存储技术
1、易失性存储器
(1)SRAM和DRAM
(2)传统的DRAM与增强的DRAM:
- 传统的DRAM:如下图,每个方块代表由w位(一般为8位,这样一个超单元就表示一个字节)bit组成的超单元,整个DRAM由d个超单元组织成二维阵列构成。DRAM中的数据以超单元为单位访问。通过地址引脚传入的RAS(行访问选通脉冲)和CAS(列访问选通脉冲)访问某个超单元,然后加载目标所在行到内部行缓冲区,通过8位的数据引脚输出目标。
之所以将超单元组织成二维阵列而非线性数组,是为了减少地址的位数,尽管需要付出增加一个传入地址的代价。
- 增强的DRAM:快页模式DRAM(FPM DRAM) ,扩展数据输出DRAM (EDO DRAM),同步DRAM(SDRAM),双倍数据速率同步DRAM(DDR SDRAM)
(3)存储器模块:
将b个DRAM芯片包装成一个存储器模块,b字节数据被同时存取。缓存中常提到的块就是这样一个存储器模块的一个访问单位。
(4)访问主存:数据流通过称为总线的共享电子电路在处理器和DRAM主存之间来来回回。总线间数据传送的步骤称为总线事务。
2、非易失性存储器
(1)ROM(只读存储器)
实际上ROM中有的类型既可以读也可以写,仍称之为“只读存储器”是历史原因。存在ROM中的程序称为固件,当一个计算机系统通电以后,它会运行存储在ROM中的固件。一些系统在固件中提供了少量基本的输入输出函数。
ROM可按照它们能够被重编程的次数和对它们进行重编程所用的机制分类为:
PROM(可编程ROM),EPROM(可擦写可编程ROM),闪存(基于EEPROM),固态硬盘(SSD,基于闪存)
(2)磁盘
- 磁盘构造
-
磁盘操作:寻道、旋转、读取(时间开销主要是寻道时间和旋转延迟造成)
-
逻辑磁盘块:磁盘中有一个小的硬件/固件设备,称为磁盘之气空啊,维护着逻辑块号和实际物理磁盘扇区之间的映射关系。
(3)固态硬盘(SSD)
固态硬盘结构:闪存翻译层与磁盘控制器作用相同,一个闪存由B个块序列组成,每个块由P页组成。通常页的大小是5124KB,块是由32128页组成。数据是以页为单位读写的。只有在一页所属的整个块被擦除后(有效内容拷贝到其他块)才可写这一页。
闪存由半导体存储器构成,没有移动的部件,因而随机访问时间比旋转磁盘快,能耗更低,同时也更结实。不过闪存块在反复读写后会磨损,所以闪存块有使用寿命。
贰 程序的局部性
-
时间局部性:被引用过一次的存储器位置很可能在不远的将来再被多次引用。
-
空间局部性:被引用过一次的存储器位置附近的数据可能在不远的将来被引用。
-
取指令的局部性:指令也是存储在存储器中的,循环的时间和空间局部性是好的。循环体越小,迭代次数越多,局部性越好。
叁 存储器的层次结构
(1)缓存
第k+1层的存储器被划分成连续的数据对象片,称为块。每个块都有唯一的地址或名字以区别于其他块。数据总以块大小为传送单元在第k层和第k+1层之间来回拷贝。虽然在层析结构中任何一对相邻的层次之间块大小是固定的,但是其他的层次对之间可以有不同的块大小。第k层存储的块集合是第k+1层的子集的拷贝。
- 缓存不命中:
类别:冷不命中,冲突不命中,容量不命中。
策略:替换(或称驱逐)一个现存块,替换策略有随机替换策略、最近最少被使用替换策略等。
(1)通用的高速缓存存储器结构
- 可用(S,E,B,m)来描述一个高速缓存的结构。如下图,右图每种不同色代表一个块,且块映射到不同组。
-
分类:直接映射高速缓存、全相联高速缓存、组相联高速缓存(前两者的折中)
-
访问某个存储器地址的过程:逐级访问各存储器层次,进行三步——组选择,行匹配,字抽取(若命中)——直到命中
(2)关于写操作
直写与非写分配:直写是指命中后立即将目标字所在命中块写回到紧接着低一层中;非写分配是指不命中时直接将目标字写到低一层中。
写回与写分配:写回是指命中后延迟更新低一层直到命中块被驱逐;写分配是指不命中时加载响应的低一层中的块到高速缓存中,然后更新这一高速缓存块(试图利用写的空间局部性)。
(3)高速缓存参数的性能影响
-
与性能相关的一些量化指标:不命中率、命中率、命中时间、不命中处罚。
-
高速缓存参数对性能的影响:缓存大小的影响,块大小的影响,相联度的影响,写策略的影响。
肆 一个真实的高速缓存层次结构
伍 编写高速缓存友好代码
- a、让最常见的情况运行得快;
- b、在每个循环(程序的时间开销主要在循环,多重循环主要看内层循环)内部缓存不命中的数量最小
陆 存储器系统的性能——存储器山
存储器山是一种综合研究存储器层次结构的工具。它反映了存储器层次结构中不同层次的带宽。也反映了具有不同的时间局部性与空间局部性的程序的性能。通过分析存储器山的数据,还可以看出存储器系统的部分硬件参数。
当时间局部性很差的时候空间局部性仍能补救。
教材部分习题分析
参考本周学习指导,教材练习重点为:6.2 6.3 6.4 6.8 6.9 6.10 6.11 6.12 6.13,下面分析其中几道典型的例题。
- 『练习题6.2』:计算这样一个磁盘的容量,它有2个盘片,10000个柱面,每条磁道平均有400个扇区,而每个扇区由512个字节。
答:磁盘容量=2*2*10000*400*512=8192000000字节=8.192GB
- 『练习题6.3』:估计访问下面这个磁盘上一个扇区的访问时间(以ms为单位)。
参数 | 值 |
---|---|
旋转速率 | 15000RPM |
T(avg seek) | 8ms |
每条磁道的平均扇区数 | 500 |
答:直接套用公式:
- 平均旋转时间:T1=1/2*(60s/15000RPM)*1000ms/s=2ms
- 平均传送时间:T2=(60s/15000RPM)*1/500扇区/磁道*1000ms/s=0.008ms
-> 总时间为:T=8ms+2ms+0.008ms=10ms
- 『练习题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; i<N; i++){
for(j=0; j<N; j++){
for(k=0; k<N; k++){
sum += a[k][i][j];
}
}
}
return sum;
}
- 『练习题6.8』:
对以下函数就空间布局性进行排序:
答:
-
函数clear1以步长为1的引用模式访问数组;
-
函数clear2以步长不为1的模式调到下一个结构偏移处;
-
函数clear3空间局部性最差,不仅在结构中跳来跳去,还从结构跳到结构。
-
因此,空间局部性clear1优于clear2优于clear3。
代码托管
学习感悟和思考
- 本周学习了教材第六章:存储器层次结构。对程序员来说,存储器是计算机系统中最直接可见的部分之一。通过本章的学习,了解到了不同的存储设备是如何放置在层次结构中的,以及访问局部性是如何使这种结构层次成为可能的。同时,通过一些实例学习了如何通过改善程序的时间局部性和空间局部性来提高应用程序的性能。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 20篇 | 400小时 | |
第一周 | 50/50 | 1/1 | 8/8 | 了解计算机系统、静态链接与动态链接 |
第三周 | 451/501 | 2/3 | 27/35 | 深入学习计算机算术运算的特性 |
第四周 | 503 / 1004 | 1/4 | 20/55 | 掌握程序崩溃处理、Linux系统编程等知识,利用所学知识优化myod,并实现head和tail命令 |
第五周 | 315 / 1319 | 3/7 | 29/84 | 掌握“进程”的概念,并学习应用相关函数;了解程序如何在机器上表示 |
第七周 | 264 / 1583 | 1/8 | 15/99 | 了解处理器的体系结构,学习多线程的概念 |
第八周 | 634 / 2217 | 2/10 | 10/109 | 学习存储器系统的层次结构,以及改善程序性能的方法 |