6.1 存储技术
6.1.1 随机访问存储器
随机访问存储器(Random-Access Memory,RAM)分为两类:静态的和动态的。静态(SRAM)比动态(DRAM)更快,但也贵很多。SRAM用来作为高速缓存存储器,既可以在CPU芯片上,也可以在片下。DRAM用来作为主存以及图形系统的帧缓冲区。典型的,一个桌面系统的SRAM不会超过几兆字节,但是DRAM却有几百或几千兆字节。
6.1.2 磁盘存储
磁盘是广为应用的保存大量数据的存储设备,存储数据的数量级可以达到几百到几千千兆字节,而基于RAM的存储器只能由几百或几千兆字节。不过,从磁盘上读取信息的时间为毫秒级,而从DRAM读取比从磁盘读快10万倍,从SRAM读比从磁盘读快100万倍。
设备可以自己执行读或者写总线事物,而不需要CPU的干涉的过程,称为直接存储器访问(Direct Memory Access),这种数据传送称为DMA传送。
6.1.3 固态硬盘
固态硬盘(Solid State Disk,SSD)是一种基于闪存的存储技术。一个SSD包由一个或多个闪存芯片和闪存翻译层组成,闪存芯片替代传统旋转磁盘中的机械驱动器,而闪存翻译层是一个硬件/固件设备,扮演与磁盘控制器相同的角色,将对逻辑块的请求翻译成对底层物理设备的访问。
6.2 局部性
一个编写良好的计算机程序常常具有良好的局部性。也即是说,它们倾向于引擎临近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。这种倾向性,被称为局部性原理(principle of locality),是一个持久的概念,对硬件和软件系统的设计和性能都有着极大的影响。
局部性通常有两种不同的形式,时间局部性(temporal locality)和空间局部性(spatial locality)。一般而言,有良好局部性的程序比局部性差的程序运行得更快。
小结:
- 重复引用同一个变量的程序有良好的时间局部性
- 对于具有步长为k的引擎模式的程序,步长越小,空间局部性越好。具有步长为1的应用模式的程序有很好的空间局部性。在存储器中以大步长跳来跳去的程序空间局部性会很差
- 对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环次数越多,局部性越好。
6.3 存储器层次结构
L0:寄存器
L1:L1高速缓存(SRAM)
L2:L2高速缓存(SRAM)
L3:L3高速缓存(SRAM)
L4:主存(DRAM)
L5:本地二级存储(磁盘)
L6:远程二级存储(分布式文件系统、Web服务器)
6.3.1 存储器层次结构中的缓存
高速缓存(cache)是一个小而快速的存储设备,它作为存储在更大、也更慢的设备中的数据对象的缓冲区域。层次结构总每一层都缓存来自较低一层的数据对象。
1.缓存命中
当程序需要第k+1层的某个数据对象d时,它首先在当前存储在第k层的一个块中查找d。当d刚好缓存在第k层中,就是我们所说的缓存命中(cache hit)。
2.缓存不命中
如果第k层中没有缓存数据对象d,就是我们所说的缓存不命中(cache miss)。当发生缓存不命中时,第k层的缓存从第k+1层缓存中取出包含d的那个块,如果第k层的缓存已经满了的话。可能就会覆盖现存的一个块。
覆盖一个现有的块的过程称为替换(replacing)或驱逐(evicting)这个块。被驱逐的这个块有时也称为牺牲块。决定该替换哪个块是由缓存的替换策略来控制的。如随机替换策略、最近最少被使用策略(LRU)。
3.缓存不命中的种类
强制性不命中(冷不命中):缓存中没有缓存任何数据对象
冲突不命中:由于限制性的放置策略引起的不命中
容量不命中:缓存的大小小于当前处理的工作集
4.缓存管理
缓存管理指某个东西要将缓存划分成块,在不同的层之间传送块,判定是命中还是不命中,并处理它们。如,编译器管理寄存器文件,L1、L2、L3层缓存完全是由内置在缓存中的硬件逻辑来管理的。