20145308 《信息安全系统设计基础》第7周学习总结
20145308 《信息安全系统设计基础》第7周学习总结
教材学习内容总结
第六章 存储器层次结构
- 存储器系统:具有不同容量、成本和访问时间的存储设备的层次结构
- 高速缓存存储器设备:主存中的数据和指令的缓冲区域
6.1 存储技术
- 6.1.1 随机访问存储器
- RAM分为静态和动态两类
- 静态SRAM比动态DRAM快
- SRAM作为高速缓存内存储器可以在CPU芯片上或片下
- DRAM用来作为主存以及图形系统的帧缓冲区
- 静态RAM:将每个位存储在一个双稳态的存储单元里
- 动态RAM:将每个位存储为对一个电容的充电
- 传统的DRAM:单元被分成d个超单元,每个超单元由w个DRAM单元组成
- 存储器模块:DRAM芯片包装在存储器模块中,包括168个引脚的双列直插存储器模块和72个引脚的单列直插存储器模块
- 增强的DRAM:快页模式DRAM、扩展数据输出DRAM、同步DRAM、双倍数据速率同步DRAM、Rambus DRAM、视频RAM
- 非易失性存储器: PROM只能编程一次、可擦写可编程ROM、闪存
- 访问主存:总线在处理器和DRAM主存间来回,总线事务分为读事务和写事务
- 6.1.2 磁盘存储
- 磁盘构造:由盘片构成,每个盘片有表面,主轴,磁道,扇区
- 磁盘容量:容量由记录密度、磁道密度、面密度决定
- 磁盘操作:访问时间有三个主要部分寻道时间、旋转时间和传送时间
- 逻辑磁盘块:磁盘控制器维持着逻辑块号与实际的磁盘扇区之间的映射关系
- 连接到I/O设备:I/O总线比系统总线和存储器总线速度慢,但是可以容纳更多的第三方I/O设备
- 访问磁盘:CPU使用存储器映射I/O技术向I/O设备发出命令
- 商用磁盘的剖析:备用扇区形成了备用柱面池
- 6.1.3 固态硬盘
- 一种基于闪存的存储技术,在某些情况下是传统旋转磁盘的替代产品
- SSD包由一个或多个闪存芯片和闪存翻译层组成,闪存芯片替代传统旋转磁盘中的机械驱动器,闪存翻译层是一个硬件/固件设备,扮演与磁盘控制器相同的角色,将对逻辑块的请求翻译成对底层物理设备的访问
- SSD随机访问时间比旋转磁盘快
- 6.1.4 存储技术趋势
- 不同的存储技术有不同的价格和性能折中
- 不同存储技术的价格和性能属性以截然不同的速率变化着
6.2 局部性
- 局部性原理:计算机程序倾向于引用邻近于其它最近引用过的数据项的数据项,或者最近引用过的数据项本身的倾向性
- 分为时间局部性和空间局部性
- 时间局部性:被引用过一次的存储器位置很可能在不远的将来被再次引用
- 空间局限性:如果一个存储器被引用了,在不远的将来很可能会引用附近的一个存储器位置
- 6.2.1 对程序数据引用的局限性
- 对于循环体中的每个变量,这个函数要么有好的空间局限性,要么有好的时间局限性,则可以断定这个函数有良好的局限性
- 顺序引用模式:步长为1的引用模式
- 步长为k的引用模式:每隔k个元素进行访问
- 行优先顺序:双层嵌套循环具有良好的空间局部性的读数组元素的顺序
- 6.2.2 取指令的局部性
- 指令按照连续的存储器顺序执行,循环有良好的空间局部性
- 代码区别于程序数据的重要属性是在运行时他不能被修改
- 程序正在执行时,CPU只从存储器中读出他的指令,绝不会重写或修改这些指令
- 6.2.3 局部性小结
- 重复引用同一个变量的程序具有良好的时间局部性
- 对于具有步长为k的引用模式的程序,步长越小,空间局部性越好
- 对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好
6.3 存储器层次结构
- 存储技术
- 计算机软件
- 所有现代计算机系统都使用存储器层次结构
- 6.3.1 存储器层次结构中的缓存
- 高速缓存作为存储在更大、也更慢的存储设备的缓冲区域,使用高速缓存的过程称为缓存
- 数据以块大小为传送单元在第k层和第k+1层之间来回拷贝
- 缓存命中:程序需要的数据块恰好缓存在第k层
- 缓存不命中:第k层中没有缓存需要的数据,从第k+1层读取一个数据块可能会替换(驱逐)一个现存的块
- 缓存不命中种类:冷不命中、强制性不命中(冷缓存)、冲突不命中(限制性的放置策略)、容量不命中(工作集的大小超过缓存的大小)
- 缓存管理:编译器管理寄存器文件,缓存结构层次的最高层
- 6.3.2 存储器层次结构概念小结
6.4 高速缓存存储器
- 6.4.1 通用的高速缓存存储器结构
- 每个存储器地址有m位,一个机器的高速缓存被组织成一个有S个高速缓存组的数组,每个组包含E个高速缓存行,每个行由B字节的数据块组成
- 高速缓存的结构可以用元组(S,E,B,m)来描述,高速缓存的大小C=SEB
- 6.4.2 直接映射高速缓存
- 每个组只有一行(E=1)的高速缓存称为直接映射高速缓存
- 高速缓存确定一个请求是否命中,然后抽取被请求的字的过程,分为三步:1)组选择2)行匹配3)字抽取
- 直接映射高速缓存中的组选择:高速缓存从w的地址中间抽取出s个组索引位
- 直接映射高速缓存中的行匹配:确定是否有字w的一个拷贝存储在组i包含的一个高速缓存行中
- 直接映射高速缓存中的字选择:快偏移提供了所需要的字的第一个字节的偏移
- 直接映射高速缓存中不命中时的行替换:替换策略是用新取出的行替换当前的行
- 综合:运行中的直接映射高速缓存
- 直接映射高速缓存中的冲突不命中: 当程序访问大小为2的幂的数组时,直接映射高速缓存中通常会发生冲突不命中,高速缓存反复地加载和驱逐相同的高速缓存块的组(抖动)
- 解决方法:在每个数组的结尾放B字节的填充
- 6.4.3 组相联高速缓存
- 组相联高速缓存中的组选择:和直接映射高速缓存相同
- 组相联高速缓存中的行匹配和字选择:高速缓存必须搜索组中的每一行
- 组相联高速缓存中不命中时的行替:最不常使用、最近最少使用策略
- 6.4.4 全相联高速缓存
- 由一个包含所有高速缓存行的组(E=C/B)组成的
- 全相联高速缓存中的组选择:只有一个组,所以地址中没有组索引位
- 全相联高速缓存中的行匹配和字选择:与组相联高速缓存相同
- 6.4.5 有关写的的问题
- 写命中
- 直写:立即将w的高速缓存块写回到紧接着的低一层中
- 写回:尽可能的推迟存储器更新,只有当替换算法要驱逐更新过的块时,才把它写回紧接着的低一层中
- 写不命中
- 写分配:加载相应的第一层中的块到高速缓存中,然后更新这个高速缓存块
- 非写分配:避开高速缓存,直接把这个字写到第一层中
- 写命中
- 6.4.6 一个真实的高速缓存层次结构的解剖
- i-cache:只保存指令的高速缓存,通常只读
- d-cache:只保存程序数据的高速缓存
- 统一的高速缓存:即保存指令又保存程序数据
- 6.4.7 高速缓存参数的性能影响
- 高速缓存大小的影响:提高命中率、增加命中时间
- 块大小的影响:提高命中率、对不命中处罚有负面影响
- 相联度的影响:降低抖动的可能性、增加命中时间、增加不命中处罚
- 写策略的影响:高速缓存越往下层越可能使用写回而不是直写
6.5 编写高速缓存友好的代码
- 让最常见的情况运行得快
- 在每个循环内部缓存不命中数量最小
- 对局部变量的反复引用是好的(时间局限性)
- 步长为1的引用模式是好的(空间局限性)
6.6 综合:高速缓存对程序性能的影响
- 6.6.1 存储器山
- 读吞吐量(读带宽):一个程序从存储系统中读数据的速率
- 6.6.2 重新排列循环以提高空间局限性
- 与存储器访问总数相比,不命中率是一个较好的性能指示
- 6.6.3 在程序中利用局部性
- 有良好局部性的程序从快速的高速缓存存储器中访问它的大部分数据
- 局部性差的程序从DRAM主存中访问它的大部分数据
教材学习中的问题和解决过程
- P403例子为什么调换i,j的次序就会得到空间局部性不同的程序
- 书上的代码图6-20 a)中M和N的顺序反了,应该是M=3,N=2,调换过来就很好理解了
其他
- 本周学习了存储器的体系结构,学习了各种不同的存储器,了解了不同级别的存储器之间的区别,理解为什么计算机最后采用金字塔形状的存储结构。理解局部性原理,对编写代码,提高代码的效率有很大的好处
本周代码托管截图
-
本周在git中创建了目录,将之前的一部分代码重新提交到了新的项目中
-
开始时遇到了很多问题,发现把学号文件夹提交上去之后,里面的子文件夹会变成空的,后来参照了嘉澜同学的博客,发现在子文件夹下提交就会成功了
-
git add .
命令不成功
-
解决方法:首先解读警告信息,git add .在这个版本会忽略删除文件,但在Git 2.0以上会有所改变 。此版本上 git add 默认为 " git add --ignore-removal "(忽略删除文件)。
并告诉你 git add --all 可满足你的要求
git version 查看版本号 ,发现是1.9 而之前用的是2.3.1 。soga
- 解决方案 :git add -A or git add --all 添加删除文件到stage
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 1/2 | 25/30 | 学习Linux指令 | |
第二周 | 50/50 | 1/3 | 25/55 | Linux系统下的开发环境 |
第三周 | 20/70 | 1/4 | 25/80 | 信息的表示和处理 |
第五周 | 20/90 | 1/5 | 30/110 | 程序的机器级表示 |
第六周 | 20/110 | 1/6 | 30/140 | 处理器体系结构 |
第七周 | 20/130 | 1/7 | 30/170 | 存储器层次结构 |