80386的缓存

大家都知道缓存是用来解决CPU与内存速度不匹配的问题的。80386是x86计算机中第一个配备了缓存的CPU.

CPU与内存速度的GAP

首先我们来看看这个GAP是否存在,以及是什么时候才开始存在的。

下面我们列一下8086、80286、80386的主频以及使用的内存性能。以下是在网上找到的两个表,分别对应各年代CPU的主频和DRAM的访存时间。来源:http://www.qdpma.com/CBO/InMemory.html

Year DRAM Density tRAC
1971 Intel 1103 1K 300ns
1973 TI TMS403 4K ?
1977 Mostek MK4116 16K 250ns
1980 ? 64K 200ns
1983 ? 256K 150ns
1986 ? 1M ?
1989 ? 4M 80ns
1992 ? 16M ?
1995 ? 64M ?

DRAM访问时间表

  MHz MIPS transistors process Year
Intel 4004 0.740 0.07 2,300 10µm 1971
Intel 8080 2 0.29 6,000 6µm 1974
Intel 8086 5 8 0.33 0.66 29,000 3µm 1978
Intel 80286 6 12.5 0.9 2.66 134,000 1.5µm 1982
Intel 80386DX 16 33 5 9.9 275,000 1µm 1985 1989
Intel 80486DX 25 50 20 41 1.2M 1µm 0.8µm 1989 1991
Intel 80486DX4 75 100 53 70.7 1.6M 0.6µm 1994
Intel Pentium (P5) 60 66 100 112 3.1M 0.8µm 1993
Intel Pentium (P54) 90 100 149.8 166.3 3.2M 0.6µm 1994
Intel Pentium (P54CS) 133 166 218.9 247 3.3M 0.35µm 1995 1996

CPU主频变化表

从表中可以看出,在80386发布的年代,内存的访存时间至少是大于80ns的,我们粗算一下的话,算为100ns,则一秒访存次数最多也就达到10M次,而80386的主频最高达到33MHz, 如果实时取指,内存已经达不到当时的CPU的需求了。

80386的缓存

由于当时内存的访问速度已经开始涉后于CPU的速度,用户要么花大价钱买最快的内存,要么接入一个外部Cache,要么采用直接用慢速度内存而使CPU的性能无法达到最大化。80386本来是想到L1 Cache放在CPU内部的,然后最终没有做成,转而支持外部Cache。80486做到了将L1 Cache(8KB)放到CPU内部,同时支持外接L2 Cache。

直到Pentium时代,由于Pentium采用了双路执行的超标量结构,有2条并行整数流水线,需要对数据和指令进行双重的访问,为了使得这些访问互不干涉,于是出现了8K数据Cache和8K指令Cache,即L1分指令Cache和数据Cache, 并且可以同时读写,不过L2还是外部的,接着出现的Pentium Pro为了提高性能,把L2内嵌了,到此为止,就确定了现代缓存的基本模式了,并一直沿用至今。

Cache能要发挥作用依赖于CPU访问数据时的所谓数据局布性,即如果你现在访部的是地址是A1,那么你有很大的概率接下来会访问A1前后的数据。因此,当CPU检测到你访问了A1上的数据之后,可以把A1附近的数据先取到Cache中来,由于Cache的访问速度很快,如果你下次访问的数据真的是已经取到Cache中的数据,那么这次访存就变得非常的快。