程序员希望拥有无限数量的快速存储器,为了满足这一愿望,一种经济型解决方案是存储器层次结构,这种凡是利用了局域性原理。
由于快速存储器非常昂贵,所以分为几个级别,越接近处理器,容量越小,速度越快。
如果在缓存中找不到某一个字,就必须从层次结构的一个较低层级中去提取这个字,并且把它放在缓存里。
设计师需要做出一个非常重要的决定,就是那些块可以放在缓存里。
Cache的容量很小,它保存的内容只是主存内容的一个子集,且Cache与主存的数据交换是以块为单位的。为了把信息放到Cache中,必须应用某种函数把主存地址定位到Cache中,这称为地址映射。在信息按这种映射关系装入Cache后,CPU执行程序时,会将程序中的主存地址变换成Cache地址,这个变换过程叫做地址变换。
Cache的地址映射方式有直接映射、全相联映射和组相联映射。假设某台计算机主存容量为l MB,被分为2048块,每块512B;Cache容量为8KB,被分为16块,每块也是512B。下面以此为例介绍三种基本的地址映射方法。
直接映射
直接映射的Cache组织如图所示。主存中的一个块只能映射到Cache的某一特定块中去。例如,主存的第0块、第16块、……、第2032块,只能映射到Cache的第0块;而主存的第1块、第17块、……、第2033块,只能映射到Cache的第1块……。 直接映射是最简单的地址映射方式,它的硬件简单,成本低,地址变换速度快,而且不涉及替换算法问题。但是这种方式不够灵活,Cache的存储空间得不到充分利用,每个主存块只有一个固定位置可存放,容易产生冲突,使Cache效率下降,因此只适合大容量Cache采用。例如,如果一个程序需要重复引用主存中第0块与第16块,最好将主存第0块与第16块同时复制到Cache中,但由于它们都只能复制到Cache的第0块中去,即使Cache中别的存储空间空着也不能占用,因此这两个块会不断地交替装入Cache中,导致命中率降低。
全相联映射
全相联映射的Cache组织,主存中任何一块都可以映射到Cache中的任何一块位置上。
全相联映射方式比较灵活,主存的各块可以映射到Cache的任一块中,Cache的利用率高,块冲突概率低,只要淘汰Cache中的某一块,即可调入主存的任一块。但是,由于Cache比较电路的设计和实现比较困难,这种方式只适合于小容量Cache采用。
组相联映射
最常用的就是组相连。其中组就是指缓存的一组快。一个块首先被映射到一个组上,然后可以将这个块放到这个组的任意位置。要查找一个快,首先将这个块的地址映射到这个组,然后再搜索这个组,以找到这个块。这个组是根据数据地址选择的:
块地址 mod 缓存中的组数
组相联映射实际上是直接映射和全相联映射的折中方案,其组织结构如图所示。主存和Cache都分组,主存中一个组内的块数与Cache中的分组数相同,组间采用直接映射,组内采用全相联映射。也就是说,将Cache分成u组,每组v块,主存块存放到哪个组是固定的,至于存到该组哪一块则是灵活的。例如,主存分为256组,每组8块,Cache分为8组,每组2块。主存中的各块与Cache的组号之间有固定的映射关系,但可自由映射到对应Cache组中的任何一块。例如,主存中的第0块、第8块……均映射于Cache的第0组,但可映射到Cache第0组中的第0块或第1块;主存的第1块、第9块……均映射于Cache的第1组,但可映射到Cache第1组中的第2块或第3块。
一次内存访问示意图
其中
具体的可以看看
https://www.cnblogs.com/east1203/p/11572500.html
缓存写入更难一些。主要有两种策略。一种是直写缓存,它会更新缓存中的项目,并直接写入主存储器并对其进行更新。另一种是写回缓存,仅更新缓存中的副本。在马上要替换这个块的时候,再将它复制回存储器。
为了衡量不同缓存组织方式的优势,可以采取一个名为缺失率的指标。
缺失率可能会因为多个原因而产生误导。因此,一些设计人员喜欢测量每条指令的缺失次数。
一种更好的度量指标是存储器平均访问时间。
有六个方法可以降低存储器平均访问时间
上面的存储器平均访问时间公式提供了三种缓存优化度量,命中时间、缺失率和缺失代价。可以将我们研究的10种高级缓存优化方法分为5类。
小而简单的第一级缓存,用以缩短命中时间、降低功耗
提高时钟频率和降低功耗的双重压力都推动懂了对第一级缓存大小的限制。
缓存命中过程中的关键计时路径由3个步骤组成:使用地址中的索引确定标记存储器的地址,将读取的标签值与地址进行比较。接下来,如果缓存为组相连缓存,则设置多路转换器以选择正确的数据项。直接映射的缓存可以将标记核对与数据传输重叠起来,有效缩短命中时间。
可以根据缓存大小的不同,选择合适的关联方式。直接映射略快于两路组相连,两路组项链是思路的1.2倍,四路是八路的1.4倍。
采用路预测以缩短命中时间,这是另外一种可以减少冲突缺失,同时又能保持直接映射缓存命中速度的方式。在路预测技术中,缓存中另外保存了一些位,用于预测下一次缓存访问组中的路或块(不知道预测的计算量和代价如何)。这种预测意味着尽早设定多工选择器,已选择所需要的块,在与缓存数据读取并行的周期内,只执行一次标签比较,如果确实,则会在下一个时钟周期中查看其他的块。就是说,预测正确,缓存访问延时等于这一快速命中时间,如果错误,则尝试其他快,延时会增加一个周期。
模拟表面,对于一个两路组相连,组预测准确率超过90%,四路超80%。(不懂)
另一种扩展形式的路预测,使用路预测位来判断实际访问的缓存块。
实现缓存访问的流水化,以提高缓存带宽。这种优化方法就是实现缓存访问的流水化,使第一级缓存命中给的实际延时可以分散到多个时钟周期,从而缩短时钟周期、提高带宽但会减缓命中速度。
采用无阻塞缓存,以提高带宽,对于允许乱序执行的流水线计算机,其处理器不必因为一次数据缓存缺失而停顿。在等待缓存返回缺失数据时,可以继续从指令缓存中提取指令。无阻塞缓存允许数据缓存在一次缺失时间继续提供缓存命中。这种“缺失时仍然命中”优化方法在缺失期间非常有用,它不会在此期间忽略处理器请求,降低了实际缺失代价。
采用多种缓存以提高缓存带宽,我们可以将缓存划分为几个相互独立、支持同时访问的缓存组,而不是将它们看做一个整体。
显然,当访问请求很自然地分布在缓存组之间时,分组方式的效果最佳,所以将地址映射到换出租的方式影响着存储器系统的行为。分组还能降低缓存和DRAM中的功耗。
通常,只有在采用大型缓存块的设计中,这些技术才有用武之地。
首先从存储器中请求缺失的字,在其到达缓存之后立即发给处理器,使处理器能够在载入块中其他字时继续执行。
正常顺序提前字,但只要块中的被请求字到达缓存,就立即将其发送给处理器,让处理器继续执行
**采用编译器优化以降低缺失率。**前面介绍的技术都需要改变硬件,下面这种技术可以在不做硬件修改的情况下降低缺失率。
一些程序中存在循环嵌套,会以非连续顺序访问存储器中的数据。只要交换一下这些循环的嵌套顺序,就可能使程序代码按照数据的存储顺序来访问他们。
这一优化方法通过提高时间局域性来减少损失。分块算法案不是对一个组数的整行或者整列进行操作,而是对其子矩阵进行操作,其目的是在缓存中载入的数据被替换之前最大程度上利用它。
在处理器请求项目之前,预先提前它们。指令和数据都可以预先提取,可以直接放在缓存中,也可以放在一个访问速度快于主储存器的外部缓冲区中。指令预取经常在缓存外部的硬件中完成。通常处理器在一次缺失时提取两个块:被请求块和下一个相邻块。
作为硬件预取的替代方法,,可以在处理器需要某一数据之前,由编译器插入请求该数据的预取指令。共有两种方式
主存储器在层次结构上位于缓存的下一级。主存满足缓存的需求,并充当I/O接口。对主存储器的性能度量同时强调延迟和带宽。尽管缓存可以从低延迟存储器中获益,但是提高带宽比降低延时更容易。主储存器使用DRAM芯片,缓存使用SRAM技术。
SRAM(Static Random-Access Memory)是静态随机存取存储器。DRAM电路的动态本质是要求在读取数据之后将其写回并需要进行刷新。SRAM不需要刷新,通常使用6个晶体管保存一位数据。
DRAM是动态随机存取存储器。为了在每个芯片中容纳更多的位,DRAM仅使用一个晶体管来存储一位数据,信息的读取会破坏该信息,所以需要进行恢复。
DRAM的访问分为行访问和列访问两个部分。DRAM必须在DRAM内部缓冲一行的所有位,为列访问做好准备。
第一,DRAM添加了定时信号,允许重复访问行缓冲区,从而节省了行访问时间。
第二,向DRAM接口添加一个时钟信号,是重复传输不需要承担着一开销。
第三,人们扩展了DRAM的宽度。
第四,在上升沿和下降沿都传输数据,被称为DDR
降低电压和省电模式
闪存是flash memory,是一种电子式可清除程序化只读存储器的形式,允许在操作中被多次擦或写的存储器。这种科技主要用于一般性数据存储,以及在计算机与其他数字产品间交换传输数据,如储存卡与U盘。闪存是一种特殊的、以宏块抹写的EPROM。早期的闪存进行一次抹除,就会清除掉整颗芯片上的数据。
通过虚拟内存来保护进程,保证安全和保密。
虚拟存储器,将物理存储器划为块,分给不同的进程。
随着计算机系统软件和应用软件的功能不断增强,某些程序却需要很大的内存才能运行,但是计算机本身的物理内存容量比较小。而且在多用户多任务系统中,多用户或多个任务共享全部主存,要求同时执行多道程序。这些同时运行的程序到底占用实际内存中的哪一部分,在编制程序时是无法确定的,必须等到程序运行时才动态分配。
用户编制程序时使用的地址(虚拟地址由编译程序生成)称为虚地址或逻辑地址,其对应的存储空间称为虚存空间或逻辑地址空间;而计算机物理内存的访问地址则称为实地址或物理地址,其对应的存储空间称为物理存储空间或主存空间。程序进行虚地址到实地址转换的过程称为程序的再定位。
页式虚拟存储器是保护进程免受相互伤害的主要机制。
多到程序设计需要在各个程序之间提供保护和共享。操作系统和体系系统结构联合起来就能是进程共享硬件而不会相互干扰。
虚拟机是大型计算机计算的重要组成部分。近年来在近些年得到广泛关注。
为虚拟机提供支持的软件成为虚拟机乾时期(VMM)或管理核心。
如果在设计ISA期间以及为VM做了规划,那就可以比较轻松地减少VMM必须执行的指令数、缩短模拟这些指令所需要的时间。
由于每个VM中的操作系统有自己的也标记,所以VMM区分了实际存储器和物理存储器的概念,使得实际存储器成为虚拟存储器与物理存储器直接的独立、中间级存储器。
三个主要在其他章节讨论的主题,他们是存储器层次结构的基础。
保护是由体系结构和操作系统协力完成的,但是当虚拟存储器变得更为普遍的时候,体系结构必须修改指令集体系结构中一系诶不便使用的细节。
数据可以同时出现在存储器和缓存中。只要处理器是唯一修改或读取数据的组件,并且缓存存在于处理器和存储器之间,那处理器看到旧副本或者说过期副本的文献学就很低。
处理器出现缓存一致性问题的频率与I/O不同。I/O缓存一致性的可以表述如下:
在带有缓存的计算机汇总,I/O系统的目标应当是防止出现数据过期问题,同时尽可能减少干扰。