2017-2018-1 20155219 《信息安全系统设计基础》第九周学习总结
教材学习内容总结
1.存储技术
三种常见存储技术:RAM/ROM/磁盘
(1)随机访问存储器RAM
两类:静态RAM(SRAM)和动态RAM(DRAM)
静态RAM(SRAM)比动态RAM(DRAM)更快,但也贵很多。
静态RAM
SRAM将每个位存储在一个双稳态的存储器单元里,每个单元是用一个六晶体管电路来实现的。
这个电路的一个属性:它可以无限制地保持在两个不同的电压配置或状态之一。其他任何状态都是不稳定的。
-
特点:由于SRAM的双稳态特性,只要有电,它就会永远地保持它的值,即使有干扰,如电子噪音,来扰乱电压,当干扰消除,电路也能恢复到稳定值。
-
应用:SRAM用来作为高速缓存存储器,即可以在CPU芯片上,也可以在片下。
动态DRAM
DRAM将每个位存储为对电容的充电。电容约为30×10-15F。 -
特点:对干扰特别敏感,当电容的电压被扰乱之后,它就永远不会恢复了。暴露在光线下会导致电容电压改变。
-
应用:DRAM用来作为主存以及图形系统的帧缓冲区。
(2)非易失性存储器(ROM)
ROM的区分:能被重编程的次数和对他们进行重编程所用的机制。
- PROM:只能被编程一次。
- EPROM:可擦写可编程ROM,紫外线光照清除单元内容,可擦写次数数量级1000。
- E2PROM:电子可擦除PROM,可以直接在印制电路卡上编程,可擦写次数数量级10^5。
- FLASH:闪存,基于EEPROM。(固态硬盘SSD基于闪存)
存储在ROM设备中的程序通常称为固件。
(3)访问主存
- 读事务:从主存传送数据到CPU。
- 写事务:从CPU传送数据到主存。
- 总线:一组并行的导线,能携带地址、数据的控制信号。
数据总线、控制总线、地址总线
读事务语句
movl A,%eax
- CPU将地址A放到存储器总线
- 主存从总线读出A,接收字x,然后将x放到总线上
- CPU从总线读出字x,并将它copy到寄存器eax中。
- 写事务语句
movl %eax,A
- CPU将地址A放到存储器总线,主存读出这个地址,等待接收数据字
- CPU将数据字y放到总路上
- 主存从总线读数据字y,并将它存储在地址A。
(4)磁盘存储
- 磁盘构造
- 由盘片构成,每个盘片有两面或者称为表面,表面覆盖着磁性记录材料。盘片中央有一个可以旋转的主轴,使得盘片以固定的旋转速率旋转,通常是5400~15000转每分钟(RPM)
- 每个表面是由一组称为磁道的同心圆组成;每个磁道被划分成一组扇区;每个扇区包含相等数量的数据位(通常是512字节);这些数据编码在扇区上的磁性材料中。扇区之间由一些间隙分隔开,这些间隙中不存在数据位。间隙存储用来标识扇区的格式化位。
磁盘容量
一个磁盘上可以记录的最大位数称为它的最大容量/容量。
磁盘容量的决定因素:
- 记录密度:磁道一英寸的段可以放入的位数。
- 磁道密度:从盘片中心出发半径上一英寸的段内可以有的磁道数。
- 面密度:记录密度与磁道密度的乘积。
即扇区大小×每条磁道平均扇区数×每个面磁道的磁道数×每个盘片的面数×每个磁盘的盘数
对扇区的访问时间有三个主要的部分:
- 寻道时间:为了读取某个目标扇区的内容,传动臂把读/写头首先定位到包含目标扇区的磁道上,所需时间即为寻道时间,约等于最大旋转时间。
- 寻道时间Tseek依赖于读写头以前的位置和转动臂在盘面上移动的速度。
- 旋转时间:定位到期望的磁道后,驱动器等待目标扇区的第一个位旋转到读/写头下。依赖于当读写头到达目标扇区时盘面的位置和磁盘旋转速度。
- 定位到期望的磁道后,驱动器等待目标扇区的第一个位旋转到读/写头下。
- 最大旋转时间 = 1/最大旋转数率
- 平均旋转时间 = (1/2) * 最大旋转时间。
- 传送时间:当目标扇区的第一个位位于读写头下时,驱动器就可以开始读或者写该扇区的内容。依赖于旋转速度和每条磁道的扇区数目。
- 平均传送时间 = (1/最大旋转数率) * (1/每磁道的平均扇区数)
(5)逻辑磁盘块
内存可以看成字节数组、磁盘可以看成块数组
-
现代磁盘构造复杂,有多个盘面,这些盘面上有不同的记忆区。为了对操作系统隐藏这样的复杂性,现代磁盘将他们的构造呈现为一个简单的试图,一个B个扇区大小的逻辑块的序列,编号为0,1,...,B-1。
磁盘中有一个小的硬件/固件设备,称为磁盘控制器,维护着逻辑块号和实际(物理)扇区之间的映射关系。 -
控制器上的固件执行一个快速表查找,将一个逻辑块号翻译一个(盘面、磁道、扇区)的三元组,这个三原则唯一地表示了对应的物理扇区。控制器上的硬件解释这个三元组,将读写头移动到适当的煮面,等待扇区移动到读写头下,将读写头感知到的位放在控制器上的一个小缓冲区中,然后将他们拷贝到主存中。
(6)连接到I/O设备 -
想图形卡、监视器、鼠标、键盘和磁盘这样的输入输出设备,都是通过I/O总线连接到CPU和主存的。
-
系统总线和存储器总线是与CPU相关的,I/O总线设计成与底层CPU无关。
-
I/O总线比系统总线比存储器总线慢,但是它可以容纳种类繁多的第三方I/O设备。
-
通用串行总线USB:2.0最大带宽60MB/S,3.0最大带宽600MB/S
-
图形卡(适配器)
-
主机总线适配器
(7)访问磁盘 -
CPU使用一种存储器映射I/O技术来向I/O设备发出命令,在使用存储器映射I/O的系统中,地址空间中有一块地址是为与I/O设备通信保留的,称为I/O端口。当一个设备连接到总线时,它与一个或多个端口相连。
-
直接存储器访问:设备可以自己执行读或者写总线事务,而不需要CPU干涉的过程。这种数据传送称为DMA传送。
6.2局部性
- 局部性原理:一个编写良好的计算机程序倾向于引用邻近于其他最近引用过的数据项,或者最近引用过的数据项本身。有良好局部性的程序比局部性差的程序运行的更快,在硬件层引入高速缓存存储器就体现了局部性原理。
对程序数据引用的局部性
-
时间局部性(temporal locality):被引用过一次的存储器位置在未来会被多次引用(通常在循环中)。
-
空间局部性(spatial locality):如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。
-
一个连续向量中,每隔k个元素进行访问,被称为步长为k的引用模式,具有步长为1的引用模式称为顺序引用模式,随着步长增加空间局部性下降。
-
双重嵌套循环按照行优先顺序读取数组元素。(因为C数组在存储器中是按照行顺序来存放的)
取指令的局部性 -
程序指令是存放在存储器中的,CPU读取这些指令的过程中评价一个程序关于取指令的局部性。
代码区别与程序数据的一个重要属性就是在运行时指令是不能被修改的。
局部性小结 -
重复引用同一个变量的程序有良好的时间局部性
-
对于具有步长为k的引用模式的程序,步长越小,空间局部性越好。
-
对于取指令来说,循环具有良好的时间和空间局部性。循环体越小,迭代次数越多局部性越好。
存储器层次结构
- 存储技术:不同的存储技术的访问时间差异很大,速度较快的技术每字节的成本要比速度较慢的技术高,而且容量较小,CPU和主存之间的速度差距在增大。
- 计算机软件:一个编写良好的程序倾向于展示出良好的局部性。
重要知识点:
- 缓存不命中:第k层中没有缓存数据对象d
这时第k层缓存会从第k+1层缓存中取出包含d的那个块。如果第k层缓存已满,就可能会覆盖现存的一个块;覆盖一个现存的块的过程称为替换/驱逐这个块;被驱逐的块有时也称为牺牲块。
缓存不命中的种类:
-
强制性不命中/冷不命中:即第k层的缓存是空的(称为冷缓存),对任何数据对象的访问都不会命中。通常是短暂事件,不会在反复访问存储器使得缓存暖身之后的稳定状态中出现。
-
冲突不命中:由于一个放置策略:将第k+1层的某个块限制放置在第k层块的一个小的子集中,这就会导致缓存没有满,但是那个对应的块满了,就会不命中。
-
容量不命中:当工作集的大小超过缓存的大小时,缓存会经历容量不命中,就是说缓存太小了,不能处理这个工作集。
-
替换策略:决定替换哪个块;随机替换策略:随机选择一个牺牲块;最近最少被使用替换策略(LRU):选择最后被访问的时间距现在最远的块。
高速缓存存储器
存储器层次结构只有三层:CPU寄存器、DRAM主存储器和磁盘存储。
高速缓存确定一个请求是否命中,然后抽取出被请求的字的过程,分为三步:(1)组选择(2)行匹配(3)字抽取
- 组选择:
高速缓存从w的地址中间抽取出s个组索引位
组索引位:一个对应于一个组号的无符号整数。 - 行匹配:
判断缓存命中的两个充分必要条件:该行设置了有效位;高速缓存行中的标记和w的地址中的标记相匹配 - 字选择:确定所需要的字在块中是从哪里开始的。
确保代码高速缓存友好的基本方法:
- 让最常见的情况运行的快。
- 在每个循环内部缓存不命中数量最小。
- 对局部变量的反复引用是好的,因为编译器能够将他们缓存在寄存器文件中。
- 步长为1的引用模式是好的,因为存储器层次结构中所有层次上的缓存都是将数据存储为连续的块(空间局部性)。
Linux的inode的理解
- 文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
inode包含文件的元信息,具体来说有以下内容:
* 文件的字节数
* 文件拥有者的User ID
* 文件的Group ID
* 文件的读、写、执行权限
* 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
* 链接数,即有多少文件名指向这个inode
* 文件数据block的位置
可以用stat命令,查看某个文件的inode信息:
stat example.txt
教材学习中的问题和解决过程
- 问题1:关于删除文件后仍可以恢复,此操作和i-Node有什么联系?
- 问题1解决方案:将文件删除后,只是将文件与相对应的inode取消关联,并没有删除inode号,通过inode号码,获取inode信息也没有改变。故恢复时只需要重新建立文件与inode的链接即可。因为Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。
- 如上图所示:
1. 由于进程级文件描述符表的存在,不同的进程中会出现相同的文件描述符,它们可能指向同一个文件,也可能指向不同的文件
2. 两个不同的文件描述符,若指向同一个打开文件句柄,将共享同一文件偏移量。因此,如果通过其中一个文件描述符来修改文件偏移量(由调用read()、write()或lseek()所致),那么从另一个描述符中也会观察到变化,无论这两个文件描述符是否属于不同进程,还是同一个进程,情况都是如此。
代码调试中的问题和解决过程
无
代码托管
其他(感悟、思考等,可选)
本次学习过程总体来说较上一次轻松,因为概念性知识点并不晦涩,而代码部分也并不困难。同时,本章节各部分之间的联系性增强,只要好好阅读课本,课本上练习题都不是问题,基本上都有公式。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | 了解计算机系统、静态链接与动态链接 |
第三周 | 300/500 | 2/4 | 18/38 | 深入学习计算机算术运算的特性 |
第四周 | 500/1000 | 3/7 | 22/60 | 掌握程序崩溃处理、Linux系统编程等知识,利用所学知识优化myod,并实现head和tail命令 |
第五周 | 300/1300 | 2/9 | 10/70 | 掌握“进程”的概念,并学习应用相关函数;了解程序如何在机器上表示 |
第六周 | 500/1869 | 4/11 | 14/84 | 学习了异常控制流 |
第七周 | 380/2290 | 2/13 | 14/98 | 学习了Y86模拟器及相关知识 |
第八周 | 400/2690 | 2/15 | 12/110 | 学习了网络编程、并发、进程、多线程 |
第九周 | 500/3190 | 2/17 | 18/128 | 了解了常见的存储技术(RAM、ROM、磁盘、固态硬盘等) |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。 | ||||
耗时估计的公式 | ||||
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。 |
-
计划学习时间:16小时
-
实际学习时间:18小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)