2017-2018-1 20155326 《信息安全系统设计基础》第十四周学习总结
学习总结
存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。存储器层次结构是可行的,是因为与下一个更低层次的存储设备相比来说,一个编写良好的程序倾向于更频繁的访问某一个层次上的存储设备。靠近CPU的小的、快速的高速缓存存储器(cache memory)作为一部分存储在相对慢速的主存储器(mainmemory,简称主存)中的数据和 指令的缓冲区域。主存暂时存放存储在容量较大的、慢速磁盘上的数据,而这些磁盘常常又作为存储在通过网络连接的其他机器的磁盘或磁带上的数据的缓冲区域。
问题:随机访问存储器分为哪几类?他们各自的特点是什么?两者有什么区别和联系?
-
随机访问存储器(Random-AccessMem)分两类:静态RAM(SRAM)和动态RAM(DRAM)。
SRAM将每个位存储在一个双稳态的(bitable)存储器单元里。每个单元是用一个六晶体管电路来实现的。
DRAM将每个位存储为对一个电容的充电。DRAM存储器可以制造得非常密集——每个单元由一个电容和一个访问晶体管组成。 -
他们的特点如下图:
-
由此图我们可以得知:
只要有供电,SRAM就会保持不变,不需要被刷新,但掉电后不可以保存里面的内容;SRAM的存取比DRAM快;对光电噪声不敏感 ,晶体管多密集度低 ,功耗贵代价高 。
-
所以在ch6中这道题答案为:
有关RAM的说法,正确的是()
A.SRAM和DRAM掉电后均无法保存里面的内容。
B.DRAM将一个bit存在一个双稳态的存储单元中
C.一般来说,SRAM比DRAM快
D.SRAM常用来作高速缓存
E.DRAM将每一个bit存储为对一个电容充电
F.SRAM需要不断刷新
G.DRAM被组织为二维数组而不是线性数组答案: A D E G
问题:为什么将DRAM组织成二维阵列而不是线性数组?
- 电路设计者将DRAM组织成二维阵列,而不是线性数组的一个原因是降低芯片上地址引脚的数量,当然二维阵列组织的缺点是必须分两步发送地址,增加了访问时间。
问题:下面这道题的答案是什么?
关于非易失性存储器,下面说法正确的是()
A.DRAM是非易失性存储器
B.SRAM是非易失性存储器
C.PROM只能编程一次
D.EEPROM可以用紫外线进行擦除
E.存在ROM中的程序通常被称为固件
- 根据书上P404,非易失性存储器指即使在关电后仍保持着他们的信息。常见的非易失性存储器如下:
可编程ROM(PROM):只能被编程一次。PROM每个存储单元有一种熔丝,只能用高电流熔断一次。
可擦写可编程ROM(EPROM):紫外线光照射过窗口,EPROM就被清除为0,被擦除和重编程的次数为1000次。
电子可擦除ROM(EEPROM):不需要一个物理上独立的编程设备,因此可以直接在印制电路卡上编程,能够编程的次数为10^5。
闪存:基于EEPROM,为大量的电子设备提供快速而持久的非易失性存储。
所以这道题的正确答案: C E 。
问题:每次CPU和主存之间的数据传送都是怎么完成的?
-
数据流通过称为总线的共享电子电路在处理器和DRAM主存之间来来回回。每次CPU和主存之间的数据传送都是通过一系列步骤来完成的,这些步骤称为总线事务。
事务由四步组成:
当一个客户端需要服务时,它向服务器发送一个请求,发起一个事务。
服务器收到请求后,解释它,并以适当的方式操作它的资源。
服务器给客户端发送一响应,并等待下一个请求。
客户端收到响应并处理它。
问题:磁盘的特点是什么?
磁盘:由一个或多个叠放在一起的盘片组成,被封装在一个密封的包装里。整个装置通常被称为磁盘驱动器,简称为磁盘(又称旋转磁盘,以区别基于闪存的固态硬盘(SSD没有移动部分))。
-
(ch6中的题目)有关磁盘操作,说法正确的是(A C)
A.对磁盘扇区的访问时间包括三个部分中,传送时间最小。
B.磁盘以字节为单位读写数据
C.磁盘以扇区为单位读写数据
D.读写头总处于同一柱面 -
(ch6中的题目)有关磁盘,说法正确的是(A C)
A.磁盘的读取时间为毫秒级
B.每张磁盘有一个表面
C.表面由磁道组成
D.每个扇区的面积不同,包含的数据位的数量也不一样
问题:书上习题6.2
- 计算这样一个磁盘的容量,它有2个盘片,10000个柱面,每条磁道平均有400个扇区,而每个扇区有512个字节。
解析:套公式:
问题:访问时间的分类
- 寻道时间
指移动传动臂所用的时间,依赖于读/写头以前的位置和传动臂在盘面上移动的速度。
- 旋转时间
指驱动器等待目标扇区的第一个位旋转到读/写头下的时间,依赖于盘面位置和旋转速度。
平均旋转时间是他的一半。
- 传送时间
依赖于旋转速度和每条磁道的扇区数目。
- 书上习题6.3解析:
问题:局部性怎样会更好?
-
局部性原理指一个程序倾向于引用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。
-
局部性通常有两种不同的形式:时间局部性和空间局部性。
重复引用同一个变量的程序有良好的时间局部性。
一个连续向量中,每隔k个元素进行访问,就被称为步长为k的引用模式。对于具有步长为k的引用模式的程序,步长越小,空间局部性越好。具有步长为1的引用模式的程序有很好的空间局部性。在存储器中以大步长跳来跳去的程序空间局部性会很差。 -
对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
-
由此我们可以得知下图代码的步长是N*N。(ch6中的题目)
-
程序中(循环)语句具有良好的局部性。(ch6中的题目)
-
(ch6中的题目)有关局部性原理,说法正确的是(A B D)
A.程序访问一个向量,步长越小或短,空间局部性越好
B.局部性有两种形式:空间局部性,时间局部性
C.程序访问一个向量,步长越大空间局部性越好。
D.硬件、OS,应用程序都会用到局部性原理
书上习题6.7解析:
将代码中的循环改为
for(i=0;i<N;i++)
for(j=0;j<N;j++)
for(k=0;k<N;k++)
sum+=a[i][j][k];
即可,因为这样最右边的索引变化得最快。
书上习题6.8解析:
以下中的三个函数,以不同的空间局部性程度,执行相同的操作。请对这些函数就空间局部性进行排序。解释你是如何得到排序结果的。
(a)structs数组:
#define N 1000 1 void
typedef struct {
int vel[3];
int acc[3];
} point;
point p[N];
(b)clear1函数:
void clear1(point *p, int n)
{
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < 3; j++)
p[i].vel[j] = 0;
for (j = 0; j < 3; j++)
p[i].acc[j] = 0;
}
}
(c)clear2函数:
void clear2(point *p, int n)
{
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < 3; j++) {
p[i].vel[j] = 0;
p[i].acc[j] = 0;
}
}
}
(d)clear3函数:
void clear3(point *p, int n)
{
int i, j;
for (j = 0; j < 3; j++) {
for (i = 0; i < n; i++) {
p[i].vel[j] = 0;
for (i = 0; i < n; i++)
p[i].acc[j] = 0;
}
}
解析:空间局部性:clear1>clear2>clear3。因为函数clear1以步长为1的引用模式访问数组,因此明显地具有最好的空间局部性;函数clear2依次扫描N个结构中的每一个,这是好的,但是在每个结构中,它以步长不为1的模式跳到下列相对于结构起始位置的偏移处:0、12、4、16、8、20,所以比clear1的要差;函数clear3不仅在每个结构中跳来跳去,而且还从结构跳到结构,所以比clear3和clear1都要差。
问题:存储器层次结构是什么样的?
- 如图所示:
- 由此我们可以解决以下题目:
题目1(来自ch6)下面说法正确的是()
A.存储层次结构中最小的缓存是寄存器
B.存储层次结构的中心思想是每一层都缓存来自较低一层的数据对象
C.L4主存可以看作是L5:本地磁盘的缓存
D.L4主存可以看作是L6的缓存
这道题答案是 A B C
问题:存储器层次结构层中基本缓存原理是什么?
问题:什么是缓存命中,什么是缓存不命中?
-
当程序需要第k+1层的某个数据对象d时,它首先在当前存储在第k层的一个块中查找d,如果d刚好缓存在第k层中,那么就是我们说的缓存命中。若第k层中没有缓存数据对象d,那么就是我们所说的缓存不命中。当发生缓存不命中时,第k层的缓存从第k+1层缓存中取出包含d的那个块,如果第k层的缓存已经满了,可能就会覆盖(替换或驱逐)现存的一个块。
替换或驱逐:覆盖一个现存的块的过程。
牺牲块:被驱逐的这个块。
替换策略:决定应该替换哪个块。 -
缓存不命中分为:
强制性不命中或冷不命中(冷缓存(空的缓存)类的不命中)
冲突不命中 -
ch6中的题目有关缓存的说法,正确的是(A C)
A.LRU策略指的是替换策略的缓存会选择最后被访问时间距现在最远的块
B.不同层之间以字节为传送单元来回复制
C.缓存不命时,决定哪个块是牺牲块由替换策略来控制
D.空缓存的不命中叫冲突不命中
通用的高速缓存存储器组织结构
- 高速缓存参数小结
书上习题6.10
问题:高速缓存确定一个请求是否命中,然后抽取出被请求的字的过程是什么?
- 分别为:组选择、行匹配、字抽取。
- 直接映射高速缓存中不命中时的行替换
如果缓存不命中,那么需要从存储器层次结构中的下一层取出被请求的块,然后将新的块存储在组索引位指示的组中的一个高速缓行中。
替换策略:用新取出的行替换当前的行。
有关写的问题
-
假设我们要写一个已经缓存了的字w写命中。在高速缓存更新了它的w的拷贝之后,想要更新w在层次结构中紧接着低一层中的拷贝,可以有多种选择:
直写(write-through):立即将w的高速缓存块写回到紧接着的低一层中。
写回(write-back),尽可能地推迟存储器更新,只有当替换算法要驱逐更新过的块时,才把它写到紧接着的低一层中。 -
另一个问题是如何处理写不命中。
写分配(write-allocate),加载相应的低一 层中的块到高速缓存中,然后更新这个高速缓存块。写分配试图利用写的空间局部性,但是缺点是每次不命中都会导致一个块从低一层传送到高速缓存。
非写分配(not-write-allocate),避开高速缓存,直接把这个字写到低一层中。直写高速缓存通常是非写分配的。写回高速缓存通常是写分配的。
一般而言,高速缓存越往下层,越可能采用写回而不是直写。
- 实际上,高速缓存既可以保存数据也可以保存指令。只保存指令的高速缓存称为i-cache,只保存程序数据的高速缓存称为d-cache。记保存数据又保存指令的高速缓存称为统一的高速缓存。
问题:如何编写出高速缓存友好代码?
一般高速缓存友好的基本方法:
让常见的情况运行的快。程序通常把大部分时间都花在少量的核心函数上,而这些函数通常把时间都花在了少量循环上。所以集中注意力在核心函数的少量循环上,而忽略其他部分。
在每一个循环内部缓存不命中的数量最小。
问题:高速缓存对程序性能的影响
在程序中利用局部性:
集中关注程序的内循环上,大部分计算和存储器访问都发生在这里。
通过按照数据对象存储在存储器中的顺序、以步长为1的来读数据,从而使得你程序中的 空间局部性最大。
一旦从存储器中读入了一个数据对象,就尽可能多地使用它,从而使得程序中的时间局部性最大。
课后作业
- 6.5
- 6.11
家庭作业:
ch6错题(部分在前面学习部分)
-
有关高速缓存的说法正确的是(ACD)
A.高速缓存的容量可以用C=SEB 来计算
B.高速缓存容量为2048,高速缓存结构为(32,8,8,32)
C.直接映射高速缓存要:组选择、行匹配、字抽取
D.当程序访问大小为2的幂的数组时,直接映射高带缓存中常发生冲突不命中
The following table gives the parameters for a number of different caches. For
each cache, determine the number of cache sets (S), tag bits (t), set index bits (s),and block offset bits (b)
A.第三行S为1
B.第一行t为24
C.第二行b为5
D.第三行s的值为0
正确答案: A C D
-
下面说法正确的是(ABCD)
A.CPU通过内存映射I/O向I/O设备发命令
B.DMA传送不需要CPU的干涉
C.SSD是一种基于闪存或Flash的存储技术
D.逻辑磁盘块的逻辑块号可以翻译成一个(盘面,磁道,扇区 )三元组。 -
有关计算机存储系统,下面说法正确的是(BCD)
A.程序具有良好的局部性表现在倾向于从存储器层次结构中的较低层次处访问数据,这样节省时间
B.存储层次涉用不同容量,成本,访问时间的存储设备
C.存储层次设计基于局部性原理
D.“存储山”是时间局部性和空间局部性的函数
结对及互评
-本周结对学习情况
同伴重点学习了第十章的教材内容,我复习了第六章的内容。
其他(感悟、思考等)
这周的任务是学习自己认为学习最差的一章,我重新学习了存储器,因为别的课也有讲到存储器,而我对他却掌握的不牢固,所以这周进行了深入学习。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 10/20 | |
第二周 | 57/100 | 1/1 | 20/30 | |
第三周 | 100/100 | 1/1 | 30/30 | |
第四周 | 233/200 | 1/1 | 20/20 | |
第五周 | 267/200 | 1/1 | 20/20 | |
第六周 | 220/2000 | 3/1 | 40/20 | |
第七周 | 362/300 | 1/1 | 30/30 | |
第八周 | 3000/300 | 3/1 | 45/30 | |
第九周 | 596/300 | 3/1 | 45/30 | |
第十周 | 154/300 | 3/1 | 40/30 | |
第十一周 | 274/300 | 3/1 | 40/30 | |
第十二周 | 343/300 | 3/1 | 44/30 | |
第十三周 | 938/300 | 1/1 | 35/30 | |
第十四周 | 254/300 | 1/1 | 40/30 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
参考:软件工程软件的估计为什么这么难,软件工程 估计方法
- 计划学习时间:25小时
- 实际学习时间:20小时
- 改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)
参考资料
- 《深入理解计算机系统V3》学习指导
- ...