Cache是提高CPU性能的一种技术手段,通过Cache存储器把程序频繁用到的指令和数据存储起来,等再次访问该指令或数据时CPU可以直接从Cache中读取而不用访问主存从而能提高程序运行的效率。
Cache背后的理论基础是程序运行的“局部性”原理, “程序局部性原理”包括
时间局部性 和 空间局部性。
时间局部性的主要表现为刚被访问过的指令或数据很可能在最近的将来再次被访问,编程语言的循环结构是时间局部性产生的主要原因。
空间局部性描述的是:若一个存储单元被访问则其相邻的存储单元也被访问,软件程序的顺序执行及语言中的数组结构是空间局部性产生的主要原因。
在硬件设计方面cache的实现大体上分为两种:
虚拟cache和物理cache
存储虚拟地址的cache叫虚拟cache,这种cache存储编译程序时产生的虚拟地址对应的存储器单元内容,其优点是匹配速度快,因为在CPU MMU地址转换前即可对cache进行访问,其缺点为因为不同虚拟地址可对应相同的物理地址而导致的cache别名问题。
物理cache存储经由MMU转换后的物理地址对应的存储器单元内容。
cache的具体实现方法包括:
直接映射cache,组相连cache和全映射cache,其中直接映射cache的实现最简单,全映射cache的实现最难,而组相连cache的实现居于以上两者之间。
从软件的角度来说编写应用程序的程序员是看不见cache的,只有编写操作系统等系统软件的程序员才能看见cache。以linux OS为例,在linux引导启动时必须对cache进行初始化工作,包括对指令/数据cache的各行进行invalidate操作。
不同体系结构的cache实现方法的不同导致操作系统对其cache的失效操作也不尽相同,如对I386体系结构来说体系结构在其内部实现了cache失效操作所以linux就无需进行重复的cache失效操作,但对MIPS等RISC体系结构linux引导启动代码必须实现cache初始化操作。
另一方面在linux中访问外围设备时必须屏蔽cache,一般情况下体系结构提供特殊指令访问I/O设备寄存器及内存,而这些指令实现了屏蔽cache的操作。
系统软件能够感觉到cache的另一点是对设备进行DMA操作时。无论是对设备进行DMA写还是从设备DMA读取,都必须在启动DMA操作之前进行cache失效操作。
http://www.eefocus.com/neubhs/blog/08-02/143389_de387.html