当前位置:首页 » 硬盘大全 » 共享高速缓存可以避免吗
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

共享高速缓存可以避免吗

发布时间: 2022-12-10 07:55:12

⑴ 主存储器和cpu之间增加高速缓冲存储器的目的

CPU处理速度快,但主存储器速度慢,需要与CPU联系更紧密的高速缓存,作为数据中转的桥梁。CPU处理好的或需要处理的数据放在高速缓存中,避免CPU直接与慢速存储器打交道,可以更高效地工作。

⑵ CPU与高速缓存(数据库

什么是高速缓存技术:
高速缓存英文是cache。一种特殊的存储器子系统,其中复制了频繁使用的数据,以利于CPU快速访问。存储器的高速缓冲存储器存储了频繁访问的 RAM 位置的内容及这些数据项的存储地址。当处理器引用存储器中的某地址时,高速缓冲存储器便检查是否存有该地址。如果存有该地址,则将数据返回处理器;如果没有保存该地址,则进行常规的存储器访问。因为高速缓冲存储器总是比主RAM 存储器速度快,所以当 RAM 的访问速度低于微处理器的速度时,常使用高速缓冲存储器。

高速缓存的作用:
在CPU开始执行任何指令之前,都会首先从内存中取得该条指令以及其它一些相关数据和信息。为了加快CPU的运行速度,几乎所有的芯片都采用两种不同类型的内部存储器,即高速缓存。缓存被用来临时存放一些经常被使用的程序片段或数据。
一级高速缓存是性能最好缓存类型,与解释指令和执行算术运算的处理单元一到构成CPU的核心。CPU可以在全速运行的状态下读取存放在一级高速缓存中的指令或数据。Intel的处理器产品一般都会具有32K的一级缓存,而象AMD或Via这种竞争对手的产品则会使用更多的一级缓存。
如果在一级缓存中没有找到所需要的指令或数据,处理器会查看容量更大的二级缓存。二级缓存既可以被集成到CPU芯片内部,也可以作为外部缓存。Pentium II处理器具有512K的二级缓存,工作速度相当于CPU速度的一半。Celeron以及更新的Pentium III芯片则分别具有128K和256K的在片二级缓存,能够在处理器全速下运行。
对于存放在速度较慢的二级缓存中的指令或数据,处理器往往需要等待2到4个时钟周期。为了充分利用计算资源,CPU可以在这段时间内查看和执行其它正在等候处理,但不需要使用额外数据的指令,从而提高整个系统的速度,把空闲时间降低到最低程度。

⑶ 何谓’高速缓存’高速缓存=RAM吗详见问题补充说明

1,高速缓存(Cache),全称“高速缓冲存储器”。

2,例如:当CPU处理数据时,它会先到高速缓存中去寻找,如果数据因之前的操作已经读取而被暂存其中,就不需要再从主内存中读取数据——由于CPU的运行速度一般比主内存快,因此若要经常存取主内存的话,就必须等待数个CPU周期从而造成浪费。

3,提供“高速缓存”的目的是为了让数据存取的速度适应CPU的处理速度,其基于的原理是内存中“程序执行与数据访问的局域性行为”。

4,现在Cache的概念已经被扩充了:不仅在CPU和主内存之间有Cache,而且在内存和硬盘之间也有Cache(磁盘高速缓存),乃至在硬盘与网络之间也有某种意义上的“Cache”(Internet临时文件夹)。

5,凡是位于速度相差较大的两种硬件之间的,用于协调两者数据传输速度差异的结构,均可称之为Cache。

6,所以硬盘和内存之间的Cache就叫做磁盘高速缓存。它是在内存中开辟一块位置,来临时存取硬盘中的数据。这项技术可使计算机读写时的存储系统平均数据传输率提高5-10倍,适应了当前激增的海量数据存储需求。

7,在DOS时代,我们用:
smartdrv 内存容量
命令来加载硬盘高速缓存。自从有了Windows后,我们就不需要加载硬盘高速缓存了,因为Windows本身有自己的高速缓存管理单元,如果强行使用smartdrv命令加载,反而会影响Windows的性能。

8,我们在用硬盘安装Win2000/XP时候,系统会提示加载高速缓存,这是因为在安装的初期还是DOS操作,所以为了达到读存的速度,安装程序要求加载高速缓存。

⑷ 高速跟踪缓存是什么

、高速缓存的概念和原理

1、高速缓存出现的原因
高速缓存(Cache)的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。为了减少这种情况的发生,人们就想到了使用Cache,它采用一种读写速度要比系统内存快很多的特殊静态内存。系统工作时,将运行时要经常存取的一些数据从系统内存读取到Cache中,而CPU会首先到Cache中去读取或写入数据,如果Cache中没有所需数据(或Cache已满,无法再写入),则再对系统内存进行读写,另外Cache在空闲时也会与内存交换数据。其实质就是是在慢速DRAM和快速CPU之间插入一速度较快、容量较小的SRAM,起到缓冲作用,使CPU既可以以较快速度存取SRAM中的数据,提高系统整体性能,又不使系统成本上升过高。

2、高速缓存的工作原理
Cache的工作原理是基于计算机程序访问的局部性。对大量典型程序运行情况的分析结果表明,在一个较短的时间间隔内,由程序产生的地址往往集中在存储器逻辑地址空间的很小范围内。对这些地址的访问具有时间上集中分布的倾向。数据分布以及工作单元的选择都可以使存储器地址相对集中。这种对局部范围的存储器地址频繁访问,而对此范围以外的地址则访问甚少的现象,就称为程序访问的局部性。根据程序的局部性原理,就为Cache的存在提供了理论依据,系统正是依据此原理,不断地将与当前指令集相关联的一个不太大的后继指令集从内存读到Cache,然后再与CPU高速传送,从而达到速度匹配。

3、高速缓存的分级结构

CPU高速缓存是分级构造的,一般由L1和L2两极构成,通常L1 Cache的速度最快,与CPU核心的距离也最近,但容量较小,而L2 Cache 速度稍慢,但容量较大。Cache采用分级结构的主要理由在于:对于一个典型的一级缓存系统的80%的内存申请都发生在CPU内部,只有20%的内存申请是与外部内存打交道。而这20%的外部内存申请中的80%又与二级缓存打交道。因此,采用分级结构将更加有利于效能的提升和成本的合理分配。

这种分层的高速缓存布局有助于弥合处理器与系统内存速度之间不断加大的差距,处理器速度每年大约提高50%,而DRAM存取速度每年仅提高5%,由于性能不匹配程度的加剧,CPU将增加第三级,甚至第四级高速缓存。

4、高速缓存的构成
目前Cache基本上都是采用SRAM存储器,SRAM是英文Static RAM的缩写,它是一种具有静志存取功能的内存,不需要刷新电路即能保存它内部存储的数据。不像DRAM内存那样需要刷新电路,每隔一段时间,固定要对DRAM刷新充电一次,否则内部的数据即会消失,因此SRAM具有较高的性能,但是SRAM也有它的缺点,即它的集成度较低,相同容量的DRAM内存可以设计为较小的体积,但是SRAM却需要很大的体积,这也是目前不能将Cache容量做得太大的重要原因。它的特点归纳如下:优点,节能、速度快,不必配合内存刷新电路,可提高整体的工作效率。 缺点,集成度低,相同的容量体积较大,而且价格较高,少量用于关键性系统以提高效率。

二、CPU 高速缓存的发展历史
高速缓存最初应用在CPU领域,目前在CPU领域的应用也最为广泛和深入。下面就简单谈谈高速缓存随CPU的发展而不断变化的历史过程。

1、80486开始出现了内部Cache
PC在诞生的初期并不存在Cache的概念,由于CPU主频很低,DRAM的存取时间甚至快于CPU存取时间,因此无需Cache。 80386时代开始出现了外部Cache。在80486时代CPU内部才正式出现了Cache。实际上80486就是由更高主频的80386 加80387数字协处理器以及8kB 内部Cache构成。80486芯片内由8kB的Cache来存放指令和数据。同时,80486也可以使用处理器外部的第二级Cache,用以改善系统性能并降低80486要求的总线带宽。

2、Peutium时代Cache技术发展迅速
Peutium不仅分离L1 Cache和L2 Cache ,而且由于Pentium处理器采用了超标量结构双路执行的流水线,有2条并行整数流水线,处理器也需要对命令和数据进进双倍的访问。为使这些访问不互相干涉,Intel把在486上共用的内部Cache,分成2个彼此独立的8kB代码Cache和8kB数据Cache,这两个Cache可以同时被访问。这种双路高速缓存结构减少了争用Cache所造成的冲突,提高了处理器效能。Pentium的Cache还采用了回写写入方式,这同486的贯穿写入方式相比,可以增加Cache的命中率。此外,还采用了一种称为MESI高速缓存一致性协议,为确保多处理器环境下的数据一致性提供了保证。在Pentium MMX中更是增大了L1的容量,并改进了相关的算法。

3、Pentium Pro出现内嵌式L2 Cache

为使Pentium Pro的性能超过Pentium,必需使用创新的设计方法,Pentium Pro使用了内嵌式L2 Cache,大小为512kB。此时的L2已经用线路直接连到CPU上,好处就是减少了对L1 Cache的需求。L2 Cache与CPU同步运行。当L1 Cache不命中时,立刻访问L2 Cache,不产生附加延迟。为进一步减少因要访问的信息不在高速缓冲中时所带来的性能损失,Pentium Pro的L1和L2都设计成非锁定型。即当哪个Cache中没有CPU所需的信息时,它不妨碍后面访问Cache的处理过程。但限于当时的CPU制造工艺,Pentium Pro的内嵌式L2 Cache 良品率太低,生产成本过高, Pentium Pro成为一款寿命短暂的过渡产品。

4、PentiumⅡ的双重独立总线
PentiumⅡ是Pentium Pro的改进型,具有MMX指令,使用动态执行技术,采用双独立总线结构。PentiumⅡ同样有2级Cache,L1为32kB(指令和数据Cache各16kB)是Pentium Pro的一倍。L2为512kB。
Pentium Ⅱ与Pentium Pro在L2 Cache 的不同主要在于L2 Cache已不在内嵌芯片上,而是与CPU通过专用64位高速缓存总线相联,与其它元器件共同被组装在同一基板上,即“单边接触盒”上。双独立总线结构就是:L2高速缓存总线和处理器至主内存的系统总线, PentiumⅡ处理器可以同时使用这两条总线,与单一总线结构的处理器相比,该处理器可以进出两倍多的数据。

5、PentiumⅢ L2 Cache进一步改进
PentiumⅢ也是基于Pentium Pro结构为核心,在原有MMX多媒体指令的基础上,又增了70多条多媒体指令。它使用动态执行技术,采用双独立总线结构。 PentiumⅢ具有32kB非锁定L1 Cache和512kB非锁定L2 Cache。L2可扩充到1~2MB,具有更合理的内存管理,可以有效地对大于L2缓存的数据块进行处理,使CPU、Cache和主存存取更趋合理,提高了系统整体性能。在执行大数据流量程序时,高效率的高速缓存管理使PⅢ避免了对L2 Cache的不必要的存取。由于消除了缓冲失败,多媒体和其它对时间敏感的操作性能更高了。对于可缓存的内容,PⅢ通过预先读取期望的数据到高速缓存里来提高速度,这一特色提高了高速缓存的命中率,减少了存取时间。

三、其他配件中的高速缓存
Cache从本质上说是一种高速设备和低速设备的速度匹配技术,不仅用在提高CPU对内存的读写速度上,而且在电脑的其它配件中也得到了广泛应用。在较慢速的其它外围设备和内存的数据交换中,甚至在网络通讯中,都需要使用Cache技术。推而广之,凡是在传输速度有较大差异的设备之间,都可以利用Cache的速度匹配技术。

1、主板高速缓存
由于在Pentium II推出之前,CPU只有内部集成的L1 Cache(一级高速缓存),L2Cache(二级高速缓存)都被放置在主板上。Pentium时代的主板上大都用速度较快,容量较大的同步PB SRAM (Pipeline Burst SRAM 管线突发式静态内存),一般为256KB或512KB。当时在主板上还存在Tag SRAM的概念。

Tag SRAM,即标记的静态随机存取存储器,它是在高速缓存系统中配合高速缓存的附加SRAM,它也是高速缓存,只是用在高速缓存电路中记录地址数据,当CPU要读取主存某一个地址中的数据时,会先到高速缓存电路中去寻找,对高速缓存系统的Tag SRAM所记录的地址数据进行搜寻和对比,当高速缓存内也存有此地址的数据时,高速缓存总线的仲裁控制电路即将数据读取传回CPU,若对比Tag SRAM记录的地址数据而找不到此数据的地址时,CPU就会到主存读取数据。因此Tag SRAM与高速缓存的命中率有很大关系。由于现在CPU内部都集成了L2 Cache,故PII以后,主板上都不再集成Cache了。

2、CPU高速缓存的应用
关于CPU高速缓存的发展历史等相关情况,前面已经谈及。这里主要介绍一下目前主流CPU使用高速缓存的情况。

象最新的Northwood P4处理器,不仅采用了0.13 微米工艺生产,其体系结构也有所改变,提高了运算效率(指令周期)。 并且将L2 CACHE的容量由老P4的256K 增加为512K。在性能上有10%左右的提升。

Tualatin 赛扬的二级缓存采用了全速256KB(8路), Pentium III同样大小的二级缓存,这对于提高CPU的性能有很大的帮助。Tualatin核心赛扬的性能非常不错,在很大程度上就是得益于256KB的全速缓存。这也充分反映出高速缓存对电脑配件性能的影响。

AMD 的Morgan实际上和Palomino核心的毒龙规格相同,只是CPU内部L2 Cache有所不同。最引人注意的一点是改进了Cache算法。在Morgan中包含了一个硬件化的数据预读取规则。这个功能就是在CPU对数据进行了处理之后,预读取设备可以猜测哪些数据是CPU所需要的。如果这些数据并没有在Cache中,那么这个预读取设备就会自动到主内存中去重新获取这个数据;而如果这个数据已经存在于Cache之中的话,那么CPU就会更加快速地得到这个数据。

Athlon XP无疑是AMD今年最成功的产品,它采用了类似于Pentium 4的硬件预读技术--执行跟踪高速缓存,预先将处理器可能需要的数据从主内存读到缓存中,这一过程能明显提高系统总线和内存带宽的利用率,进而提升系统性能。

主要用于服务器的Merced 对Cache的要求更高了。为此,lntel在芯片内开发新的Cache,并增加L1 Cache的容量,来平衡CPU和DRAM间的速度。为此,在Merced的片上最接近执行单元旁再设另一处Cache,称为L0缓存,是指令/数据分离型。由于L0Cache在物理位置上比L1离执行单元更近,布线距离的缩短,使它与执行单元间的数据交换速度比L1还快,可以进一步提高工作主频。 同时,还要在芯片内部配置超过1MB的大容量L1 Cache。芯片内部Cache比外部Cache更易于提升与执行单元间的数据传送速度。

3、硬盘高速缓存

在PC的磁盘系统中,高速缓存也得到了广泛应用。为提高内存对硬盘的读写速度,就要建立磁盘高速缓存,不过硬盘高速缓存不必使用昂贵的SRAM,使用普通的DRAM即可,因为DRAM内存的存取速度对CPU来说较慢,但对磁盘的存取速度却是很快的。这是因为磁盘存储系统包含有磁头的机械运动,而机械运动无法跟传送电信号的电子速度相比。以前硬盘内部集成的高速缓存只有512K左右,而现在硬盘普遍将高速缓存的容量提升到2M以上,个别产品甚至达到了8M。由于硬盘Cache无需使用高速的SRAM,除了内部集成的SDRAM,我们还可以在系统主内存中划出一个区域,作为专用的磁盘缓冲区,采用一定的数据结构,即可实现磁盘存取的二级Cache技术。硬盘高速缓存的工作过程及原理与CPU高速缓存类似,也是把即将访问的数据整块地拷贝到高速缓存区中,然后内存再到高速缓存中去逐个读取数据。由于数据在RAM空间内部传送要比在RAM与磁盘间传送快得多,从而系统由此提高了存取速度。

下面给大家介绍一下西数WD1000BB-SE 8MB缓存硬盘,由于内存的读写速度大大高于硬盘的读写速度,因此大容量的缓存可以有效提高存储器的数据传输速度。但目前市面所售的大部分硬盘都只带512K--2MB的缓存。西数前段时间推出的7200转,100G硬盘特别版WD1000BB-SE,其单碟容量为33G,接口类型为ATA100,平均寻道时间8.9毫秒,这方面参数与其他硬盘相比并无特别,不过WD1000BB-SE将硬盘的缓存容量从2MB直接提升到了8MB。引起了业界的普遍关注。经过多方面评测,由于缓存容量的加大,这款IDE接口硬盘的实际性能已经接近或超越了不少10000转SCSI接口硬盘,成为IDE硬盘中的速度王者。这也充分反映出高速缓存对电脑配件性能的影响。

4、刻录机的缓存
缓存容量的大小是衡量光盘刻录机性能的重要技术指标之一,刻录时数据必须先写入缓存,刻录软件再从缓存区调用要刻录的数据,在刻录的同时后续的数据再写入缓存中,以保持要写入数据良好的组织和连续传输。如果后续数据没有及时写入缓冲区,传输的中断则将导致刻录失败。因而缓冲的容量越大,刻录的成功率就越高。市场上的光盘刻录机的缓存容量一般在1MB~4MB之间,目前最大的有8M缓存的产品。尤其对于IDE接口的刻录机,缓存容量很重要。增加高速缓存既有利于刻录机的稳定工作,同时也有利于降低CPU的占用率。 总之缓存大小对刻录机是非常的重要的,缓存越大刻录时就越稳定。目前市场上有多款刻录机都带有8M缓存,配合其他防刻死技术,有效防止了出现“缓存欠载”导致刻录失败的问题。

在普通光驱中也内置有高速缓存,当然其作用没有刻录机中的重要,主要是为了提高读盘效率,降低CPU占用率,因此容量也比较小,一般只有512K。

5、其他设备的高速缓存
在PC其他配件中也都存在高速缓存的应用。比如在显示系统中,由于3D应用的迅猛发展,现在显卡上的显示内存普遍达到了32M以上,甚至多达128M,因此也广泛使用着高速缓存技术,如前台缓存、后台缓存、深度缓存和纹理缓存等。

现在还有所谓CDRAM(Cache DRAM) 带高速缓存的内存,就是在内存芯片上集成了特殊构造的SRAM。发展好的话过几年有可能成为主流内存。除此之外,甚至在声卡、RAID卡、SCSI卡中也带有高速缓存,

四、高速缓存的调整及应用

1、BIOS中与高速缓存有关的选项

1)Video ROM的Shadow
“影子”内存(ShadowRAM,或称ROMShadow)是为了提高系统效率而采用的一种专门Cache技术,它把系统主板上的系统ROMBIOS和适配器卡上的视频ROMBIOS等拷贝到系统RAM内存中去运行,其地址仍使用它们在上位内存中占用的原地址。更确切地说,是从扩展内存中拿出一部分物理存储空间,而赋以ROM的原地址,由这部分扩展RAM代替原ROM。由于ROM采用静态CMOS电路,其存取速度为200ns左右,而系统存储器RAM采用动态CMOS电路,其存取速度进几十ns,速度快好几倍,将存放在ROM中的BIOS代码(基本输入输出例行程序,它们在系统运行期间非常频繁的被调用)拷贝到系统RAM中去,就可提高系统运行和显示的速度和效率。

2)CPU Internal Cache
CPU内部快速缓存是否打开,一般设置为Enable。Enternal Cache:是否使用主板缓存,一般设置为Enable。CPU L2 Cache Ecc Checking:CPU的L2 缓存Ecc 检测,可设置为Disable。

从字面上看,“CPU Internal Cache”和“External Cache”分别指CPU内部和外部的高速缓存,但更准确的说法应该是一级缓存和二级缓存。Socket/Super 7架构的CPU内部只有一级缓存,二级缓存放在了主板上,“Internal”和“External”的说法就源于此,而对PⅡ、PⅢ和K6-Ⅲ等CPU来说,二级缓存也被集成到CPU内部,内外部的说法就不太确切了,因此一些Slot 1主板对此进行了修改,改称为“CPU Level 1 Cache”和“CPU Level 2 Cache”。除非打开后系统会出现死机等情况,否则这两个选项都应设为Enabled,以加快CPU读取内存的速度。

3)二级缓存的潜伏期

在BIOS中,我们还可以调节二级缓存的潜伏期,其中Level 2 Cache Latency(二级缓存潜伏期)有16个值可选(1~15),从理论上来说,数值越小延迟时间越短,性能也越高。如果把数值设得过小,二级缓存有可能停止工作,不仅系统性能会急速下跌,还会发生死机现象。L2 Cache对内存带宽有重大影响,即使CPU频率再高,其它设备跟不上亦是无用,增加缓存潜伏期可以让机器更稳定,避免上述情况。

4)System BIOS Cacheable

“System BIOS Cacheable”、“Video BIOS Cacheable”和“Video RAM Cacheable”分别指定是否可以使用二级高速缓存来缓存系统BIOS、显卡BIOS和显示内存,缓存之后,BIOS调用的执行速度以及访问显示内存的速度都会加快,因此最好都设成Enabled。不过,当显示内存可以被缓存时,少数显卡可能会出现兼容性问题,此时可考虑将第三项设为Disabled。

2、调整高速缓存优化系统
如果你的应用程序需频繁访问硬盘,可在扩充或扩展内存中建立“直接写盘(write-through)”型磁盘高速缓存。用户可在autoexec.bat文件中加入命令行:c:\dos\smartdrv.exe,则此驱动程序会自动装入内存高端,其磁盘缓冲区缺省值为256KB,你可以改变这个值的大小。一般设置为物理内存的1/8左右比较合适。SMARTDRV.EXE一个外部设备驱动程序。用此程序可启动或设置磁盘高速缓冲存储器。与Cache不同,Cache是充分发挥了CPU的速度,而SMARTDRV是加快了磁盘的读写速度。在实际应用中,SMARTDRV.EXT高速缓存驱动程序将记住每次应用程序使用磁盘的磁盘扇区数据,不用再访问磁盘驱动器,而是访问内存中已包含这些数据的区域。

总的来说,PC中的Cache主要是为了解决高速设备和低速设备间速度匹配的问题,是提高系统性能,降低系统成本而采用的一项技术。随着电脑技术的飞速发展, Cache已成为PC中大多数配件不可缺少的组成部分,是衡量系统性能优劣的一项重要指标。从系统的性价比考虑,Cache的配备将在很长一段时间内仍然是PC中重要的技术之一。

⑸ 共享存储区通信有哪些优点使用上有哪些限制

共享存储区通信的优点有:常用的集中式多处理机使用的通信机制兼容。

限制有:是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

共享存储是指两个或多个处理机共用一个主存储器的并行体系结构。每一个处理机都可以把信息存入主存储器,或从中取出信息。处理机之间的通信通过访问共享存储器来实现。

系统结构

1、无高速缓冲存储器的集中式

这种结构的处理机没有高速缓冲存储器,多个处理机通过交叉开关或多级互联网络等直接访问共享存储器。由于任一存储单元在系统中只有一个备份,这类系统不存在高速缓冲存储器一致性问题,系统的可伸缩性受限于交叉开关或多级互联网络的带宽。

2、基于高速缓冲存储器的集中式

在这种结构的系统中,每个处理机都有高速缓冲存储器,多个处理机一般通过总线与存储器相连。每个处理机的高速缓冲存储器通过侦听总线来维持数据一致性。

3、具有高速缓冲存储器一致性的分布式

这种结构称为高速缓冲存储器一致的非均匀存储访问结构。这类系统的共享存储器分布于符结点之间。结点之间通过可伸缩性好的互联网络相连,每个处理机都能缓存共享单元,高速缓冲存储器一致性的维护是这类系统的关键,决定着系统的可伸缩性。

4、唯高速缓冲存储器的分布式

在这种结构中,每个结点的存储器相当于一个大容量的高速缓冲存储器,数据一致性也在这一级维护。这种系统的共享存储器的地址是活动的。存储单元与物理地址分离,数据可以根据访存模式动态地在各结点的存储器间移动和复制。

5、无高速缓冲存储器一致性的分布式

这种结构称为无高速缓冲存储器一致性的非均匀存储访问结构。它的特点是虽然每个处理机都有高速缓冲存储器,但硬件不负责维护高速缓冲存储器一致性,而由编译器或程序员来维护。

⑹ CPU Cache

title: CPU Cache
date: 2019-11-17 20:20:30
keywords: cache "CPU cache" "三级缓存" 缓存映射 cache原理 多级cache TLB

  引入 Cache 的理论基础是程序局部性原理,包括时间局部性和空间局部性。时间局部性原理即最近被CPU访问的数据,短期内CPU 还要访问(时间);空间局部性即被CPU访问的数据附近的数据,CPU短期内还要访问(空间)。因此如果将刚刚访问过的数据缓存在一个速度比主存快得多的存储中,那下次访问时,可以直接从这个存储中取,其速度可以得到数量级的提高。

  CPU缓存是(Cache Memory)位于CPU与内存之间的临时存储器,它的容量比内存小但交换速度快。在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开内存直接从缓存中调用,从而加快读取速度。

  在CPU中加入缓存是一种高效的解决方案,是对于存储器件成本更低,速度更快这两个互相矛盾的目标的一个最优解决方案,这样整个内存储器(缓存+内存)就变成了既有缓存的高速度,又有内存的大容量的存储系统了。缓存对CPU的性能影响很大,主要是因为CPU的数据交换顺序和CPU与缓存间的带宽引起的。
下图是一个典型的存储器层次结构,我们可以看到一共使用了三级缓存

各级存储访问延迟的对比

  介于CPU和主存储器间的高速小容量存储器,由静态存储芯片SRAM组成,容量较小但比主存DRAM技术更加昂贵而快速, 接近于CPU的速度。CPU往往需要重复读取同样的数据块, Cache的引入与缓存容量的增大,可以大幅提升CPU内部读取数据的命中率,从而提高系统性能。通常由高速存储器、联想存储器、地址转换部件、替换部件等组成。如图所示。

  早期采用外部(Off-chip)Cache,不做在CPU内而是独立设置一个Cache。现在采用片内(On-chip)Cache,将Cache和CPU作在一个芯片上,且采用多级Cache,同时使用L1 Cache和L2 Cache,甚至有L3 Cache。

  上图显示了最简单的缓存配置。它对应着最早期使用CPU cache的系统的架构。CPU内核不再直接连接到主内存。所有的数据加载和存储都必须经过缓存。CPU核心与缓存之间的连接是一种特殊的快速连接。在一个简化的表示中,主存和高速缓存连接到系统总线,该系统总线也可用于与系统的其他组件进行通信。我们引入了系统总线(现代叫做“FSB”)。
引入缓存后不久,系统变得更加复杂。高速缓存和主存之间的速度差异再次增大,使得另一个级别的高速缓存不得不被添加进来,它比第一级高速缓存更大且更慢。出于经济原因,仅增加第一级缓存的大小不是一种选择。今天,甚至有机器在生产环境中使用了三级缓存。带有这种处理器的系统如图下所示。随着单个CPU的内核数量的增加,未来的缓存级别数量可能会增加。现在已经出现了拥有四级cache的处理器了。

  上图展示了三级缓存的结构。L1d是一级数据cache,L1i是一级指令cache。请注意,这只是一个示意图; 现实中的数据流从core到主存的过程中不需要经过任何更高级别的cache。CPU设计人员有很大的自由来设计cache的接口。对于程序员来说,这些设计选择是不可见的。
另外,我们有拥有多个core的处理器,每个core可以有多个“线程”。核心和线程之间的区别在于,独立的核心具有所有硬件资源的独立的副本,早期的多核处理器,甚至具有单独的第二级缓存而没有第三级缓存。核心可以完全独立运行,除非它们在同一时间使用相同的资源,例如与外部的连接。另一方面,线程们共享几乎所有的处理器资源。英特尔的线程实现只为线程提供单独的寄存器,甚至是有限的,还有一些寄存器是共享的。
一个现代CPU的完整概貌如图所示。

  由于cache中对应的都是主存地址,即物理地址,在cqu查看具体数据是否在cache中时,如果CPU传送过来的地址时一个虚拟地址,需要将其转换成实际物理地址再到cache中去寻找。Cache的实现需要TLB的帮助。可以说TLB命中是Cache命中的基本条件。TLB不命中,会更新TLB项,这个代价非常大,Cache命中的好处基本都没有了。在TLB命中的情况下,物理地址才能够被选出,Cache的命中与否才能够达成。

  TLB是一个内存管理单元用于改进虚拟地址到物理地址转换速度的缓存。TLB是位于内存中的页表的cache,如果没有TLB,则每次取数据都需要两次访问内存,即查页表获得物理地址和取数据。

  当cpu对数据进行读请求时,CPU根据虚拟地址(前20位)到TLB中查找.TLB中保存着虚拟地址(前20位)和页框号的对映关系,如果匹配到虚拟地址就可以迅速找到页框号(页框号可以理解为页表项),通过页框号与虚拟地址后12位的偏移组合得到最终的物理地址.

  如果没在TLB中匹配到虚拟地址,就出现TLB丢失,需要到页表中查询页表项,如果不在页表中,说明要读取的内容不在内存,需要到磁盘读取.

  TLB是MMU中的一块高速缓存,也是一种Cache.在分页机制中,TLB中的数据和页表的数据关联,不是由处理器维护,而是由OS来维护,TLB的刷新是通过装入处理器中的CR3寄存器来完成.如果MMU发现在TLB中没有命中,它在常规的页表查找后,用找到的页表项替换TLB中的一个条目.

  当进程进行上下文切换时重新设置cr3寄存器,并且刷新tlb.
有两种情况可以避免刷tlb.
第一种情况是使用相同页表的进程切换.
第二种情况是普通进程切换到内核线程.
lazy-tlb(懒惰模式)的技术是为了避免进程切换导致tlb被刷新.
当普通进程切换到内核线程时,系统进入lazy-tlb模式,切到普通进程时退出该模式.

  cache是为了解决处理器与慢速DRAM(慢速DRAM即内存)设备之间巨大的速度差异而出现的。cache属于硬件系统,linux不能管理cache.但会提供flush整个cache的接口.
cache分为一级cache,二级cache,三级cache等等.一级cache与cpu处于同一个指令周期.

  CPU从来不从DRAM直接读/写字节或字,从CPU到DRAM的每次读或写的第一步都要经过L1 cache,每次以整数行读或写到DRAM中.Cache Line是cache与DRAM同步的最小单位.典型的虚拟内存页面大小为4KB,而典型的Cache line通常的大小为32或64字节.

  CPU 读/写内存都要通过Cache,如果数据不在Cache中,需要把数据以Cache Line为单位去填充到Cache,即使是读/写一个字节.CPU 不存在直接读/写内存的情况,每次读/写内存都要经过Cache.

  缓存里有的数据,主存中一定存在。

  一级缓存中还分数据缓存(data cache,d-cache)和指令缓存(instruction cache,i-cache)。二者分别用来存放数据和执行这些数据的指令,而且两者可以同时被cpu访问,所以一级cache间数据时独立的。

  一级没有的数据二级可能有也可能没有。因为一级缓存miss会接着访问二级缓存。

  一级有二级一定有,三级也一定有。因为一级的数据从二级中读上来的。在一级缺失二级命中时发生。

  二级没有的数据三级可能有也可能没有。因为二级确实会接着访问三级缓存。找不到会继续访问主存。

  二级有的数据三级一定有。在二级缺失三级命中时,数据会从三级缓存提到二级缓存。

  三级没有的数据,主存可能有也可能没有。三级缓存缺失,会访问主存,主存也缺失就要从外存访问数据了。

  三级缓存有的数据主存一定有。因为在三级缺失主存命中时,数据会从主存提到三级缓存中来。

  一级缓存就是指CPU第一层级的高速缓存,主要是为了缓存指令和缓存数据,一级缓存的容量对CPU性能影响非常大,但是因为成本太高,所以一般容量特别小,也就256KB左右。

  二级缓存是CPU第二层级的高速缓存,对于CPU来说,二级缓存容量越大越好,它是直接影响CPU性能的,CPU每个核心都会有自己的缓存,一个CPU的二级缓存容量是所有核心二级缓存容量的总和。

  三级缓存就是CPU第三层级的高速缓存,主要是为了降低与内存进行数据传输时的延迟问题,三级缓存与一二级不同,三级缓存只有一个,它是所有核心共享,所以在CPU参数中可以看到,三级缓存相对于其他两级缓存来说都很大。

   由于缓存的设置与OS无关且透明,所以对于不同的体系架构下不同的处理器对待缓存区域的处理和方式都不同,不同的处理器也有不同的缓存设置值。从主流的处理器cache大小来看,一般一个cache line的大小都是固定的64B左右,这是经过经验得到的比较合理的大小,一般一级cache大小在数十KB左右,二级cache大小在数十到数百KB左右,而L3 cache大小在数MB左右。

  由于三级cache一般来说是运用于拥有多核的处理器,对于单核处理器来说二级cache就能够足够保持够高的cache命中率。所以一般的三级cache一般只针对于多核处理器。L1和L2级cache是处理器核所单独的内容。L1又可以看成是L2的cache。L2可以看成是L3级cache的cache。所以我们分两个部分讨论数据放置与数据淘汰策略。

  各级cache间的数据放置策略主要有三种。直接相连映射,全相联映射和组相联映射。将一个主存块存储到唯一的一个Cache行。对应的大小都是一个cache line的大小,一般来说是64B。

  多对一的映射关系,但一个主存块只能拷贝到cache的一个特定行位置上去。cache的行号i和主存的块号j有如下函数关系:i=j mod m(m为cache中的总行数)。

  可以将一个主存块存储到任意一个Cache行。
主存的一个块直接拷贝到cache中的任意一行上

  可以将一个主存块存储到唯一的一个Cache组中任意一个行。
将cache分成u组,每组v行,主存块存放到哪个组是固定的,至于存到该组哪一行是灵活的,即有如下函数关系:cache总行数m=u×v 组号q=j mod u

  组间采用直接映射,组内为全相联。硬件较简单,速度较快,命中率较高。是现代处理器中一般所常用的映射方式。

  Cache工作原理要求它尽量保存最新数据,当从主存向Cache传送一个新块,而Cache中可用位置已被占满时,就会产生Cache替换的问题。
常用的替换算法有下面三种。

  LFU(Least Frequently Used,最不经常使用)算法将一段时间内被访问次数最少的那个块替换出去。每块设置一个计数器,从0开始计数,每访问一次,被访块的计数器就增1。当需要替换时,将计数值最小的块换出,同时将所有块的计数器都清零。
这种算法将计数周期限定在对这些特定块两次替换之间的间隔时间内,不能严格反映近期访问情况,新调入的块很容易被替换出去。

  LRU(Least Recently Used,近期最少使用)算法是把CPU近期最少使用的块替换出去。这种替换方法需要随时记录Cache中各块的使用情况,以便确定哪个块是近期最少使用的块。每块也设置一个计数器,Cache每命中一次,命中块计数器清零,其他各块计数器增1。当需要替换时,将计数值最大的块换出。
  LRU算法相对合理,但实现起来比较复杂,系统开销较大。这种算法保护了刚调入Cache的新数据块,具有较高的命中率。LRU算法不能肯定调出去的块近期不会再被使用,所以这种替换算法不能算作最合理、最优秀的算法。但是研究表明,采用这种算法可使Cache的命中率达到90%左右。

  最简单的替换算法是随机替换。随机替换算法完全不管Cache的情况,简单地根据一个随机数选择一块替换出去。随机替换算法在硬件上容易实现,且速度也比前两种算法快。缺点则是降低了命中率和Cache工作效率。

  处理器微架构访问Cache的方法与访问主存储器有类似之处。主存储器使用地址编码方式,微架构可以地址寻址方式访问这些存储器。Cache也使用了类似的地址编码方式,微架构也是使用这些地址操纵着各级Cache,可以将数据写入Cache,也可以从Cache中读出内容。只是这一切微架构针对Cache的操作并不是简单的地址访问操作。为简化起见,我们忽略各类Virtual Cache,讨论最基础的Cache访问操作,并借此讨论CPU如何使用TLB完成虚实地址转换,最终完成对Cache的读写操作。

  Cache的存在使得CPU Core的存储器读写操作略微显得复杂。CPU Core在进行存储器方式时,首先使用EPN(Effective Page Number)进行虚实地址转换,并同时使用CLN(Cache Line Number)查找合适的Cache Block。这两个步骤可以同时进行。在使用Virtual Cache时,还可以使用虚拟地址对Cache进行寻址。为简化起见,我们并不考虑Virtual Cache的实现细节。

  EPN经过转换后得到VPN,之后在TLB中查找并得到最终的RPN(Real Page Number)。如果期间发生了TLB Miss,将带来一系列的严重的系统惩罚,我们只讨论TLB Hit的情况,此时将很快获得合适的RPN,并依此得到PA(Physical Address)。

  在多数处理器微架构中,Cache由多行多列组成,使用CLN进行索引最终可以得到一个完整的Cache Block。但是在这个Cache Block中的数据并不一定是CPU Core所需要的。因此有必要进行一些检查,将Cache Block中存放的Address与通过虚实地址转换得到的PA进行地址比较(Compare Address)。如果结果相同而且状态位匹配,则表明Cache Hit。此时微架构再经过Byte Select and Align部件最终获得所需要的数据。如果发生Cache Miss,CPU需要使用PA进一步索引主存储器获得最终的数据。

  由上文的分析,我们可以发现,一个Cache Block由预先存放的地址信息,状态位和数据单元组成。一个Cache由多个这样的Cache Block组成,在不同的微架构中,可以使用不同的Cache Block组成结构。我们首先分析单个Cache Block的组成结构。单个Cache Block由Tag字段,状态位和数据单元组成,如图所示。

  其中Data字段存放该Cache Block中的数据,在多数处理器微架构中,其大小为32或者64字节。Status字段存放当前Cache Block的状态,在多数处理器系统中,这个状态字段包含MESI,MOESI或者MESIF这些状态信息,在有些微架构的Cache Block中,还存在一个L位,表示当前Cache Block是否可以锁定。许多将Cache模拟成SRAM的微架构就是利用了这个L位。有关MOESIFL这些状态位的说明将在下文中详细描述。在多核处理器和复杂的Cache Hierarchy环境下,状态信息远不止MOESIF。

  RAT(Real Address Tag)记录在该Cache Block中存放的Data字段与那个地址相关,在RAT中存放的是部分物理地址信息,虽然在一个CPU中物理地址可能有40,46或者48位,但是在Cache中并不需要存放全部地址信息。因为从Cache的角度上看,CPU使用的地址被分解成为了若干段,如图所示。

  这个地址也可以理解为CPU访问Cache使用的地址,由多个数据段组成。首先需要说明的是Cache Line Index字段。这一字段与Cache Line Number类似,CPU使用该字段从Cache中选择一个或者一组Entry。

  Bank和Byte字段之和确定了单个Cache的Data字段长度,通常也将这个长度称为Cache 行长度,上图所示的微架构中的Cache Block长度为64字节。目前多数支持DDR3 SDRAM的微架构使用的Cache Block长度都是64字节。部分原因是由于DDR3 SDRAM的一次Burst Line为8,一次基本Burst操作访问的数据大小为64字节。

  在处理器微架构中,将地址为Bank和Byte两个字段出于提高Cache Block访问效率的考虑。Multi-Bank Mechanism是一种常用的提高访问效率的方法,采用这种机制后,CPU访问Cache时,只要不是对同一个Bank进行访问,即可并发执行。Byte字段决定了Cache的端口位宽,在现代微架构中,访问Cache的总线位宽为64位或者为128位。

  剩余的字段即为Real Address Tag,这个字段与单个Cache中的Real Address Tag的字段长度相同。CPU使用地址中的Real Address Tag字段与Cache Block的对应字段和一些状态位进行联合比较,判断其访问数据是否在Cache中命中

  如果cache miss,就去下一级cache或者主存中去查找数据,并将查找到的数据采用上面的数据淘汰策略将数据替换到cache中。

  由于在发生cache miss时会产生数据替换,在运行过程中缓存的数据也可能会被修改。所以需要一个策略来保持数据在缓存和主存间的一致性。
Cache写机制分为write through和write back两种。

⑺ 英特尔酷睿的高速缓存

英译Intel Advanced Smart Cache
以往的多核心处理器,其每个核心的二级缓存是各自独立的,这就造成了二级缓存不能够被充分利用,并且两个核心之间的数据交换路线也更为冗长,必须要通过共享的前端串行总和北桥来进行数据交换,影响了处理器工作效率。
英特尔®酷睿微结构体系结构采用了共享二级缓存的做法,有效加强了多核心架构的效率。这样的好处是,两个核心可以共享二级缓存,大幅提高了二级高速缓存的命中率,从而可以较少通过前端串行总线和北桥进行外围交换。
这样可以降低二级缓存的命中失误,减少数据延迟,改进处理器效率,增加绝对性能和每瓦性能。

⑻ 通过HTTP Header控制缓存

我们经常通过缓存技术来加快网站的访问速度,从而提升用户体验。HTTP协议中也规定了一些和缓存相关的Header,来允许浏览器或共享高速缓存缓存资源。这些Header包括:

Last-Modified 和 If-Modified-Since

ETag 和 If-None-Match

Expires

Cache-Control

以上Header又可以分成两种类型:

协商缓存:浏览器发送验证到服务器,由服务器决定是否从缓存中读取,如 1 和 2 。

强缓存:浏览器验证缓存的有效性,然后决定是否从缓存中读取数据,如 3 和 4 。

本文将会分别介绍这四种配置的作用以及可能产生的影响。

1、Last-Modified 和 If-Modified-Since

Last-Modified:服务器在响应请求时,告知浏览器资源的最后修改时间。

If-Modified-Since:浏览器再次发送请求时,会通过此Header通知服务器在上次请求时所得到的资源最后修改时间。服务器会将If-Modified-Since与被请求资源的最后修改时间进行比对。若资源的最后修改时间晚于If-Modified-Since,表示资源已被改动,则响最新的资源,返回200状态码;若资源的最后修改时间早于或等于If-Modified-Since,表示浏览器端的资源已经是最新版本,响应304状态码,通知浏览器继续使用缓存中的资源。

2、ETag 和 If-None-Match

ETag:服务器分配给资源的唯一标识符,资源被修改后,ETag也会随之发生变化。

If-None-Match:浏览器再次发送请求时,会通过此Header通知服务器已缓存资源的ETag。服务器会将If-None-Match与被请求资源的最新ETag进行比对。若不相同,表示资源已被改动,则响应最新的资源,返回200状态码;若值相同,则直接响应304状态码,通知浏览器继续使用缓存中的资源。

3、Expires

服务器可以通过此Header向浏览器传递一个具体的时间(格林威治格式,例如:Thu, 19 Jul 2018 07:43:05 GMT) ,来明确地宣告资源的有效期。在资源过期之前,浏览器不再发送请求,而是直接从缓存中读取数据。只有当资源过期之后,浏览器才会再次向服务器请求该资源。

4、Cache-Control

服务器使用此Header来向客户端建议缓存策略,它有一下几个可选值:

max-age=秒:告知浏览器缓存的有效时长,在该时间内浏览器将直接从缓存中读取数据。

s-maxage=秒:作用同max-age,但是只对共享高速缓存(如CDN)有效,对浏览器无效。

no-cache:告知浏览器不要直接使用缓存,而是必须向服务器发送请求。

no-store:告知浏览器不要缓存本次请求和响应的任何信息。

public:宣告任何缓存媒介都可以缓存该响应。

private:宣告该响应只允许个体客户端(如浏览器)去缓存,而不允许共享高速缓存(如CDN)去缓存。

在上面的介绍中我们了解到浏览器会根据max-age设置的时间进行缓存。而通过研究发现CDN也会识别源站响应头中Cache-Control属性,根据max-age设置的时间进行缓存,但是,如果源站同时设置了s-maxage和max-age,那么CDN会优先采用s-maxage。

下面通过图例来展示一下这些可选值的效果。

首先了解一下浏览器是怎样根据max-age进行缓存的:

从上图不难发现,服务器在Header中返回了Cache-Control: max-age=100后,浏览器成功缓存100秒,该时间段内的请求都从直接以本地缓存来响应。

那么,服务器在Header中返回Cache-Control:s-maxage=100时,又会对浏览器产生什么样的影响呢?

如上图所示,浏览器没有采取任何缓存策略,这是因为s-maxage面向的是共享高速缓。

上面这两个例子很容易理解,在现实世界中,为了加快网站响应速度,我们可能会在浏览器和服务器之间引入CDN服务。浏览器的请求会先到达CDN,然后CDN判断是从缓存中读取数据还是回源到服务器。接下来,让我们看看max-age和s-maxage会对CDN的缓存策略带来哪些影响。

可以看出CDN也会利用max-age来缓存,所以在100秒内强制刷新浏览器时,CDN会直接用缓存来响应。

如果服务器使用了s-maxage又会如何呢?

不难发现CDN对max-age和s-maxage采取了同样的缓存策略,但浏览器并不会根据s-maxage来进行缓存。

CDN供应商的特殊规则

我们分别测试了阿里云和腾讯云的CDN对Cache-Control的支持情况,发现他们都有一些独特的规则。阿里云CDN可以在控制台里设置Cache-Control,该设置会覆盖源服务器的Cache-Control。

腾讯云CDN虽然没有再控制台提供覆盖Cache-Control的功能,但其规则却一点也不简单,在使用的时候一定要特别注意:

服务器和CDN均不对缓存进行配置时,CDN会采用默认的缓存机制(静态文件缓存30天,动态请求不缓存);

CDN配置缓存机制(但并未开启高级缓存配置)且服务器设置Cache-Control: s-maxage=200,max-age=100时,CDN会按照其控制台设置的规则进行缓存,浏览器则按照max-age进行缓存;

服务器不设置Cache-Control时,CDN会自动在响应的Header中添加Cache-Control: max-age=600,这就会让浏览器将该资源缓存600秒;

服务器设置为禁用缓存时,CDN和浏览器均不进行缓存;

服务器设置Cache-Control: s-maxage=200,max-age=100并开启CDN的高级缓存配置时,CDN会从s-maxage和控制台中设置的缓存时间中选择最小值来作为缓存时间,而浏览器则始终使用max-age;

服务器设置Cache-Control:max-age=100并开启CDN的高级缓存配置时,CDN会从max-age和控制台中设置的缓存时间中选择最小值来作为缓存时间,不影响浏览器的缓存策略。

组合使用

如果同时设置了这些Header,浏览器和高速共享缓存会按照下面的优先级进行缓存:

Cache-Control > Expires > ETag > Last-Modified

也就是说,Cache-Control不仅是强缓存,而且拥有最高的优先级,我们可以为不经常发生变化的资源应用该Header来提升响应时间。

在Ada中使用缓存

Ada提供了UI脚手架和API脚手架,这两类脚手架的服务器端入口文件分别为index.server.js和index.js,我们只需要在入口文件的请求处理函数中为响应添加适当的Header,即可通知客户端进行响应的缓存,比如:

// 设置CDN缓存300秒,浏览器缓存200秒 ctx.response.headers.set('Cache-Control',public,s-maxage=300,max-age=200)

在为请求添加缓存Header之前,应该先为其制定适当的缓存策略,需要考虑该URL是否适合缓存(数据是否特定于用户)以及需要缓存的时长等等。

总结

通过使用这些HTTP Header,我们可以主动影响浏览器甚至CDN的缓存策略,从而减少请求数量,提升网页性能,减轻服务器压力。

Ada的灵活机制能让我们为不同的URL设置不同的缓存策略,能够更有针对性地进行主动缓存。

⑼ 为什么多处理器共享高速缓存可以避免高速缓存内容过时

内存包括你说的那两个,其中高速缓存是在主存上的暂存数据的一个容量很小的存储器,并且存储器里有,都是为了解决电脑各硬件之间速度不匹配未设置的一个高速缓存,这样可以让电脑的各个部件都能高校的运行,避免资源的浪费。一级二级都是为了一步步解决速度上的不一样而设计的硬件,一级二级都是dram这样是为了充分利用内存,不浪费资源,他们是集成到cpu上的。

⑽ 计算机中高速缓存的作用

计算机硬盘的高速缓存:
1.高速缓存的概念。缓存(Cache memory)是硬盘控制器上的一块内存芯片,具有极快的存取速度,它是硬盘内部存储和外界接口之间的缓冲器。由于硬盘的内部数据传输速度和外界接口传输速度不同,缓存在其中起到一个缓冲的作用。缓存的大小与速度是直接关系到硬盘的传输速度的重要因素,能够大幅度地提高硬盘整体性能。当硬盘存取零碎数据时需要不断地在硬盘与内存之间交换数据,如果有大缓存,则可以将那些零碎数据暂存在缓存中,减小外系统的负荷,也提高了数据的传输速度。
2.高速缓存的作用。硬盘的缓存主要起三种作用:一是预读取。当硬盘受到CPU指令控制开始读取数据时,硬盘上的控制芯片会控制磁头把正在读取的簇的下一个或者几个簇中的数据读到缓存中(由于硬盘上数据存储时是比较连续的,所以读取命中率较高),当需要读取下一个或者几个簇中的数据的时候,硬盘则不需要再次读取数据,直接把缓存中的数据传输到内存中就可以了,由于缓存的速度远远高于磁头读写的速度,所以能够达到明显改善性能的目的;二是对写入动作进行缓存。当硬盘接到写入数据的指令之后,并不会马上将数据写入到盘片上,而是先暂时存储在缓存里,然后发送一个“数据已写入”的信号给系统,这时系统就会认为数据已经写入,并继续执行下面的工作,而硬盘则在空闲(不进行读取或写入的时候)时再将缓存中的数据写入到盘片上。虽然对于写入数据的性能有一定提升,但也不可避免地带来了安全隐患——如果数据还在缓存里的时候突然掉电,那么这些数据就会丢失。对于这个问题,硬盘厂商们自然也有解决办法:掉电时,磁头会借助惯性将缓存中的数据写入零磁道以外的暂存区域,等到下次启动时再将这些数据写入目的地;第三个作用就是临时存储最近访问过的数据。有时候,某些数据是会经常需要访问的,硬盘内部的缓存会将读取比较频繁的一些数据存储在缓存中,再次读取时就可以直接从缓存中直接传输。
缓存容量的大小不同品牌、不同型号的产品各不相同,早期的硬盘缓存基本都很小,只有几百KB,已无法满足用户的需求。2MB和8MB缓存是现今主流硬盘所采用,而在服务器或特殊应用领域中还有缓存容量更大的产品,甚至达到了16MB、64MB等。
大容量的缓存虽然可以在硬盘进行读写工作状态下,让更多的数据存储在缓存中,以提高硬盘的访问速度,但并不意味着缓存越大就越出众。缓存的应用存在一个算法的问题,即便缓存容量很大,而没有一个高效率的算法,那将导致应用中缓存数据的命中率偏低,无法有效发挥出大容量缓存的优势。算法是和缓存容量相辅相成,大容量的缓存需要更为有效率的算法,否则性能会大大折扣,从技术角度上说,高容量缓存的算法是直接影响到硬盘性能发挥的重要因素。更大容量缓存是未来硬盘发展的必然趋势。
高速缓存产生作用的时机:
3.作用体现及应用。 现在拥有大量数据,但最经常使用的往往只有其中一小部分。如国标汉字有6763个,但经常使用的只有3000个,其中几百个又占了50%以上的使用频率。因此人们想到,如果将这几百个放到存取最快的地方,就可以用很小的代价大大提高工作速度。高速缓存的工作原理基本就是这样。例如我们知道内存的存取速度比硬盘快得多,我们可以在一开机时就将宋体字的前3000个、黑体字最常用的500个装入内存专门开辟的区域,这样当使用这部分字的时候就可以从内存取字,其余的才会去读硬盘。内存开辟的这部分区域就叫做高速缓存,它可能只占所有字体存储量的十分之一,但可以将读写字库的速度提高几十倍。
具体看一下高速缓存起的使用。假设我们有100M数据,其中1M数据的使用频率占到了50%,又知内存存取时间只有硬盘时间的10万分之一,因此如果我们用1M内存做高速缓存存储最常用的1M数据就可以差不多将平均存取速度提高一倍。从这个例子可以看出,当数据使用越不平均,两种存储器之间的速度差越大时CACHE的作用就越大。
以上是一类使用分布固定的例子,在这种情况下,只要固定将这一部分数据装入最快的存储器就可以了。但在许多情况下,数据的使用频率是不确定的,特别它是与时间相关的。如当我们在写一篇文章时,对这篇文章的内容存取就特别频繁。而过一会儿又去修一张照片,存取操作就转移到了这张照片的数据上去,文章的数据就基本不用了。要让一个系统能够自动地根据当前数据的使用频率改变高速存储器中的内容才能使我们专门开出的高速缓存起作用。因此整个高速缓存系统应该包含调度数据的软件。
CACHE系统怎样调度数据
4.拓展知识-深入了解。 怡泓软件早在1983年就在软件内部使用了硬盘的CACHE系统,在早期内存很小的情况下有效地提高了硬盘上大量数据的存取速度。而PC DOS操作系统直到1990年的DR DOS 5.0和MS DOS 4.0中才内含了CACHE程序。从WINDOWS 3.0开始操作系统中都内建了硬盘CACHE系统,CACHE的概念也逐渐延伸到硬盘内部和CPU内部。
CACHE对数据的调度不一定只在两种存储器之间进行,如现在的CPU就有片上的一级、二级和内存共3种存储器。为了便与理解,我们都以两种存储器为例。
为使CACHE系统能够起到提高速度的作用,这两种存储器的速度必需有比较大的差异。如果用通用CPU来完成数据调度,两种存储器的速度差至少应该达到100倍以上。因为调度程序在每完成一次数据访问时至少要消耗20-30个指令周期,如果速度只差10倍,用CACHE比不用还要慢。
数据的调度并不像我们想象地那样简单。第一高速存储器中的每一个数据必需带有地址信息,因为它从第二级存储器中提出来后已经不是按顺序排列。为了避免地址信息过多而造成的空间浪费和查询时间的浪费,必需将数据分成块。块的大小也很有讲究。太小了起不到压缩时间和空间的作用,太大了读一个数据会造成数百个可能用不着的数据涌入高速存储器,反而起不到压缩空间的作用。
高速存储器中数据的地址信息查询是数据调度时运算的大头。当高速存储器很大时,它的地址表也会很长。从计算机指令发出的是对第二级存储器的存取指令,为了要看它是否在高速存储器中,必需去查询这个地址表。如果地址信息是顺序排列的,平均查询时间将是表长的一半。如果表长到了1000项,平均查一个数据地址就要500次比较。即使两级存储器的速度差达1000倍,这种方法也占不了任何便宜。一种方法是优先级排序法,即每经过一段时间的使用就根据每块数据的使用频率修改表的排列,让频率最高的数据块的地址排到最前面去,这样可以有效地缩短查表次数。这是我们过去使用的方法。Intel发明了一种抢队头的方法。即每一个数据一旦被使用,就将它放到地址表的第一位去。它的优点是重整地址表的算法最简单,缺点是地址表的排列通常不是最优化的。还有一种方法是通过散列表来用空间换时间,这种算法稍微复杂一点,但它通常可以在2次查询就找到所需的地址,不过计算散列地址也要消耗不少时间。
我们从以上算法的简单介绍就可以看出,CACHE技术不是在什么地方都可以使用的灵丹妙药,它受调度计算的很大制约。在CPU内部,两级存储器的速度差往往到不了100倍以上,如何能实现有效的CACHE调度?它其中必须有专用的调度算法部件,以保证在1/3的速度差之内完成调度运算,否则最多只能实现一级缓存。
CACHE作用的局限性
从上面对CACHE调度算法的简单介绍我们已经看到,在没有专用算法部件的情况下,只有当两级存储器速度差很大的时候CACHE才起作用。内存和硬盘的速度差通常为105数量级,因此用内存做硬盘的高速缓存通常是很有效的。
另一方面,高频使用的数据必须远小于高速缓存的大小才行,如果大于高速缓存的大小就会造成刚进入缓存的数据马上就被后来的数据挤出去,非但没有加快速度,反而增加了一道间接传递的时间。当我们用PHOTOSHOP处理的图像数据大于内存的1/3时就会出现这种情况。好在内存的速度远大于硬盘的存取速度,这点变化我们通常感觉不出来。但在CPU中,就会非常明显。CPU在处理图像数据时,每次处理的数据量都远远超过它内部的一级和二级缓存,因此它的作用将大大降低,唯一的补偿是处理程序的指令在一个操作——如锐化——中是固定的,它可以常驻高速缓存,减少读指令的时间。这时不同CPU缓存的大小对运算速度的影响就很小了。因为即使再小的缓存,也存得下操作指令;再大的缓存也存不下被操作的图像数据。
在CACHE调度中,为了保证数据的安全而做的回写操作也是阻碍效率的因素。在对数据进行写操作时,可以不将它写回二级存储器,如硬盘,一直到文件关闭甚至操作系统退出时再回写,这样的效率当然最高,但是非常不安全的。一旦一个程序崩溃,其它所有程序的数据就可能都损失了。所以现在的CACHE调度方案通常都内定必须立即回写。我们马上会想到,优化效率的一半没有了。实际情况并非如此。因为回写操作其实并不是立即发生的,它可以由一个优先级较低的线程去完成,当你在考虑怎么进一步调色时,操作系统插空将数据写回硬盘。
即使内存非常大,PHOTOSHOP也将它的每一步操作写回硬盘,这可以从PHOTOSHOP每次崩溃后都留下一个巨大的临时文件看出。因此如果我们连续对图像做旋转、变形等操作,即使用了极大的内存,CACHE作用也只发生了一半。因此要全面提高PHOTOSHOP的效率,必须用RAID等技术提高硬盘的直接读写速度。同理,硬盘上的2M或4M缓存对于动辄几十M的图像数据是毫无作用的。