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中的数据,那么这次访存就变得非常的快。