Cache高速缓存
由于CPU的运算速度愈来愈快,主存储器(DRAM)的数据存取速度常无法跟上CPU的速度,因而影响计算机的执行效率,如果在CPU与主存储器之间,使用速度最快之SRAM来作为CPU的数据快取区,将可大幅提升系统的执行效率,而且透过Cache来事先读取CPU可能需要的数据,可避免主存储器与速度更慢的辅助内存的频繁存取数据,对系统的执行效率也大有帮助。
不过因SRAM比DRAM贵太多,如果主存储器全采用SRAM则系统造价太高,所以一般皆只安装512KB~1MB的Cache。Cache的应用除了加在CPU与主存储器之间外,硬盘、打印机、CD-ROM等外围设备也都会加上Cache来提升该设备的数据存取效率。
在CPU开始执行任何指令之前,都会首先从内存中取得该条指令以及其它一些相关数据和信息。为了加快CPU的运行速度,几乎所有的芯片都采用两种不同类型的内部存储器,即高速缓存。缓存被用来临时存放一些经常被使用的程序片段或数据。
一级高速缓存是性能最好缓存类型,与解释指令和执行算术运算的处理单元一到构成CPU的核心。CPU可以在全速运行的状态下读取存放在一级高速缓存中的指令或数据。Intel的处理器产品一般都会具有32K的一级缓存,而象AMD或Via这种竞争对手的产品则会使用更多的一级缓存。
如果在一级缓存中没有找到所需要的指令或数据,处理器会查看容量更大的二级缓存。二级缓存既可以被集成到CPU芯片内部,也可以作为外部缓存。Pentium II处理器具有512K的二级缓存,工作速度相当于CPU速度的一半。Celeron以及更新的Pentium III芯片则分别具有128K和256K的在片二级缓存,能够在处理器全速下运行。
对于存放在速度较慢的二级缓存中的指令或数据,处理器往往需要等待2到4个时钟周期。为了充分利用计算资源,CPU可以在这段时间内查看和执行其它正在等候处理,但不需要使用额外数据的指令,从而提高整个系统的速度,把空闲时间降低到最低程度。
简单理解cache是一个高速小容量的临时存储器,可以用高速的静态存储器芯片实现,或者集成到CPU芯片内部,存储CPU最经常访问的指令或者操作数据。
cache的基本原理
CPU与cache之间的数据交换是以字为单位,而cache与主存之间的数据交换是以块为单位。一个块由若干定长字组成的。当CPU读取主存中一个字时,便发出此字的内存地址到cache和主存。此时cache控制逻辑依据地址判断此字当前是否在 cache中:若是,此字立即传送给CPU;若非,则用主存读周期把此字从主存读出送到CPU,与此同时,把含有这个字的整个数据块从主存读出送到cache中。由始终管理cache使用情况的硬件逻辑电路来实现LRU替换算法
地址镜像与变换由于主存容量远大于高速缓存的容量,因此两者之间就必须按一定的规则对应起来。高速缓存的地址镜像就是指按什么规则把主存块装入高速缓存中。地址变换是指当按某种镜像方式把主存块装入高速缓存后,每次访问高速缓存时,如何把主存的物理地址或虚拟地址变换成高速缓存的地址,从而访问高速缓存中的数据。
镜像和变换的方式有四种:直接镜像、全相连镜像、组相连镜像、区段相连镜像。
[1][2]Buffer和Cache的区别buffer与cache操作的对象就不一样。
buffer(缓冲)是为了提高内存和硬盘(或其他I/0设备)之间的数据交换的速度而设计的。
cache(缓存)是为了提高cpu和内存之间的数据交换速度而设计,也就是平常见到的一级缓存、二级缓存、三级缓存。
cpu在执行程序所用的指令和读数据都是针对内存的,也就是从内存中取得的。由于内存读写速度慢,为了提高cpu和内存之间数据交换的速度,在cpu和内存之间增加了cache,它的速度比内存快,但是造价高,又由于在cpu内不能集成太多集成电路,所以一般cache比较小,以后intel等公司为了进一步提高速度,又增加了二级cache,甚至三级cache,它是根据程序的局部性原理而设计的,就是cpu执行的指令和访问的数据往往在集中的某一块,所以把这块内容放入cache后,cpu就不用在访问内存了,这就提高了访问速度。当然若cache中没有cpu所需要的内容,还是要访问内存的。
缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写入磁盘),也可以通过sync命令手动清空缓冲。举个例子吧:我这里有一个ext2的U盘,我往里面cp一个3M的MP3,但U盘的灯没有跳动,过了一会儿(或者手动输入sync)U盘的灯就跳动起来了。卸载设备时会清空缓冲,所以有些时候卸载一个设备时要等上几秒钟。
修改/etc/sysctl.conf中的vm.swappiness右边的数字可以在下次开机时调节swap使用策略。该数字范围是0~100,数字越大越倾向于使用swap。默认为60,可以改一下试试。--两者都是RAM中的数据。
简单来说,buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的。
buffer是由各种进程分配的,被用在如输入队列等方面。一个简单的例子如某个进程要求有多个字段读入,在所有字段被读入完整之前,进程把先前读入的字段放在buffer中保存。
cache经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可提高系统性能。