# B.1 介绍

本附录是对内存层次结构的快速复习，包括缓存和虚拟内存的基础知识、性能方程和简单优化。第一节回顾以下36个术语：

| *缓存（cache）*                  | *全相连（fully associative）* | *写分配（write allocate）*    |
| ---------------------------- | ------------------------ | ------------------------ |
| *虚拟内存（virual memory）*        | *脏位（dirty bit）*          | *统一缓冲区（unified cache）*   |
| *内存滞怠周期 memory stall cycles* | *block offset*           | *misses per instruction* |
| *direct mapped*              | *write back*             | *块（block）*               |
| *valid bit*                  | *data cache*             | *locality*               |
| *block address*              | *hit time*               | *address trace*          |
| *write through*              | 缓存未命中（*cache miss）*      | *set*                    |
| *instruction cache*          | *page fault*             | *random replacement*     |
| *average memory access time* | *miss rate*              | *index field*            |
| *缓存命中（cache hit）*            | *n-way set associative*  | *no-write allocate*      |
| *page*                       | *least recently used*    | *write buffer*           |
| *miss penalty*               | *tag field*              | *write stall*            |

如果这篇回顾说得太快，你可能想看看《计算机组织与设计》中的第7章，那是我们为经验不足的读者写的。

缓存是对地址离开处理器后遇到的内存层次结构的最高或第一层的称呼。由于局部性原则适用于许多层次，而且利用局部性来提高性能是很流行的，所以现在只要采用缓冲来重用经常出现的项目，就会用到缓存这个词。这方面的例子包括文件缓存、名称缓存等等。

当处理器在缓冲区中找到一个请求的数据项时，它被称为缓存命中（cache hit）。当处理器在高速缓存中没有找到它所需要的数据项目时，就会发生缓存未命中（cache miss）。一个固定大小的包含所要求的字（word）的数据集合，被称为块（block）或行运行（line run），从主存储器中检索出来并放入高速缓存。时间局部性告诉我们，我们很可能在不久的将来再次需要这个字，所以把它放在高速缓存中是很有用的，因为它可以被快速访问。由于空间局部性，该块中的其他数据很有可能很快就会被需要。

缓存未命中所需的时间取决于内存的延迟和带宽两个因素。延迟决定了检索该块的第一个字的时间，而带宽决定了检索该块的其余部分的时间。缓存未命中由硬件处理，并导致使用顺序执行的处理器暂停，或停顿，直到数据可用。在非顺序执行中，使用该结果的指令仍然必须等待，其他指令可以未命中期间执行。

同样，并不是所有被程序引用的对象都需要驻留在主存储器中。虚拟内存意味着一些对象可能驻留在磁盘上。地址空间通常被分割成固定大小的块，称为页（pages）。在任何时候，每个页都驻留在主存或磁盘上。当处理器引用一个不在缓存或主存中的页内的目标时，就会发生页面故障（page fault），整个页面会从磁盘移到主存。由于页面故障需要很长时间，它们在软件中被处理，处理器不会停滞。在磁盘访问发生时，处理器通常会切换到其他任务。从高层次的角度来看，对引用局部性的依赖，以及缓存与主存的相对大小和每比特的相对成本，与主存与磁盘的关系相似。

图B.1显示了从高端台式机到低端服务器的计算机在内存层次结构中每一级的大小和访问时间的范围。

![图B.1 当我们远离大型工作站或小型服务器的处理器时，层次结构中的典型级别就会变慢和变大。 嵌入式计算机可能没有磁盘存储，内存和缓存小得多。对于第一层的文件存储而言，越来越多的FLASH正在取代磁盘。当我们移动到较低的层次时，访问时间会增加，这使得管理传输的响应速度降低是可行的。实现技术（ implementation technology）显示了用于这些功能的典型技术。访问时间以纳秒为单位给出了2017年的典型值；这些时间将随着时间的推移而减少。带宽是以内存层次结构中各层之间的兆字节/秒为单位给出的。磁盘/FLASH存储的带宽包括介质和缓冲接口。](https://3404518874-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCdXvFTNpUgIWBzBBchio%2Fuploads%2FmKYjRT5Sdf5EhjATn63W%2FNeatReader-1656492913257.png?alt=media\&token=e1694399-0dcb-4169-bba4-59c1cfd22876)
