2017-2018-1 20155215 《信息安全系统设计基础》第9周学习总结
2017-2018-1 20155215 《信息安全系统设计基础》第9周学习总结
教材学习内容总结
目标内容:
- 了解常见的存储技术(RAM、ROM、磁盘、固态硬盘等)
- 理解局部性原理
- 理解缓存思想
- 理解局部性原理和缓存思想在存储层次结构中的应用
- 高速缓存的原理和应用
-
第六章:
-
存储器层次结构:
-
存储器系统:具有不同容量、成本和访问时间的存储设备的层次结构
-
高速缓存存储器设备:主存中的数据和指令的缓冲区域
-
随机访问存储器:
-
RAM分为静态和动态两类
-
静态SRAM比动态DRAM快
- 静态RAM:将每个位存储在一个双稳态的存储单元里
- 动态RAM:将每个位存储为对一个电容的充电
-
传统的DRAM:单元被分成d个超单元,每个超单元由w个DRAM单元组成
-
增强的DRAM:快页模式DRAM、扩展数据输出DRAM、同步DRAM、双倍数据速率同步DRAM、Rambus DRAM、视频RAM
-
磁盘存储:
-
磁盘构造:由盘片构成,每个盘片有表面,主轴,磁道,扇区
-
磁盘容量:容量由记录密度、磁道密度、面密度决定
-
磁盘操作:访问时间有三个主要部分寻道时间、旋转时间和传送时间
-
逻辑磁盘块:磁盘控制器维持着逻辑块号与实际的磁盘扇区之间的映射关系
-
访问磁盘:CPU使用存储器映射I/O技术向I/O设备发出命令
-
SSD随机访问时间比旋转磁盘快
-
局部性:
-
局部性原理:计算机程序倾向于引用邻近于其它最近引用过的数据项的数据项,或者最近引用过的数据项本身的倾向性
- 时间局部性:被引用过一次的存储器位置很可能在不远的将来被再次引用 - 空间局限性:如果一个存储器被引用了,在不远的将来很可能会引用附近的一个存储器位置
-
存储器层次结构
- 缓存命中:程序需要的数据块恰好缓存在第k层
- 缓存不命中:第k层中没有缓存需要的数据,从第k+1层读取一个数据块可能会替换(驱逐)一个现存的块
-
缓存不命中种类:冷不命中、强制性不命中(冷缓存)、冲突不命中(限制性的放置策略)、容量不命中(工作集的大小超过缓存的大小)
-
缓存管理:编译器管理寄存器文件,缓存结构层次的最高层
-
通用的高速缓存存储器结构
-
写问题
- 写命中
- 直写:立即将w的高速缓存块写回到紧接着的低一层中
- 写回:尽可能的推迟存储器更新,只有当替换算法要驱逐更新过的块时,才把它写回紧接着的低一层中
- 写不命中
- 写分配:加载相应的第一层中的块到高速缓存中,然后更新这个高速缓存块
- 非写分配:避开高速缓存,直接把这个字写到第一层中
-
一个真实的高速缓存层次结构的解剖
- i-cache:只保存指令的高速缓存,通常只读
- d-cache:只保存程序数据的高速缓存
-
统一的高速缓存:即保存指令又保存程序数据
-
高速缓存参数的性能影响
教材学习中的问题和解决过程
- 问题1:练习题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][i];
}
}
}
return sum;
}
我觉得我还是没有理解题目是如何改变循环次序的。
这是答案代码:
int sumarray3d(int a[N][N][N])
{
int i,j,k,sum=0;
for(k=0;k<N;k++){
for(i=0;i<N;i++){
for(j=0;j<N;j++){
sum+=a[k][i][i];
}
}
}
return sum;
}
- 问题1解决方案:
我看了书上的解析,说是
改变循环次序,使得最右边的次序变化的最快。
就可以达到目的,但是我发现我没有理解这一点。
我重新阅读了书上的6.2局部性一节,我认识到,多维数组的存储是按照行顺序存储的,所以只有按照相应的编号,1,2,3,4...读取的才是步长为1的,也就是说要改变循环顺序,按照数组被存储的行优先顺序来,否则,就不是步长为1.
代码调试中的问题和解决过程
- 问题1:暂无
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
-
Linux信号处理说法正确的是()
A .
可以用signal()处理信号
B .
一个信号最多只能被接收一次
C .
kill(1)用来杀死进程
D .
kill(1)用来发送信号
E .
可以通过键盘发送信号
F .
可以用sigaction()处理信号
正确答案: A B D E F 你的答案: B D E F -
有关exec系列函数,下面说法正确的是()
A .
可以用char[][] 来传递argv
B .
进程调用了exec系列函数后,pid会变
C .
进程调用了exec系列函数后,代码会改变。
D .
system()和exec系列等价。
E .
exec系列函数中带e的要传入环境变量参数
F .
exec系列函数中带v的要传入环境变量参数
正确答案: C E 你的答案: A C E -
关于代码 int main(){} 说法正确的是()
A .
返回值是0
B .
返回值不确定
C .
会调用exit(0)
D .
返回值大于0
E .
上面代码运行完,在命令行中运行echo $? 的值是0
正确答案: A C E 你的答案: A E -
Unix/Linux中通过调用( )可以获取子进程PID。
A .
getpid()
B .
getppid()
C .
getcpid()
D .
fork()
正确答案: D 你的答案: A -
有关异常,下面说法正确的是()
A .
系统中的异常由异常名唯一确定
B .
异常表中存放的是异常处理程序
C .
异常表的起始地址存放在异常表基址寄存器中
D .
异常处理程序运行在内核模式下
正确答案: C D 你的答案: A C D -
进程上下文包括程序的( )
A .
代码和数据
B .
栈
C .
通用寄存器中的内容
D .
程序计数器
E .
环境变量
F .
打开的文件描述符的集合
正确答案: A B C D E F 你的答案: B C D F -
Linux中,信号(Signal)是一种()异常控制流。
A .
硬件层
B .
操作系统层
C .
用户层
D .
网络层
正确答案: C 你的答案: B
结对及互评
点评模板:
- 博客中值得学习的或问题:
- 5232同学进行了在课本的学习部分记录很丰富。
本周结对学习情况
- [20155232](http://www.cnblogs.com/lsqsjsj/p/7860398.html)
其他(感悟、思考等,可选)
感觉这周的实验难度很大,虽然说是每个人一组,但是其实实验过程中还是有很多和我之前的搭档一起完成的部分。感觉自己在SOCKET编程上还有很多需要提高的,虽然在《网络编程基础》中学习了很多,老师讲的也很详细,但是书到用时方恨少,而且linux环境和java环境也是不同的,仍然有很多地方需要我去学习。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1300 | 2/9 | 30/90 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)