缓存策略

存储器的层次结构

操做系统中的存储器构成了一个金字塔,越往上的存储器速度越快,可是价格也越贵,因此也就越小。为了解决高速的处理器和低速的存储器之间的矛盾,上一层的存储器做为下一层存储器的缓存。html

在现代的CPU(大多数)上,全部的内存访问都须要经过层层的缓存来进行。CPU的读/写(以及取指令)单元正常状况下甚至都不能直接访问内存——这是物理结构决定的;CPU都没有管脚直接连到内存。相反,CPU和一级缓存(L1 Cache)通信,而一级缓存才能和内存通信。大约二十年前,一级缓存能够直接和内存传输数据。现在,更多级别的缓存加入到设计中,一级缓存已经不能直接和内存通信了,它和二级缓存通信——而二级缓存才能和内存通信。或者还可能有三级缓存。你明白这个意思就行。linux

好比要须要操做内存的某个区域时,处理器不会直接去内存读取,而是会去高速缓存中查看该区域是否是被调进来了,若是没有,则把该区域调入高速缓冲区中。那么接下来处理器直接在高速缓存中进行读写操做。缓存

一样的,对于读取磁盘数据,处理器把内存中的某块区域做为磁盘的缓存。那么即可以直接在内存中进行读写。多线程

处理器在缓存中对数据进行读写操做,可是仍是须要把该数据写会到原来的区域中去,这接涉及到了必定的策略。oop

 

写缓存策略

(1)第一种策略称为不缓存(nowrite),也就是说高速缓存不去缓存任何写操做。当对缓存中的数据进行写时,将直接跳过缓存,直接写到磁盘,同时标记缓存的数据失效。若是后续须要进行读操做,须要从新从磁盘读取数据。post

(2)第二种策略称为写透缓存(write-through cache),即写操做将自动更新缓存,同时也更新磁盘文件。这种操做对保持缓存一致性颇有好处,因此不须要将缓存标记为失效,同时实现也比较简单。spa

(3)第三种策略,也是linux所采用的,称为回写(write-back)。在这种策略下,程序执行写操做直接写到缓存中,可是不会直接更新磁盘,而是将高速缓存中被写入的页面标记成“脏”,并加入脏页链表中。而后由一个进程(回写进程)周期性将脏页链表的页写会到磁盘,从而让磁盘中的数据和缓存中的数据一致,最后清理缓存的“脏”页标志。“脏”的意思不是说数据不干净,而是说数据没有同步到磁盘。操作系统

 

缓存一致性策略

如今的的多处理器的计算机,每一个CPU都有本身的寄存器和缓存。那么一个多线程的程序就会出现这个问题,线程A更改了缓存A中的数据,可是缓存B中的数据仍是原来的数据,那么线程B去缓存B中读取的数据就是错误的数据。这个就是缓存一致性的问题了。(注:问题的产生是由于多缓存引发的)线程

 

既然问题的产生是由于多缓存引发的,那么为何不让全部的处理器共享一个缓存呢?那么在一个指令周期内只有一个处理器可以经过一级缓存运行它的指令。这样效率实在是过低了。因此就有了缓存一致性协议。设计

缓存一致性协议有多种,可是你平常处理的大多数计算机设备使用的都属于“窥探(snooping)”协议,窥探”背后的基本思想是,全部内存传输都发生在一条共享的总线上,而全部的处理器都能看到这条总线:缓存自己是独立的,可是内存是共享资源,全部的内存访问都要通过仲裁(arbitrate):同一个指令周期中,只有一个缓存能够读写内存。窥探协议的思想是,缓存不只仅在作内存传输的时候才和总线打交道,而是不停地在窥探总线上发生的数据交换,跟踪其余缓存在作什么。因此当一个缓存表明它所属的处理器去读写内存时,其余处理器都会获得通知,它们以此来使本身的缓存保持同步。只要某个处理器一写内存,其余处理器立刻就知道这块内存在它们本身的缓存中对应的段已经失效。

在直写模式下,这是很直接的,由于写操做一旦发生,它的效果立刻会被“公布”出去。可是若是混着回写模式,就有问题了。由于有可能在写指令执行事后好久,数据才会被真正回写到物理内存中——在这段时间内,其余处理器的缓存也可能会傻乎乎地去写同一块内存地址,致使冲突。在回写模型中,简单把内存写操做的信息广播给其余处理器是不够的,咱们须要作的是,在修改本地缓存以前,就要告知其余处理器。搞懂了细节,就找到了处理回写模式这个问题的最简单方案,咱们一般叫作MESI协议(译者注:MESI是Modified、Exclusive、Shared、Invalid的首字母缩写,表明四种缓存状态,下面的译文中可能会以单个字母指代相应的状态)。

其中的Exclusive表示独占缓存段,当处理器想写某个缓存段时,若是它没有独占权,它必须先发送一条“我要独占权”的请求给总线,这会通知其余处理器,把它们拥有的同一缓存段的拷贝失效(若是它们有的话)。只有在得到独占权后,处理器才能开始修改数据——而且此时,这个处理器知道,这个缓存段只有一份拷贝,在我本身的缓存里,因此不会有任何冲突。

 

该文章在个人我的博客的地址是:http://www.alphaway.org/post-432.html

 

参考:

缓存一致性(Cache Coherency)入门

多核 CPU 和多个 CPU 有何区别?

多核,多处理器,多线程你如何区别

相关文章
相关标签/搜索