20145324 《信息安全系统设计基础》第七周学习总结
教材学习内容总结
存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构
随机访问存储器(两类)
1.静态RAM
SRAM的特点:存储器单元具有双稳态特性,只要有电就会永远保持它的值,干扰消除时,电路就会恢复到稳定值
2.动态RAM
DRAM的特点:每一位的存储是对一个电容的充电,当电容的电压被扰乱之后,就永远不会恢复
DRAM存储不稳定的应对机制:
①存储器系统必须周期性地通过读出,或者重写来刷新存储器的每一位
②使用纠错码
SRAM和DRAM的区别:
①只要有电,SRAM就会保持不变,而DRAM需要不断刷新
②SRAM的存取比DRAM快
③SRAM对光和电噪声等干扰不敏感
④SRAM比DRAM需要使用更多的晶体管,所以更昂贵
传统的DRAM:
行地址i:RAS
列地址j:CAS
DRAM组织成二位阵列降低芯片上地址引脚的数量,但增加了访问时间
DRAM芯片包装在存储器模块中插入到主板的扩展槽上
存储器模块分类:
①168个引脚的双列直插存储器模块,以64位为块传送数据
②72个引脚的单列直插存储器模块,以32位为块传送数据
访问主存:
读事务:从主存传送数据到CPU
写事务:从CPU传送数据到主存
总线:一组并行的导线,能携带地址、数据和控制信号(两个以上的设备也能共享同一根总线)
磁盘存储
磁盘构造:
由盘片构成
表面:每个盘片有两个表面
主轴:盘片中央,可旋转
磁道:同心圆
扇区:每个磁道被划分为一组扇区
数据位:每个扇区包含相等数量的数据位,通常为512字节
间隙:存储用来标识扇区的格式化位
柱面:所有盘片表面上到主轴中心的距离相等的磁道的集合
磁盘驱动器→磁盘→旋转磁盘(一样的)
磁盘容量:
记录密度:磁道一英寸的段中可以放入的位数
磁道密度:从盘片中心出发半径上一英寸的段内可以有的磁道数
面密度:记录密度与磁道密度的乘积
记录区:柱面的集合被分割成不相交的子集合(多区记录技术)
计算公式:
磁盘容量=字节数/扇区x平均磁盘数/磁道x磁道数/表面x表面数/盘片x盘片数/磁盘
1GB=10^9字节
磁盘操作:
读写头:磁盘用读写头来读写存储在磁性表面的位
寻道:通过沿着半径轴前后移动的这个传动臂,驱动器可以将读写头定位在盘片上的任何磁道上在任何时刻,所有的读写头都位于同一个柱面上
读写头碰撞:读写头碰到了阻碍,读写头就会停下来
磁盘以扇区大小的块来读写数据:
寻道时间:移动传送臂所需要的时间
旋转时间:一旦读写头定位你到了期望的磁道,驱动器等待目标扇区的第一个位旋转到读写头下
Tmax rotation=1/RPM x 60secs/1min
Tavg rotation=0.5Tmax rotation
传送时间:一个扇区的传送时间依赖于旋转速度和每条磁道的扇区数目
Tavg transfer= 1/RPM x 1/(平均扇区数/磁道) x 60s/1min
访问时间=Tavg rotation+Tavg transfer+Tavg seek
逻辑磁盘块
磁盘控制器:磁盘中一个小的硬件、固件设备,维护着逻辑块号和实际物理磁盘扇区之间的映射关系
连接到I/O设备:
外围设备互连(PCI):连接到CPU和主存 I/O总线的分类:
通用串行总线(USB):包括键盘、鼠标、调制解调器、数码相机、游戏操纵杆、打印机、外部磁盘驱动器和固态硬盘等
图形卡(适配器):负责代表CPU在显示器上画像素
主机总线适配器:使用特别的主机总线接口定义的通信协议
固态硬盘(SSD):
一个SSD包由一个或多个闪存芯片和闪存翻译层组成
随机读和写的性能差别是由底层闪存基本属性决定的
读写很慢的原因:
①擦除块需要相对较长的时间
②写操作试图修改一个包含已经有数据的页p,那么这个二块中的所有带有用数据的页都必须被拷贝到一个新(擦除过的)块,然后才能进行对页p的写
优点:随机访问时间比旋转磁盘块,能耗更低,更结实。
缺点:闪存翻译层中的平均磨损逻辑试图通过将擦除平均分布在所有的块上来最大化每个块的寿命
局部性
倾向于引用邻近与其他最近引用过的数据项的数据项,或者最近引用过的数据项本身,这种倾向性,被称为局部性原理。
时间局部性:被引用过一次的存储器位置很可能在不远的将来再被多次引用
空间局部性:一个存储器位置被引用了一次,那么程序很可能在不远的将来引用附近的一个存储器位置
评价一个程序中局部性的简单原则:
①重复引用同一个变量的程序有良好的时间局部性
②对于具有步长为k的引用模式的程序,步长越小,空间局部性越好
③对于取指令来说,循环有好的时间和空间局部性,循环体越小,循环迭代次数越多,局部性越好
存储器层次结构
存储器层次结构中的缓存
高速缓存:是一个小而快速地存储设备,它作为存储在更大、也更慢的设备中的数据对象的缓冲区域cash
缓存:使用高速缓存的过程cashing
块:第k+1层的存储器被划分成连续的对象片,每个块有一个唯一的地址或名字,使之区别于其他的块
传送单元:数据总是以块大小为传送单元
缓存命中:
当程序需要第k+1层的某个数据对象d时,它首先在当前存储在第k层的一个块中查找d,如果d刚好缓存在第k层中,那么就是我们说的缓存命中。
缓存不命中:若第k层中没有缓存数据对象d,那么就是我们所说的缓存不命中
替换或驱逐:覆盖一个现存的块的过程
牺牲块:被驱逐的这个块
替换策略:决定应该替换哪个块
缓存不命中的种类:
冷缓存(强制不命中冷不命中):一个空的缓存,对于有效位为0的情况
放置策略:发生了不命中,第k层的缓存就必须执行某个放置策略,确定把它从第k+1层中取出来的块放在哪里
冲突不命中:限制性的放置策略会引起的一种不命中
工作集:程序是按照一系列阶段来运行的,每个阶段访问缓存块的某个相对稳定不变的集合
容量不命中:当工作集的大小超过缓存的大小时
缓存管理:某个东西要将缓存划分成块,在不同的层之间传送块,判定是命中还是不命中,并处理它们
高速缓存存储器
通用的高速缓存存储器结构:
每个存储器地址有m位,形成M=2^m个不同的地址
高速缓存组:S=2^s个高速缓存组的数组
高速缓存行:B=2^b字节的数据块组成
有效位:指明这个行是否包含有意义的信息
标记位:唯一地标识存储在这个高速缓存行中的块,t=m -(b+s)
有关写的问题
直写:立即将w的高速缓存块写回到紧接着的第一层中 ,但是每次写都会引起总线流量
写回:只有当替换算法要驱逐更新过的块时,才能把它写到紧接着的低一层中,由于局部性,写回能显著减少总线流量,但是增加了复杂性。
高速缓存必须为每个高速缓存行维护一个额外的修改位,表明这个高速缓存块是否被修改过
写分配:加载相应的低一层中的块到高速缓存中,然后更新这个高速缓存块,但是每次不命中都会导致一个块从低一层传送到高速缓存
非写分配:避开高速缓存,直接把这个字写到低一层中
高速缓存参数的性能影响
不命中率:不命中数量/引用数量
命中率:1-不命中率
命中时间:组选择、行确认和字选择的时间
不命中处罚:不命中需要的额外的时间
代码驱动的程序设计学习
git的安装测试
1.输入git,检查是否安装
2.如未安装输入sudo apt-get install git安装
3.安装完后输入git --version检查是否安装成功
4.安装成功后开始配置git
5.输入git init
6.git config --global user.name "SJZGM10(用户民)"
7.git config --global user.eamil "suju1015463462@vip.qq.com(邮箱地址)"
8.配置完成后创建公钥
9.输入ssh-keygen -C 'suju1015463462@vip.qq.com(邮箱地址)' -t rsa
10.创建完公钥后上传公钥
11.输入cd ~/.ssh
12.输入gedit id_rsa.pub
13.复制公钥,并粘贴到http://git.oschina.net/profile/sshkeys
14.完成后输入ssh -T git@git.oschina.net检查是否通畅
15.建立自己的代码文件夹
16.输入mkdir 20145324(可以用自己的学号)
17.输入cd 20145324进入文件夹
18.输入mkdir 20145324CSAPP2E(用于保存本课代码)
19.输入cd 20145324CSAPP2E进入文件夹
20.输入mkdir src(用于存放源代码文件)
21.输入mkdir include(用于存放头文件)
22.输入mkdir bin(用于存放编译后的目标文件、可执行文件等)
23.输入mkdir lib(存放项目所需的静态库、动态(共享)库)
24.输入mkdir res(存放项目所需的图标、声音、图片等资源)
25.输入mkdir docs(存放项目相关的参考资料、帮助文档)
26.输入touch README Makefile 新建README(对项目的简要介绍:licence、功能、编译环境等,详细的要在docs下有帮助文档)和Makefile(实现项目编译自动化)连个文件
27.输入cd src进入文件夹,并创建12章相应的文件夹
28.输入mkdir 01intro
29.输入mkdir 02data
30.输入mkdir 03asm
31.输入mkdir 04arch
32.输入mkdir 05perf
33.输入mkdir 06mem
34.输入mkdir 07link
35.输入mkdir 08ecf
36.输入mkdir 09vm
37.输入mkdir 10io
38.输入mkdir 11netp
39.输入mkdir 12conc
40.完成后输入cd ..返回上一级
41.输入tree 查看一下刚刚建的结构目录(没有安装tree再输入tree后按照提示安装即可)
42.开始使用git传代码
43.输入ls查看一下
44.输入vim src/01intro/hello.c
45.输入i进入编辑模式
46.输入代码
-#include <stdio.h>
int main()
{
printf("hello 20145324
");
}
47.按Esc键退出编辑,并输入:wq保存代码并退出vim
48.输入gcc src/01intro/hello.c -o bin/hello编译程序
49.输入./bin/hello执行程序
50.上传代码前配置一下
51.输入git init(好像可以不用输这个)
52.输入ls显示当前目录内容
53.输入git config user.name "SJZGM10"
54.输入git config user.email "suju1015463462@vip.qq.com"
55.输入config user.core.edit vim
56.输入git config --list查看配置
57.进入开源中国新建一个项目CSAPP2E
58.输入git remote add origin https://git.oschina.net/SJZGM10(用户民)/CSAPP2E(项目名称).git
59.输入git pull origin master下载README.md(不进行这一步后面可能会存在git push时有error:failed to push some refs to 'https://git.oschina.net/SJZGM10/CSAPP2E.git')
60.输入git add .添加代码
61.输入git commit -m "gitxuexi"给代码添加注释
62.输入git push origin master
63.输入SJZGM10(用户民)回车
63.输入密码回车
64.上传成功
65.通过shell脚本来简化编译运行程序
66.输入compile.sh
67.输入i编辑脚本
68.输入脚本:
-#! /bin/sh
-#compile ch01 hello world program (注释)
gcc ./src/01intro/hello.c -o ./bin/hello
./bin/hello
69.按Esc退出输入,并输入:wq保存退出脚本编辑
70.输入chmod +x compile.sh给脚本添加可执行权限
71.输入./compile.sh
77.输入ls显示当前目录内容
78.使用.gitignore文件把不想纳入git管理的文件、文件夹排除掉(bin文件夹)
79.输入vi .gitignore
80.输入i开始编辑
81.输入内容:
-# ignore bin directory
bin/
82.按Esc退出输入,并输入:wq保存退出编辑
使用gdb辅助学习
1.输入sudo apt-get install cgdb安装替代调试工具
2.输入vi src/02data/testcast.c建立示例
3.按i输入代码:
4.按Esc退出输入,并输入:wq保存并退出编辑
5.输入vi compile.sh编辑脚本
6.输入i编辑脚本
7.脚本内容:
-# ch02 p44 test casting
gcc -g ./src/02data/testcast.c -o ./bin/testcast
./bin/testcast
8.按Esc退出输入,并输入:wq保存并退出编辑
9.输入./compile.sh
10.输入cgdb bin/testcast进行调试
思考题:使用compile.sh有什么问题?
答:在操作过程中我觉得使用compile.sh很方便编译,写好了几个代码,可以一起写脚本再编译,但是运行程序的时候就不是很好找到结果,如果有问题的话,修改起来也很麻烦
代码调试中的问题和解决过程
在运行教材p402的代码时出现下图情况
再教材给出的代码上加了main函数还是无法运行,说给的实参太少
仔细看上图自己写的代码,发现main函数里没有写参数,修改后即可编译通过
本周代码托管截图
本周根据代码驱动的程序设计学习重新建立了项目
其他(感悟、思考等,可选)
多动手操作,百度,很多问题自己就可以解决了
学习进度条
博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|
目标 | 30篇 | 400小时 | |
第零周 | 1/1 | 20/20 | |
第一周 | 1/2 | 20/40 | |
第二周 | 1/3 | 20/60 | |
第三周 | 1/4 | 20/80 | |
第四周 | 1/5 | 20/100 | |
第五周 | 1/6 | 20/120 | |
第六周 | 1/7 | 20/140 | |
第七周 | 1/8 | 20/160 |