深入理解计算机系统学习笔记

1.存储器层次结构

存储技术:不同存储技术的访问时间差异很大。速度较快的技术每字节的成本要比速度较慢的技术高,而且容量较小。CPU和主存之间的速度差距在增大。

计算机软件:一个编写良好的程序倾向于展示出良好的局部性。

硬件和软件的这些基本属性互相补充得很完美。它们这种相互 补充的性质使人想到一种组织存储器系统的方法,称为存储器层次结构(memory hierarchy), 所有的现代计算机系统中都使用了这种方法。

图中展示了一个典型的存储器层次结构。一般而言,从高层往底层走,存储设备变得更慢、更便宜和更大。

2.存储器层次结构中的缓存

高速缓存(cache, 读作 “cash”)是一个小而快速的存储设备,它作为存储在更大、也更慢的设备中的数据对象的缓冲区域。使用高速缓存的过程称为缓存(caching, 读作 “cashing”)。

存储器层次结构的中心思想是,对于每个K,位于K层的更快更小的存储设备作为位于 K+1层的更大更慢的存储设备的缓存。

下图展示了存储器层次结构中缓存的一般性概念。第K+1层的存储器被划分成连续的数据对象组块(chunk),称为块(block)。

每个块都有一个唯一的地址或名字,使之区别于其他的块。块可以是固定大小的,也可以是可变大小的。

数据总是以块大小为传送单元(transfer unit)在第K层和第K+1 层之间来回复制的。 虽然在层次结构中任何一对相邻的层次之间块大小是同定的,但是其他的层次对之间可以有不同的块大小。

一般而言,层次结构中较低层(离 CPU 较远)的设备的访问时间较长,因此为了补偿这些较长的访问时间,倾向于使用较大的块。

(1)缓存命中

当程序需要第K+1层的某个数据对象d时,它首先在当前存储在第K层的一个块中查找d。如果d刚好缓存在第K层中,那么就是我们所说的缓存命中(cache hit)。

(2)缓存不命中

另一方面,如果第K层中没有缓存数据对象那么就是我们所说的缓存不命中 ( cache miss)。当发生缓存不命中时,第K层的缓存从第K+1层缓存中取出包含d的那个块,如果第K层的缓存已经满了,可能就会覆盖现存的一个块。

覆盖一个现存的块的过程称为替换(replacing)或驱逐(evicting)这个块。被驱逐的这个块有时也称为牺牲块(victim block)。决定该替换哪个块是由缓存的替换策略(replacement policy)来控制的。

(3)缓存不命中的种类

如果第K层的缓存是空的,那么对任何数据对象的访问都会不命中。一个空的缓存有时被称为冷缓存(cold cache), 此类不命中称为强制性不命中(compulsory miss)或冷不命中(cold miss)。

只要发生了不命中,第K层的缓存就必须执行某个放置策略(placement policy),确定把它从第K+1层中取出的块放在哪里。

硬件缓存通常使用的是更严格的放置策略,这个策略将第K+1层的某个块限制放置在第K层块的一个小的子集中(有时只是一个块)。这种限制性的放置策略会引起一种不命中,称为冲突不命中(conflict miss),在这种情况中,缓存足够大,能够保存被引用的数据对象,但是因为这些对象会映射到同一个缓存块,缓存会一直不命中。

(4) 缓存管理

存储器层次结构的本质是,每一层存储设备都是较低一层的缓存。在每一层上,某种形式的逻辑必须管理缓存。

3. 存储器层次结构概念小结

存储器层次结构行之有效,是因为较慢的存储设备比较快的存储设备更便宜,还因为程序倾向于展示局部性:

利用时间局部性:由于时间局部性,同一数据对象可能会被多次使用。一旦一个数 据对象在第一次不命中时被复制到缓存中,我们就会期望后面对该目标有一系列的访问命中。因为缓存比低一层的存储设备更快,对后面的命中的服务会比最开始的不命中快很多。

利用空间局部性:块通常包含有多个数据对象。由于空间局部性,我们会期望后面对该块中其他对象的访问能够补偿不命中后复制该块的花费。

缓存在现在计算机系统运营如下图:

4.高速缓存存储器

早期计算机系统的存储器层次结构只有三层:

CPU寄存器、DRAM主存储器和磁盘存储。

由于CPU和主存之间逐渐增大的差距,系统设计者被迫在CPU寄存器文件和主存之间插入了一个小的SRAM高速缓存存储器,称为 L1 高速缓存(一级缓存),如图6-24 所示。

随着CPU 和主存之间的性能差距不断増大,又设计出了为L2 高速缓存和L3 高速缓存。

5.通用的高速缓存存储器组织结构

考虑一个计算机系统,其中每个存储器地址有m位,形成M=2的m次方个不同的地址。如图6-25a 所示,这样一个机器的高速缓存被组织成一个有S=2的s次方个高速缓存组(cacheset)的数组。每个组包含E个高速缓存行(cache line)。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-18 08:40:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-18 08:40:04       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-18 08:40:04       82 阅读
  4. Python语言-面向对象

    2024-03-18 08:40:04       91 阅读

热门阅读

  1. Euler angles and Quaterean

    2024-03-18 08:40:04       38 阅读
  2. Leetcode 第388场周赛 问题和解法

    2024-03-18 08:40:04       42 阅读
  3. Redis 的数据类型及使用场景

    2024-03-18 08:40:04       37 阅读
  4. PyTorch学习笔记之激活函数篇(六)

    2024-03-18 08:40:04       37 阅读
  5. redis常见面试题

    2024-03-18 08:40:04       40 阅读
  6. Bean的实例化方式

    2024-03-18 08:40:04       39 阅读
  7. 在类Unix平台实现TCP客户端

    2024-03-18 08:40:04       32 阅读
  8. mysql提权总结(自学)

    2024-03-18 08:40:04       40 阅读
  9. 基于深度学习的车辆检测技术

    2024-03-18 08:40:04       37 阅读
  10. 程序分享--排序算法--桶排序

    2024-03-18 08:40:04       46 阅读
  11. 《C++ Primer Plus》第六章课后题

    2024-03-18 08:40:04       32 阅读