概述
由于硬件技术的限制,我们可以制造出容量很小但很快的存储器,也可以制造出容量很大但很慢的存储器,但不可能两边的好处都占着,不可能制造出访问速度又快容量又大的存储器。因此,现代计算机都把存储器分成若干级,称为内存阶层(MemoryHierarchy),按照离CPU由近到远的顺序依次是CPU寄存器、Cache、内存、硬盘,越靠近CPU的存储器容量越小但访问速度越快。1
原理内存阶层是在电脑架构下储存系统阶层的排列顺序。每一层于下一层相比都拥有较高的速度和较低延迟性,以及较小的容量(也有少量例外,如AMD早期的DuronCPU)。
大部分现今的中央处理器的速度都非常的快。大部分程式工作量需要内存存取。由于快取的效率和内存传输位于阶层中的不同等级,所以实际上会限制处理的速度,导致中央处理器花费大量的时间等待内存I/O完成工作。
设计高性能需要考虑存储器层次的限制,即每个组件的大小和能力。可以将各个组件中的每一个都视为存储器层次(m1,m2,...,mn)的一部分,其中每个成员mi通常比分层结构的下一个最高成员mi+1更小且更快。为了限制高等级的等待,较低的等级将通过填充一个缓冲区来响应,然后发信号通知激活传输。
大部分电脑中的内存阶层如下:
暂存器–可能是最快的存取,但仅仅只有几百个字节。
第一级(L1)快取–通常存取只需要几个周期,通常是几十个KB。
第二级(L2)快取–比L1约有2到10倍较高延迟性,通常是几百个KB或更多。
第三级(L3)快取–(不一定有)比L2更高的延迟性,通常有数MB之大。
主内存(DRAM)–存取需要几百个周期,但可以大到数个GB。
磁盘储存–需要成千上百个周期,但是容量非常的大。2
内存阶层中技术的特点1.增加复杂性会降低内存层次结构。
2.CMOx内存技术延伸了内存层级中的Flash空间。
3.提高系统性能的主要途径之一是最小化存储器层次结构向操作数据的方向。
4.延迟和带宽是与缓存和缓存相关的两个度量。它们都不是统一的,而是特定于存储器层次结构的特定组件。
5.预测内存层次结构中数据所在的位置是很困难的。
6.内存层次中的位置决定了预取发生所需的时间。3
举例随着时间的推移,存储器层级中的级别数量以及每个级别的性能都有所提高。例如,大约在2013年的英特尔Haswell移动处理器的内存层次结构是:
处理器寄存器-最快的访问(通常是1个CPU周期),几千字节的大小。
高速缓存:
第0级(L0)微操作缓存-大小为6KiB。
第1级(L1)指令缓存-128KiB大小。
第1级(L1)数据缓存-128KiB大小。最佳访问速度约为700GiB/s。
第2级(L2)指令和数据(共享)-大小为1MiB。最佳访问速度约为200GiB/s。
第3级(L3)共享缓存-6MiB的大小。最佳访问速度约为100GB/s。
第4级(L4)共享缓存-128MiB大小。最佳访问速度约为40GB/s。
主内存(主存储)-千兆字节。最佳访问速度约为10GB/秒。对于NUMA机器,访问时间可能不统一磁盘存储(辅助存储)-TB级大小。截至2017年,最佳访问速度是从消费者固态硬盘大约是2000MB/秒。
近线存储(第三级存储)-最大可达EB级。截至2013年,最佳访问速度约为160MB/秒。
离线存储:
层次结构的较低级别(从磁盘向下)也称为分层存储。在线,近线和离线存储之间的正式区别是:
1.在线存储立即可用于I/O。
2.近线存储不是立即可用的,但是可以在不需要人工干预的情况下快速在线存储。
3.脱机存储不是立即可用,需要一些人工干预才能联机。
例如,永远在线的磁盘处于联机状态,而旋转空闲的磁盘(如空闲磁盘阵列(MAID))在近线处。可以自动加载的可移动介质(如磁带盒)(如磁带库中)是近线的,而必须手动加载的盒式磁带则处于脱机状态。
大多数现代CPU速度如此之快,以至于对于大多数程序工作量来说,瓶颈是存储器访问的参考位置以及层次结构不同级别之间缓存和内存传输的效率。因此,CPU花费大量时间闲置,等待内存I/O完成。这有时被称为空间成本,因为较大的内存对象更可能溢出一个小/快的水平,并要求使用较大/较慢的水平。记忆体使用中产生的负载称为压力(分别为记录压力,缓存压力和(主)记忆压力)。从较高级别丢失数据和从较低级别获取数据的条件分别是:寄存器溢出(由于注册压力:注册到缓存),缓存未命中(缓存到主内存)和(硬)页面错误(主内存到磁盘)。4
现代编程语言主要采用两级存储器,主存储器和磁盘存储器,尽管在汇编语言和内联汇编器等语言(如C)中,寄存器可以直接访问。要充分利用内存层次,需要程序员,硬件和编译器的协作(以及操作系统的底层支持):
1.程序员负责通过文件I/O在磁盘和内存之间移动数据。
2.硬件负责在内存和高速缓存之间移动数据。
3.优化编译器负责生成代码,执行时会使硬件高效地使用缓存和注册。
许多程序员都假设一个内存级别。这工作正常,直到应用程序击中性能墙。然后将在代码重构期间评估内存阶层。