内存缓存

内存缓存是一种高性能的缓存,也叫做静态内存。用在计算机主 RAM 的内存被称为动态内存。静态内存需要更多的电力,而且和动态内存比较起来更昂贵,物理上也更大,但是速度却要快很多。静态内存和 cpu 的时钟频率一致,然而动态内存确没有这个能力。

由于从 “外部世界” 获取数据会使 cpu 的在一个较低的时钟频率下工作,内存缓存的技术就派上用场了。当 cpu 从某个内存地址开始加载数据之后,会有一个称为内存缓存控制器的电路把 cpu 所需内存地址后的一整个数据块加载到内存缓存里。由于大多数的程序流都是顺序运行的,cpu 接下来需要获取的数据的内存地址也很可能位于刚刚开始加载的内存地址后面。由于,内存缓存控制器已经加载了第一个 cpu 要读的内存地址后的很多数据,接下来 cpu 要请求的数据也已经被加载进内存缓存中了,因此 cpu 不再需要去 “外部世界” 获取数据:数据已经被加载到嵌入 cpu 的内存缓存中,cpu 也就可以以内部时钟频率访问这些数据。

缓存控制器会一直观察正在载入数据的内存地址,并在刚刚读取的内存地址之后从几个内存地址上加载数据。这里有一个真实的例子,如果 cpu 加载数据的地址是 1000,缓存控制器将会加载 1000 后的 n 地址。这个 “n” 被称为 page;如果一个给定的缓存控制器会加载 4 kb 的 pages,它就会在当前读取的内存地址后加载 4096 地址的数据。By the way, 1 KB equals to 1,024 bytes, that’s why 4 KB is 4,096 not 4,000.

内存缓存 cpu_071

内存缓存的空间越大,cpu 所需数据被加载进内存缓存的几率就越大,因此 cpu 对于内存的直接访问次数就会变少,这就会提高系统性能(记住:每一次 cpu 需要直接访问 ram 内存的操作都会降低 cpu 的时钟频率。)

当 cpu 所需数据在缓存中时,我们称之为 命中,反之,当 cpu 所需数据不在缓存中时,我们称之为 丢失。

L1 和 L2 的意思是 “Level 1” 和 “Level 2”,它们分别指的是距离 cpu 核心(执行单元)的距离。一个很普遍的疑问是为什么会有三个独立的内存缓存 (L1 数据缓存, L1 指令缓存 and L2 缓存). 仔细看在 一节中的图,你会发现 L1 指令缓存作为一个 “输入缓存”,而 L1 数据缓存是作为一个 “输出缓存”。L1 指令缓存 -- 通常小于 L2 缓存,在程序开始重复一个小的循环时是特别有效率的,因为所需执行的指令会离调用单元更近。

在 CPU 的规格页面上,可以使用不同种类的表示找到 L1 缓存。有些制造商分别列出了两个 L1 缓存(有时称指令缓存为 “I” 数据缓存为 “D”),有些制造商把两个 L1 缓存合在一起,并写上了 “separated” -- 因此 “128 KB, separated” 就是指 64 KB 指令缓存 and 64 KB 数据缓存,有些制造商只是简单的把两个 L1 缓存合在一起,你只能猜测这个是总数,并且除以 2 获得每个缓存的容量。The exception, however, goes to the Pentium 4 and newer Celeron CPUs based on sockets 478 and 775.

Pentium 4 processors (and Celeron processors using sockets 478 and 775) 并没有 L1 指令缓存, 而它们有跟踪执行缓存 (trace execution cache), 这个缓存位于 cpu 解码单元(decode unit) 和执行单元(execution unit)之间. 所有,L1 指令缓存存在,但是有了不一样的名字和不一样的位置. 我们在这里提到这个是因为一个很常见的错误是认为 Pentium 4 处理器没有 L1 指令缓存. 因此当我们比较 Pentium 4 和其他 CPUs 时,人们会以为 Pentium 4 的 L1 缓存小了很多,因为只有 8kb 的 L1 数据缓存。Pentium 4 和 Celeron CPUs 的跟踪执行缓存 (trace execution cache) 有 150 KB 也应该算在 L1 缓存中.

results matching ""

    No results matching ""