基本简介
Cache的出现是基于两种因素:首先,是由于CPU的速度和性能提高很快而主存速度较低且价格高,第二就是程式执行的局部性特点。因此,才将速度比较快而容量有限的SRAM构成Cache,目的在于尽可能发挥CPU的高速度。很显然,要尽可能发挥CPU的高速度就必须
CACHECACHE
用硬体实现其全部功能。
Cache与主存之间可採取多种地址对应方式,直接对应方式是其中的一种。在这种对应方式下,主存中的每一页只能复製到某一固定的Cache页中。由于Cache块(页)的大小为16B,而Cache容量为16KB。因此,此Cache可分为1024页。可以看到,Cache的页内地址只需4位即可表示;而Cache的页号需用10位二进位数来表示;在对应时,是将主存地址直接复製,现主存地址为1234E8F8(十六进位),则最低4位为Cache的页内地址,即1000,中间10位为Cache的页号,即1010001111。Cache的容量为16KB决定用这14位编码即可表示。题中所需求的Cache的地址为10100011111000。
Cache中的内容随命中率的降低需要经常替换新的内容。替换演算法有多种,例如,先入后出(FILO)演算法、随机替换(RAND)演算法、先入先出(FIFO)演算法、近期最少使用(LRU)演算法等。这些替换演算法各有优缺点,就以命中率而言,近期最少使用(LRU)演算法的命中率最高。
流览器快取
快取用于存储一些临时的档案。在流览网页的过程中,网页会自动存储在使用者的硬碟上。下次再流览相同的网站的时候,系统会自动从硬碟中调出该网页,既节省了时间也减少了网路的交换。使用者可以自行设定快取方便其上网的需要。电脑中还存在高速缓沖存储器和硬碟快取。快取的种类:在地伺服器快取、网页快取、硬碟快取、一级高速快取、二级高速快取。
简单理解
cache是一个高速小容量的临时存储器,可以用高速的静态存储器晶片实现,或者集成到CPU晶片内部,存储CPU最经常访问的指令或者运算元据。
cache的基本原理
CPU与cache之间的资料交换是以字为单位,而cache与主存之间的资料交换是以块为单位。一个块由若干定长字组成的。当CPU读取主存中一个字时,便发出此字的记忆体地址到cache和主存。此时cache控製逻辑依据地址判断此字当前是否在 cache中:若是,此字立即传送给CPU;若非,则用主存读周期把此字从主存读出送到CPU,与此同时,把含有这个字的整个资料块从主存读出送到cache中。由始终管理cache使用情况的硬体逻辑电路来实现LRU替换演算法
地址镜像与变换
由于主存容量远大于高速快取的容量,因此两者之间就必须按一定的规则对应起来。高速快取的地址镜像就是指按什麽规则把主存块装入高速快取中。地址变换是指当按某种镜像方式把主存块装入高速快取后,每次访问高速快取时,如何把主存的物理地址或虚拟地址变换成高速快取的地址,从而访问高速快取中的资料。
镜像和变换的方式有四种:直接镜像、全相连镜像、组相连镜像、区段相连镜像。
(1)全相联对应方式
主存中一个块的地址与块的内容一起存于cache的行中,其中块地址存于cache行的标记部分中。
这种方法可使主存的一个块直接拷贝到cache中的任意一行上,非常灵活。
它的主要缺点是比较器电路难于设计和实现,因此只适合于小容量cache採用。
(2)直接对应方式
这也是一种多对一的对应关系,但一个主存块只能拷贝到cache的一个特定行位置上去。
cache的行号i和主存的块号j有如下函式关系:i=j mod m(m为cache中的总行数)
直接对应方式的优点是硬体简单,成本低。
缺点是每个主存块只有一个固定的行位置可存放,容易产生沖突。因此适合大容量cache採用。
(3)组相联对应方式
这种方式是前两种方式的折衷方案。它将cache分成u组,每组v行,主存块存放到哪个组是固定的,至于存到该组哪 一行是灵活的,即有如下函式关系:m=u×v 组号 q=j mod u
组相联对应方式中的每组行数v一般取值较小,这种规模的v路比较器容易设计和实现。而块在组中的排放又有一定的弹性,沖突减少。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的随身碟,我往裏面copy一个3M的MP3,但随身碟的灯没有跳动,过了一会儿(或者手动输入sync)随身碟的灯就跳动起来了。卸载设备时会清空缓沖,所以有些时候卸载一个设备时要等上几秒锺。
修改/etc/sysctl.conf中的vm.swappiness右边的数位可以在下次开机时调节swap使用策略。该数位範围是0~100,数位越大越倾向于使用swap。默认为60,可以改一下试试。--两者都是RAM中的资料。
简单来说,buffer是即将要被写入磁碟的,而cache是被从磁碟中读出来的。
buffer是由各种进程分配的,被用在如输入伫列等方面。一个简单的例子如某个进程要求有多个栏位读入,在所有栏位被读入完整之前,进程把先前读入的栏位放在buffer中储存。
cache经常被用在磁碟的I/O请求上,如果有多个进程都要访问某个档案,于是该档案便被做成cache以方便下次被访问,这样可提高系统性能。
Cache的使用
公共方法
Add 将指定项增加到 Cache 对象,该对象具有依赖项、过期和优先权策略以及一个委托(可用于在从 Cache 移除插入项时通知应用程式)。
Equals(从 Object 继承) 已重载。确定两个 Object 实例是否相等。
Get 从 Cache 对象检索指定项。
GetEnumerator 检索用于迴圈访问包含在快取中的键设定及其值的字典枚举数。
GetHashCode(从 Object 继承) 用作特定类型的哈希函式,适合在哈希演算法和资料结构(如哈希表)中使用。
GetType(从 Object 继承) 获取当前实例的 Type。
Insert 已重载。向 Cache 对象插入项。使用此方法的某一版本改写具有相同 key 参数的现有 Cache 项。
Remove 从应用程式的 Cache 对象移除指定项。
ToString(从 Object 继承) 返回表示当前 Object 的 String。
public object Add(
string key,
object value,
CacheDependency dependencies,
DateTime absoluteExpiration,
TimeSpan slidingExpiration,
CacheItemPriority priority,
CacheItemRemovedCallback onRemoveCallback
);
参数
key
用于引用该项的快取键。
value
要增加到快取的项。
dependencies
该项的档案依赖项或快取键依赖项。当任何依赖项变更时,该对象即无效,并从快取中移除。如果没有依赖项,则此参数包含空引用(Visual Basic 中为 Nothing)。
absoluteExpiration
所增加对象将过期并被从快取中移除的时间。
slidingExpiration
最后一次访问所增加对象时和该对象过期时之间的时间间隔。如果该值等效于 20 分锺,则对象在最后一次被访问 20 分锺之后将过期并从快取中移除。
priority
对象的相对成本,由 CacheItemPriority 枚举表示。快取在退出对象时使用该值;具有较低成本的对象在具有较高成本的对象之前被从快取移除。
onRemoveCallback
在从快取中移除对象时所调用的委托(如果提供)。当从快取中移除应用程式的对象时,可使用它来通知应用程式。
示例
public void AddItemToCache(Object sender, EventArgs e) {
itemRemoved = false;
onRemove = new CacheItemRemovedCallback(this.RemovedCallback);
if (Cache["Key1"] == null)
Cache.Add("Key1", "Value 1", null, DateTime.Now.AddSeconds(60), TimeSpan.Zero, CacheItemPriority.High, onRemove);
}
写策略
CPU对cache的写入变更了cache的内容,如何与主存保持一致有几种写操作工作方式可供选择,统称为写策略。
(1)回写法:
当CPU对cache写命中时,只修改cache的内容不立即写入主存,只当此行被换出时才写回主存。对一
cache行的多次写命中都在cache中快速完成修改,直至被换出时才写回主存。当CPU对cache写未命中
时,为包含欲写的主存块在cache分配一行,将此块整个复製到cache后,在cache中对其进行修改。此
方法可显着减少写入主存的次数,但回写法存在cache与主存不一致的隐患。
(2)全写法:
当写cache命中时,cache与主存同时发生修改,当写cache未命中时,直接向主存进行写入。但是cache
在CPU向主存的写操作中没有起到高速快取的作用,从而降低了cache的功效。
(3)写一次法:
是结合上面两种方法的策略。写命中与写未命中的处理方法与回写法基本相同,只是第一次写命中时要
同时写入主存,这便于维护系统全部cache的一致性。

















