2017-2018-1 20155314 《信息安全系统设计基础》第13周学习总结
学习目标
找出全书你认为最重要的一章,深入重新学习一下,要求(期末占10分):
- 完成这一章所有习题
- 详细总结本章要点
- 给你的结对学习搭档讲解你的总结并获取反馈
第6章学习要点:
- 了解常见的存储技术(RAM、ROM、磁盘、固态硬盘等)
- 理解局部性原理
- 理解缓存思想
- 理解局部性原理和缓存思想在存储层次结构中的应用
- 高速缓存的原理和应用
本章要点详细总结
第6章 存储器层次结构
6.1 存储技术
RAM有SRAM和DRAM,特点和应用
磁盘是重点,涉及到后面的i/o和文件系统
磁盘结构、磁盘驱动器
逻辑磁盘块:这个很重要,内存可以看成字节数组、磁盘可以看成块数组
6.1.1 随机访问存储器
- 随机访问存储器(RAM)(易失性存储器)
-
分为两类
- 静态RAM(SRAM)
- 动态RAM(DRAM)
-
SRAM比DRAM更快,但更贵
-
传统的DRAM
-
内存模块(MM)
-
增强的DRAM
- 快页模式DRAM(FPM DRAM)
- 扩展数据输出DRAM(EDO DRAM)
- 同步DRAM(SDRAM)
- 双倍数据速率同步DRAM(DDR SDRAM)
- 视频RAM(VRAM)
-
- 只读存储器(ROM)(非易失性存储器)
- 可编程ROM(PROM)
- 可擦写可编程ROM(EPROM)
- 电子可擦除PROM(EEPROM)
- 闪存(FLASH)
- 固态硬盘(SSD)
- 访问主存
- CPU chip:CPU芯片
- Register file:寄存器文件
- ALU:算术逻辑单元
- Bus interface:总线接口
- System bus:系统总线
- I/O bridge:I/O桥
- Memory bus:内存总线
- Main memory:主存
练习题6.1
In the following, let r be the number of rows in a DRAM array, c the number of columns, br the number of bits needed to address the rows, and bc the number of bits needed to address the columns. For each of the following DRAMs, deter- mine the power-of-two array dimensions that minimize max(br, bc), the maximum number of bits needed to address the rows or columns of the array.(接下来,设r表示一个DRAM阵列中的行数,c表示列数,br表示行寻址所需的位数,bc表示列寻址所需的位数。对于下面每个DRAM,确定2的幂数的阵列维数,使得max(br,bc)最小,max(br,bc)是对阵列的行或列寻址所需的位数中较大的值。)
我的解答
组织 | r | c | br | bc | max(br,bc) |
---|---|---|---|---|---|
16×1 | 4 | 4 | 2 | 2 | 2 |
16×4 | 4 | 4 | 2 | 2 | 2 |
128×8 | 16 | 8 | 4 | 3 | 4 |
512×4 | 32 | 16 | 5 | 4 | 5 |
1024×4 | 32 | 32 | 5 | 5 | 5 |
6.1.2 磁盘存储
-
磁盘构造
- 磁盘(disk):由一个或多个叠放在一起的盘片组成,被封装在一个密封的包装里。整个装置通常被称为磁盘驱动器,简称为磁盘(又称旋转磁盘,以区别基于闪存的固态硬盘(SSD没有移动部分))
- 盘片(platter):磁盘由盘片构成,每个盘片有两面或者称为表面,表面覆盖着磁性记录材料
- 磁道(track):每个表面由一组称为磁道的同心圆组成
- 扇区(sector):每个磁道被划分为一组扇区
- 间隙(gap):扇区之间由一些间隙分隔开
- 柱面(cylinder)
- 磁盘(disk):由一个或多个叠放在一起的盘片组成,被封装在一个密封的包装里。整个装置通常被称为磁盘驱动器,简称为磁盘(又称旋转磁盘,以区别基于闪存的固态硬盘(SSD没有移动部分))
-
磁盘容量
- 记录密度(recording density)(位/英寸)
- 磁道密度(track density)(道/英寸)
- 面密度(areal density)(位/平方英寸)
计算公式:
练习题6.2
What is the capacity of a disk with two platters, 10,000 cylinders, an average of 400 sectors per track, and 512 bytes per sector?(计算这样一个磁盘的容量,它有2个盘片,10000个柱面,每条磁道平均有400个扇区,而每个扇区有512个字节。)
我的解答
这道题比较简单,直接套公式即可:
磁盘容量=(512字节/扇区)×(400扇区数/track)×(10000磁道数/表面)×(2表面数/盘片)×(2盘片数/磁盘)=8192000000字节=8.192GB
-
磁盘操作
- 磁盘以扇区大小的块来读写数据
- 访问时间
- 寻道时间
- 旋转时间
- 传送时间!
-
逻辑磁盘块
-
连接I/O设备
- 总线
- 数据总线
- 控制总线
- 地址总线
- 系统总线
- 存储总线
- I/O总线
- 连接到总线的设备
- 通用串行总线(USB)
- 图形卡(或适配器)
- 主机总线适配器
- 其他设备(如网络适配器)
- 总线
-
访问磁盘
6.1.3 固态硬盘
<img src="http://images2017.cnblogs.com/blog/1071508/201712/1071508-20171217175127749-1055827420.png" width="90%" />
6.1.4 存储技术趋势
- 不同的存储技术有不同的价格和性能折中
- 不同存储技术的价格和性能属性以截然不同的速率变化着
6.2 局部性
- 局部性原理
- 两种不同的形式
- 时间局部性
- 空间局部性
- 有良好局部性的程序比局部性差的程序运行得更快
6.2.1 对程序数据引用的局部性
- 步长为1的引用模式:顺序访问一个向量每个元素
- 步长为k的引用模式:一个连续向量中每隔k个元素进行访问
- 随着步长的增加,空间局部性下降
6.2.2 取指令的局部性
6.2.3 局部性小结
- 重复引用相同变量的程序有良好的时间局部性
- 对于:
- 具有步长为k的引用模式的程序,步长越小,空间局部性越好
- 具有步长为1的引用模式的程序有良好的空间局部性
- 在内存中以大步长跳来跳去的程序的空间局部性会很差
- 对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好
练习题6.7
Permute the loops in the following function so that it scans the three-dimensional array a with a stride-1 reference pattern.(改变下面函数中循环的顺序,使得它以步长为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;
}
我的解答
sum += a[k][i][j];
表明步长为N*N,为了创建一个步长为1的引用模式,必须改变循环的次序,使得最右边的索引变化得最快:
int sumarray3d(int a[N][N][N])
{
int i, j, k, sum = 0;
for (k = 0; i < N; i++) {
for (i = 0; j < N; j++) {
for (j = 0; k < N; k++) {
sum += a[k][i][j];
}
}
}
return sum;
}
练习题6.8
The three functions in Figure 6.20 perform the same operation with varying de- grees of spatial locality. Rank-order the functions with respect to the spatial local- ity enjoyed by each. Explain how you arrived at your ranking.(图6-20中的三个函数,以不同的空间局部性程度,执行相同的操作。请对这些函数就空间局部性进行排序。解释你是如何得到排序结果的。)
(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不仅在每个结构中跳来跳去,而且还从结构跳到结构,所以比clear2和clear1都要差。
6.3 存储器层次结构
存储层次结构:系统观(1+1>2)(举一反三:对称不对称加密形成的混合加密系统,混合动力汽车...)
中心思想:每层存储设备都是下一层的“缓存”
对照p408的表理解
- 存储技术
- 计算机软件
- 典型的存储器层次结构
6.3.1 存储器层次结构中的缓存
- 高速缓存:是一个小而快速的存储设备,作为存储在更大、也更慢的设备中的数据对象的缓冲区域
- 缓存:使用高速缓存的过程
- 存储器层级结构的中心思想:层次结构中的每一层都缓存来自较低一层的数据对象
- 数据总是以块大小为传送单元在第k层和第k+1层之间来回复制的
- 缓存命中
- 缓存不命中
- 概念:第k层中没有缓存数据对象d。当发生缓存不命中时,第k层的缓存从第k+1层缓存中取出包含d的那个块,如果第k层的缓存已经满了,可能就会覆盖(替换或驱逐)现存的一个块
- 牺牲块:被驱逐的块
- 替换策略:决定该替换哪个块
- 随机替换策略:随机选择一个牺牲块
- 最近最少被使用替换策略(LRU):选择最后被访问的、时间距现在最远的块
- 种类
- 强制性不命中或冷不命中(冷缓存(空的缓存)类的不命中)
- 冲突不命中
- 缓存管理
6.3.2 存储器层次结构概念小结
- 利用时间局部性
- 利用空间局部性
6.4 高速缓存存储器
#####6.4.1 通用的高速缓存存储器组织结构高速缓存结构(S,E,B,m):高速缓存组、高速缓存行、块
映射
命中
缓存管理
- 高速缓存参数小结
练习题6.9
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).(下表给出了几个不同的高速缓存的参数。确定每个高速缓存的高速缓存组数(S)、标记位数(t)、组索引位数(s)以及块偏移位数(b)。)
我的解答
高速缓存 | m | C | B | E | S | t | s | b |
---|---|---|---|---|---|---|---|---|
1. | 32 | 1024 | 4 | 1 | 256 | 22 | 8 | 2 |
2. | 32 | 1024 | 8 | 4 | 32 | 24 | 5 | 3 |
3. | 32 | 1024 | 32 | 32 | 1 | 27 | 0 | 5 |
6.4.2 直接映射高速缓存
#####6.4.3 组相联高速缓存 #####6.4.4 全相联高速缓存 #####6.4.5 有关写的问题 #####6.4.6 一个真实的高速缓存层次结构的解剖 #####6.4.7 高速缓存参数的性能影响 ####6.5 编写高速缓存友好的代码 ####6.6 综合:高速缓存对程序性能的影响 #####6.6.1 存储器山 #####6.6.2 重新排列循环以提高空间局部性 #####6.6.3 在程序中利用局部性本章考试错题总结(CH06)
-
有关高速缓存的说法正确的是()
A. 高速缓存的容量可以用C=SEB来计算
B. 高速缓存容量为2048,高速缓存结构为( 32 ,8,8,32)
C. 直接映射高速缓存要:组选择、行匹配、字抽取
D. 当程序访问大小为2的幂的数组时,直接映射高带缓存中常发生冲突不命中
【错选】A B C
【答案】A C D
-
The following table gives the parameters for a number of di erent caches. For each cache, determine the number of cache sets (S), tag bits (t), set index bits (s), and block o set bits (b)
A. 第三行S为1
B. 第一行t为24
C. 第二行b为5
D. 第三行s的值为0
【错选】A D
【答案】A C D
【解析】p427
-
下面说法正确的是()
A. CPU通过内存映射I/O向I/O设备发命令
B. DMA传送不需要CPU的干涉
C. SSD是一种基于闪存或Flash的存储技术
D. 逻辑磁盘块的逻辑块号可以翻译成一个(盘面,磁道,扇区 )三元组。
【错选】B C D
【答案】A B C D
【解析】p413 411
-
有关磁盘操作,说法正确的是()
A. 对磁盘扇区的访问时间包括三个部分中,传送时间最小。
B. 磁盘以字节为单位读写数据
C. 磁盘以扇区为单位读写数据
D. 读写头总处于同一柱面
【错选】A C D
【答案】A C
【解析】p409
上周考试错题总结
实验测试
-
实验4,Linux中通过把设备抽象成文件来简化操作的,我们可以用open/read/write/close来像访问文件一样访问设备, 这里需要一个结构提供设备驱动程序接口,这个结构是()
A. struct file
B. struct inode
C. struct file_operations
D. struct UTMP
【错选】B
【答案】C
【解析】在系统内部,I/O设备的存取操作通过特定的入口点来进行,而这组特定的入口点恰恰是由设备驱动程序提供的。通常这组设备驱动程序接口是由结构file_operations结构体向系统说明的,它定义在include/linux/fs.h中
-
实验1中使用mount命令时,会涉及到()的修改。
A. /etc/fstab
B. /etc/hosts
C. /etc/passwd
D. /etc/exports
【错选】B
【答案】D
【解析】nfs服务器的配置,配置文件/etc/exports:
ro 该主机对该共享目录有只读权限
rw 该主机对该共享目录有读写权限
root_squash 客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户
no_root_squash 客户机用root访问该共享文件夹时,不映射root用户
all_squash 客户机上的任何用户访问该共享目录时都映射成匿名用户
anonuid 将客户机上的用户映射成指定的本地用户ID的用户
anongid 将客户机上的用户映射成属于指定的本地用户组ID
sync 资料同步写入到内存与硬盘中
async 资料会先暂存于内存中,而非直接写入硬盘
insecure 允许从这台机器过来的非授权访问
-
实验1中需要交叉编译,因为程序要在ARM实验箱的Linux中执行,交叉编译是在ARM实验箱中完成的,hello程序也是在ARM实验箱中执行的。
A. 正确
B. 错误
【错选】A
【答案】B
【解析】交叉编译在UBuntu虚拟机中完成,执行是在ARM实验箱的Linux中完成。
-
实验1:mount -t nfs -o nolock 192.168.0.56:/root/share /host,其中的IP是()的IP
A. Windows 宿主机
B. Ubuntu虚拟机
C. ARM实验箱
D. 以上都不对
【错选】A
【答案】B
【解析】嵌入式开发中,通过nfs系统把Ubuntu虚拟机的一个目录映射成ARM实验箱的Linux系统的一个目录进行调试是一个惯用法,程序调试没有问题了,再烧写到实验箱的Linux的系统中,这样实验箱重启了程序也可以用了。
-
实验1中Windows宿主机,Ubuntu虚拟机,ARM实验箱三者IP要在同一网段,操作中是根据()的IP来确定网段的。
A. Windows 宿主机
B. Ubuntu虚拟机
C. ARM实验箱
D. 以上都可以
【错选】A
【答案】C
【解析】ARM实验箱的IP修改要重新烧录Linux系统,Windows 宿主机,Ubuntu虚拟机的IP比较容易修改,所以我们在超级终端中通过ifconfig查看ARM实验箱的IP,把Windows 宿主机,Ubuntu虚拟机的IP改成和ARM实验箱同一个网段。
结对学习中的问题和解决过程
学习搭档(20155323)无法打开Y86-64模拟器界面
解决方法
这是Y86-64模拟器的Makefile中配置GUI相关路径错误导致的,解决方法是将两个GUI路径分别设置为TKLIBS=-L/usr/lib -ltk8.5 -ltcl8.5
和TKINC=-I/usr/include/tcl8.5
即可,如下图:
成功打开Y86-64模拟器:
代码托管
本周结对学习情况
- 20155323
- 结对学习内容
- 教材第6章 存储器层次结构
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:5小时
-
实际学习时间:2小时