2017-2018-1 学号 《信息安全系统设计基础》第十三周学习总结
教材学习内容总结
第六章 存储器层次结构
6.1 存储技术
6.2 局部性
6.3 存储器层次结构
6.4 高速缓存存储器
6.5 编写高速缓存友好的代码
6.7 小结
存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。存储器层次结构是可行的,是因为与下一个更低层次的存储设备相比来说,一个编写良好的程序倾向于更频繁的访问某一个层次上的存储设备。靠近CPU的小的、快速的高速缓存存储器(cache memory)作为一部分存储在相对慢速的主存储器(mainmemory,简称主存)中的数据和 指令的缓冲区域。主存暂时存放存储在容量较大的、慢速磁盘上的数据,而这些磁盘常常又作为存储在通过网络连接的其他机器的磁盘或磁带上的数据的缓冲区域。
6.1 存储技术
- 随机访问存储器(Random-AccessMem)分两类:静态RAM(SRAM)和动态RAM(DRAM)。
- SRAM将每个位存储在一个双稳态的(bitable)存储器单元里。每个单元是用一个六晶体管电路来实现的。
- DRAM将每个位存储为对一个电容的充电。DRAM存储器可以制造得非常密集——每个单元由一个电容和一个访问晶体管组成。
- 如果断电,DRAM和SRAM会丢失它们的信息,从这个意义上说,它们是易失的(volatile)。
- ROM以能够被重编程的次数和它们进行重编程所用的机制被区分为:可编程ROM (PROM),可擦写可编程ROM(EPROM),和电子可擦除PROM(EEPROM)。闪存:闪存是基于EEPROM的非易失性存储器,是一种较为普遍的非易失性存储器。
- 数据流通过称为总线的共享电子电路在处理器和DRAM主存之间来来回回。每次CPU与主存之间的数据都是由总线事务来完成的,总线事务包括读事务和写事务。
- 磁盘是用来保存大量数据的存储设备,能比基于RAM的存储器存更多的数据,但是读取数据的速度却远远低于基于RAM的存储器。
- 磁盘是由盘片构成的。磁盘是由盘片(platter)构成的。每个盘片有两面或者称为表面(surface),表面覆盖着磁性记录材料。盘片中央有一个可以旋转的主轴(spindle),它使得盘片以固定的旋转速率 (rotational rate)旋转;每个盘片上是由一组成为磁道的同心圆组成的。每个磁道被划分为一组扇区。扇区之间存在间隙。磁盘通常包含一个或多个这样的盘片,并封装在一个密封的容器内。整个装置称为磁盘驱动器,我们简称磁盘。
- 磁盘容量的计算:
- 磁盘以扇区大小的块来读写数据。对扇区的访问时间(access time)主要有三个部分:寻道时间(seek time)、旋转时间(rotational time)和传送时间(transfer time)。
- 当CPU从磁盘读数据时的步骤:
- CPU通过命令、逻辑块号和目的内存地址写到与磁盘相关联的内存映射地址,发起一个读
- 磁盘控制读扇区,并执行到主存的DMA
- 当DMA传送完成时,磁盘控制器用中断的方式通知CPU
- 固态硬盘(SSD)是一种基于闪存的存储技术。一个SSD包由一个或多个闪存芯片和闪存翻译层组成,闪存芯片替代传统旋转磁盘中的机械驱动器,而闪存翻译是一个硬件/固件设备,扮演与磁盘控制器相同的角色,将对逻辑块的请求翻译成对底层物理设备的访问。
6.2 局部性
一个编写良好的计算机程序常常具有良好的局部性(locality)。也就是说,它们倾向于引用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。这种倾向性,被称为局部性原理(principle of locality)。
- 局部性通常有两种不同的形式:时间局部性(temporal locality)和空间局部性(spatial locality)。
- 重复引用同一个变量的程序有良好的时间局部性。
- 一个连续向量中,每隔k个元素进行访问,就被称为步长为k的引用模式。对于具有步长为k的引用模式的程序,步长越小,空间局部性越好。具有步长为1的引用模式的程序有很好的空间局部性。在存储器中以大步长跳来跳去的程序空间局部性会很差。
- 对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
6.3 存储器层次结构
一般而言,从高层往底层走,存储设备变得更慢、更便宜和更大。
一般而言,高速缓存是一个小而快速的存储设备,它作为存储在更大也更慢的存储设备中的数据对象的缓冲区域。使用高速缓存的过程称为缓存。 数据块总是以块大小为传送单位(transfer unit)在第k层和第k+1层之间来回拷贝。
- 缓存命中:当程序需要第k+1层的某个数据对象d时,它首先在当前存储在k层的一个块中查找d。如果d刚好缓存在k层,那么就“命中”。
- 缓存不命中:如果k层没有缓存数据对象d,那么就“不命中”。当发生缓存不命中后,第k层的缓存从第k+1层缓存中取出包含d的那个块。
- 冷不命中
- 冲突不命中
6.4 高速缓存存储器
早期计算机系统的存储结构只有三层:CPU寄存器、DRAM主存储器和磁盘存储。不过,由于CPU和主存之间逐渐增大的距离,系统设计者被迫在CPU寄存器文件和主存之间插入了一个小的SRAM高速缓存存储器,称为L1高速缓存。随着CPU和主存之间的性能差距不断增大,系统设计者在L1高速缓存更大的高速缓存,称为L2高速缓存。有些现代计算机还包括一个更大的高速缓存,称为L3缓存。
- 一般而言,高速缓存的结构可以用元组(S,E,B,m)来描述。高速缓存的大小(或容量)C指的是所有块的大小的和。标记位和有效位不包括在内。因此,C=S * E * B。
- 【通用高速缓存】
- 根据E(每个组的高速缓存行数)高速缓存被分为不同的类:
- 直接映射高速缓存
- 每个组只有一行(E=1)的高速缓存称为直接映射高速缓存(direct-mapped cache)。
- 组选择
- 行匹配
- 字选择
- 行替换
- 组相联高速缓存:直接映射高速缓存中冲突不命中造成的问题是源于每个组只有一行这个限制,组相联高速缓存放松了这条限制,所以每个组都保存多余一个的高速缓存行。
- 全相联高速缓存:一个全相联高速缓存是由一个包含所有高速缓存行的组(即E=C/B)组成的。
- 直接映射高速缓存
- 有关写的问题
- 设我们要写一个已经缓存了的字w写命中(write hit)。在高速 缓存更新了它的w的拷贝之后,想要更新w在层次结构中紧接着低一层中的拷贝,可以有多种选择:
- 直写(write-through):立即将w的高速缓存块写回到紧接着的低一层中。
- 写回(write-back),尽可能地推迟存储器更新,只有当替换算法要驱逐更新过的块时,才把它写到紧接着的低一层中。
- 另一个问题是如何处理写不命中。
- 写分配(write-allocate),加载相应的低一 层中的块到高速缓存中,然后更新这个高速缓存块。写分配试图利用写的空间局部性,但是缺点是每次不命中都会导致一个块从低一层传送到高速缓存。
- 非写分配(not-write-allocate),避开高速缓存,直接把这个字写到低一层中。直写高速缓存通常是非写分配的。写回高速缓存通常是写分配的。
- 一般而言,高速缓存越往下层,越可能采用写回而不是直写。
- 设我们要写一个已经缓存了的字w写命中(write hit)。在高速 缓存更新了它的w的拷贝之后,想要更新w在层次结构中紧接着低一层中的拷贝,可以有多种选择:
- 实际上,高速缓存既可以保存数据也可以保存指令。只保存指令的高速缓存称为i-cache,只保存程序数据的高速缓存称为d-cache。记保存数据又保存指令的高速缓存称为统一的高速缓存(unified cache)。
6.5 编写高速缓存友好的代码
教材学习中的问题和解决过程
- 问题1:XXXXXX
- 问题1解决方案:XXXXXX
- 问题2:XXXXXX
- 问题2解决方案:XXXXXX
- ...
代码调试中的问题和解决过程
- 问题1:XXXXXX
- 问题1解决方案:XXXXXX
- 问题2:XXXXXX
- 问题2解决方案:XXXXXX
- ...
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
- 错题1及原因,理解情况
- 错题2及原因,理解情况
- ...
结对及互评
点评模板:
- 博客中值得学习的或问题:
- xxx
- xxx
- ...
- 代码中值得学习的或问题:
- xxx
- xxx
- ...
- 其他
本周结对学习情况
- [结对同学学号1](博客链接)
- 结对照片
- 结对学习内容
- XXXX
- XXXX
- ...
其他(感悟、思考等,可选)
xxx
xxx
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 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小时
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)