《计算机原理与系统结构》学习系列——存储器(上)
目录
存储器技术概要
存储器层次
- 在存储器层次结构中,顶端:快贵小——底部:慢廉大
- 三级存储结构:解决CPU和主存之间的速度不匹配问题
- Cache——主存层次
- 主存——外存层次
cache,内存
- L1~L3:高速缓存cache通常集成在CPU中
- 采用**静态随机访问存储器(SRAM)**集成电路
- 由双稳态触发器制造
- 每B由6~8个晶体管组成,硬件规模较大
- L4:内存,采用**动态随机访问存储器(DRAM)**集成电路
- 使用电容保存电荷,进而存储数据
- 每B仅使用1个晶体管,硬件规模远远小于SRAM(密度大于SRAM)
- 由于电荷只能短暂留存,需要周期性地将一行上的数据读出后重新写入,完成刷新
- 移动设备中的LPDDR5内存,全称为第五代低功耗双数据速率同步DRAM
SRAM、DRAM在断电后很快丢失数据,称为易失性存储器(volatile memory)
辅存
- L5:二级存储器或辅存(内存则称为一级存储器或主存)
- 过去常使用磁盘,由一个覆盖着磁性材料的金属/玻璃盘片保存数据
- 读写磁头紧挨着盘片,磁头中的电磁线圈通过感应磁性材料的磁场方向进行读取
- 通过扭转磁性材料的磁场方向进行写入
- 每个盘片由数万条磁道组成,每个磁道又被分为几千个扇区
- 现在个人设备中更多使用闪存(flash)
- 闪存是一种集成电路制造的电可擦除可编程只读存储器(EEPROM)
- 与磁盘相比速度更快、更坚固、功耗更低,但写入次数过多会产生损耗
- 机械硬盘属于磁盘,而U盘、固态硬盘都属于闪存
- 一些系统还会使用光驱或网络服务器作为更低一级的辅存
磁盘和闪存断电后不丢失数据,称为非易失性存储器(nonvolatile memory)
存储器技术
SRAM技术
- SRAM是一种组织成存储阵列结构的简单集成电路,通常具有一个读写端口。虽然读写访间时间可能不同,但SRAM对任何数据访问时间都是固定的
- SRAM不需要刷新,并且其访问时间与周期时间非常相近。为了防止读操作时信息丢失,SRAM 的 一个基本存储单元通常由6-8个晶体管组成。在空闲模式下,SRAM只需要最小的功率来保持电荷
DRAM技术
- 而在动态RAM(DRAM)中,存储单元使用电容保存电荷的方式来存储数据。为了对保存的电荷进行读取或写入,使用一个晶体管对该电容进行访问。因为DRAM存储每一位都只使用一个晶体管,所以它比SRAM密度要高得多,且价格也要便宜很多。由于DRAM在电容上保存电荷,因此不能长久地保持数据,从而必须周期性地刷新。与静态存储器 SRAM 相比,这就是将该存储结构称为动态的原因。
- 为了对单元进行刷新,只需要读出其内容然后写回即可。DRAM单元中的电荷可以保持几微秒。如果 DRAM中的每个比特位需要独立的读出后写回,则必须不停地进行刷新操作,这将导致没有时间可用千正常的访问操作。幸运的是,DRAM 采用了一种两级译码结构,可以通过在一个读周期后紧跟一个写周期的方式一次刷新一整行( 一行单元共用一个字线)
闪存
- 闪存是一种电可擦除的可编程只读存储器 (EEPROM )
- 与磁盘和 DRAM 不同,而与其他 EEPROM 技术类似,对闪存的写操作可以使存储位损耗。为了应对该限制,大多数闪存产品都有一个控制器,用来将写操作从已经写入很多次的块中映射到写入次数较少的块中,从而使写操作尽数分散。这种技术称为损耗均衡(wear leveling)。采用损耗均衡技术,个人移动设备很难超过闪存的写极限。这种均衡技术虽然降低了闪存的潜在性能,但是不需要在高层次的软件中监控块的损耗情况。闪存控制器的这种损耗均衡也将制造过程中出错的存储单元屏蔽掉,从而提高其成品率。
磁盘存储器
- 每个磁盘的表面划分为同心圆盘,称为磁道(track)。每个面通常有几万条磁道。每条磁道同样被划分为用于存储信息的扇区(sector);每条磁道有几于个扇区。每个扇区的容量通常是512-4096 字节。信息在磁介质上保存的顺序为扇区号、一个间隙、包含该扇区纠错码的信息 、一个间隙、下一扇区的扇区号
- 访问每个盘面的磁头连在一起相互协调运动,因此每个盘面的磁头位千相同的扇区。术语柱面用来表示磁头在给定点时访问到所有盘面上的所有扇区的集合。为了访问数据,操作系统必须对磁盘进行三步操作:第一步是将磁头移动到适当的磁道之上,这称为寻道 ( seek),将磁头移动到目标磁道所需的时间称为寻道时间
- 一旦磁头到达了正确的磁道,就必须等待要访问的扇区转动到读写头下面。该等待时间称为旋转延时 (rotational latency) 。平均延时通常是磁盘转动一周时间的一半
- 磁盘访间的最后一部分是传捡时间,即传输一块数据需要的时间。传输时间是扇区大小、旋转速度和磁道信息密度的一个函数
局部性原理
程序正在执行某条指令
- 如果这条指令位于循环体中,那么这条指令可能不久之后再次被访问——时间局部性
- 如果在循环体或顺序指令流中,那么将要执行的指令往往地址相近——空间局部性
- 时间局部性和空间局部性统称为局部性原理
程序在某一时间真正需要的指令/数据往往只占整个程序内存空间的一小部分,并且程序在使用一个指令/数据字的时候,即将使用的指令/数据通常在内存中相近的位置,因此,可以将内存中的一小块放入更小、更快的上级存储器——cache中,让CPU快速取用数据
高速缓存cache
访存性能概念
命中与缺失
访存即访问内存,分为读取内存和写入内存,访存指令=MEM-reg数据传送指令=L-S指令,即Iw和sw指令CPU访问内存时,都会优先询问cache是否保存着所需数据
- 如果访问数据在cache中,就称为一次cache命中(hit)
- 但是这种预测不会永远满足,例如程序跳转到很远的距离之外,cache并不包含所需数据,CPU则需要访问慢得多的内存,此时产生一次cache缺失(miss)
命中/缺失占访存次数的·比例叫做命中率(hit rate)/ 缺失率(miss rate)
CPU访问内存数据,要么在cache中访问命中,要么缺失,因此 缺失率 = 1 - 命中率
MR = 1 - HR
访存阻塞的周期数
- CPU访问cache的时间称为命中时间(hit time),通常只有1T
- CPU访问内存比访问cache多出来的时间称为缺失代价(miss penalty),长达数百T
定义一个程序的L-S指令数目为访存次数MAC(memory access count)
定义程序中的L-S指令占总指令数的比重为访存率MAR(memory access rate)
为了评价存储器性能,我们将程序执行的周期数cycles分为CPU执行周期数+访存阻塞周期数两部分
访存阻塞周期数 = 访存次数 x 缺失率 x 缺失代价 cycles = MAC x MR x MP
cache基础:直接映射
块号
内存和cache被划分为一些大小相同的块,内存中的块数远大于cache中的块数
假设cache拥有8个块(编号0-7),内存拥有256个块(编号0~255)
cache块号 = 内存块号 % cache 块数
内存地址字段
我们可以将内存地址分为3段
①cache块号之前 ②cache块号 ③cache块号之后
- cache块号之后的部分用于指定访问块中具体哪一字节,称为③块内(字节)偏移
- cache块号用于决定放入哪个cache块中,相当于一个标签,称为②索引位(index)
- 但是cache为了确定一块具体是哪个内存块,处理索引位,还需要所以索引位之前的高位地址,这个高位地址结合索引号,可以唯一标记以恶搞内存块,称为①标记位
我们还需要一种方法来判断 cache 块中确实没有包含有效信息。例如,当一个处理器启动时,cache中没有数据,标记域中的值没有意义。甚至在执行了一些指令后,cache中的一些块依然为空。因此,在cache中,这些块的标记应该被忽略。最常用的方法就是增加一个有效位(valid bit)来标识一个块是否含有一个有效地址。如果该位没有被设置, 则不能使用该块中的内容
缺失
根据产生原因,缺失分为以下三类:
①首次访问cache中没有的块必然产生缺失,称为冷启动强制缺失
②由于cache容量不能容纳程序执行需要的所有块,部分块被替换后调入cache称为容量缺失
③多个内存块竞争映射到同一个cache块中导致仍需使用的块的替换,称为冲突碰撞缺失
三个原因导致的缺失称为3C模型
- 适当增加块大小(同时也会减少块数)可以更好利用空间局部性,显著减少强制缺失
- 加大容量可以改善容量缺失,但是随着块数不断减少,则会因为竞争替换过于频繁,增加冲突碰撞缺失并且,更大的块意味着传输一块数据的时间更长,缺失代价上升
缺失处理和写策略
cache访问缺失数据处理步骤为:
- 将PC+4-4并写回PC,阻塞处理器
- 访问内存,将内存块写入cache
- 再次访问cache
当CPU把新数据写入内存块时,又要把数据写到cache,保持内存和cache内容一致
- 方式一:CPU写cache时同时开始写内存,称为写直达(write through),这种方式的处理器开销也接近访存时间,意义不大,因此,可改进为写缓冲,CPU较快写入缓冲后执行别的任务,由缓冲慢慢将数据写到内存(如果写入的数据特别多也会出现问题)
- 方式二:CPU只写入cache,仅当这个cache块被索引位相同的其他块替换出去时才将修改后的cache块写入内存,称为写回(write back)
- 写缓冲只是对写直达的必要改进,不是写直达和写回之外的方式三
全相联映射
直接映射中,一个内存块只能映射到唯一的cache块,实现比较简单
另一种极端的情况是,内存块可能映射到任何一个cache块,称为全相联映射
- 第一个内存块可进入任何一个cache块,只要cache没满,其他块就可以见缝插针
- 如果cache已满,则替换掉最长时间没有使用过的内存块,这种替换算法称为最近最少使用(least recently used,LRU)
- 和直接映射相比,要使用的块更不容易被替换出去,缺失率更低,但是查找时需要比较每一块的标记位,开销过大,只适用于块数较少的cache
- 全相联有没有索引位,全相联中的碰撞缺失实际转化为容量缺失
组相连映射
对于全相联映射,比较标记位的开销太大,有一种折中的办法,对cache进行分组,一个内存块直接映射到一个组。但是分配到哪一块较为自由,也就是在一组之内全相联这样的映射策略称为组相联映射
一组包含n块则称为n路组相联,其相联度为n
组相联中的内存映射计算: cache组号 = 内存块号 % cache组数
对于 2 n 2^n 2n组的cache,cache组号 = 内存二进制块号的后n位
缺失处理
全相联和组相联的缺失处理和直接映射相同,也都可以采用写直达和写回
替换是,选择最近最少使用(LRU),我们可以用1位编号记录2路组相联一组中最久没用的块,用2位来编号记录4路组相联,以此类推,这个编号称为LRU位
cache性能评价
平均访存时间有时用周期数表示,不必化成秒
平均访存时间 = 命中时间 + 缺失率x缺失代价
cache一致性
假设一个双核CPU,每个核心拥有自己的cache,采用写直达策略。当A核向某一内存单元写入自己cache A的一个内存块时,B核对相应内存块进行读取。为了确保B核能读到A核写入这一块的内容,需要某种机制确保A核完成写入内存后,B核才能读取,从而确保两个处理器核心看到数据的一致性(coherence)
- 最常用的cache一致性协议是监听(snooping)协议
- A核开始写入内存时,释放信息告诉其他核心:正在写入,请勿读取
- B核监听到这种信息,从而暂停读取内存块以及cache B中的对应块,这称为写时无效协议(write Incalidate protocol)
- 如果A核和B和需要同时写入一个内存块,则必须有某种机制,使得两个处理器的写操作一前一后,这种机制叫做写串行化(write serialization)
原文地址:https://blog.csdn.net/Kenjuan/article/details/143640772
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!