存取缓冲区的LRU与MRU算法

<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

数据库存取缓冲区LRUMRU算法

 

1.CacheHitandCacheMiss

当使用者第一次向数据库发出查询数据的请求的时候,数据库会先在缓冲区中查找该数据,如果要访问的数据恰好已经在缓冲区中(我们称之为CacheHit)那么就直接用缓冲区中读取该数据.

反之如果缓冲区中没有使用者要查询的数据那么这种情况称之为CacheMiss,在这种情况下数据库就会先从磁盘上读取使用者要的数据放入缓冲区,使用者再从缓冲区读取该数据.

很显然从感觉上来说CacheHit会比CacheMiss时存取速度快.

 

2.LRU(最近最少使用算法)andMRU(最近最常使用算法)

所谓的LRU(Leastrecentlyused)算法的基本概念是:当内存的剩余的可用空间不够时,缓冲区尽可能的先保留使用者最常使用的数据,换句话说就是优先清除”较不常使用的数据”,并释放其空间.之所以”较不常使用的数据”要用引号是因为这里判断所谓的较不常使用的标准是人为的、不严格的.所谓的MRU(Mostrecentlyused)算法的意义正好和LRU算法相反.

下面我们通过9iCache中对LRUMRU的使用来看一下两者在缓冲区工作机制中的作用和区别:

    在Oracle9i中有LRUList的概念:我们可以把LRUList想象成是一连串的缓冲区集合,两端分别是LRU端和MRU端,当数据库从磁盘上读取数据放入缓冲区时,系统必须先确定缓冲区中有freebuffers,这个时候Oracle9i会扫描LRUList,扫描的基本原则是:

1.    从LRU端到MRU端;

2.    当扫描到freebuffer或已扫描的缓冲区数目超过临界值时,就会停止扫描动作;

     如果在扫描过程顺利的在LRUList中找到了freebuffer,那么Oracle9i就把从磁盘读出的数据写到freebuffer中然后把freebuffer加到LRUList的MRU端.

     那如果扫描过程没有在LRUList中找到freebuffer怎么办?当然是从LRUList的LRU端开始清除缓冲区,如此一来就可以腾出新的空间了.

     下图就是一个例子:

         使用者查询数据A,初始的时候LRUList中没有数据A,于是Oracle9i到磁盘读取A,然后放到LRUList的MRU端,使用者再从LRUList中读取数据A,同理对于B,C…当LRUList满了以后,如果使用者查询N,此时N不在LRUList中而且LRUList中已经没有freebuffer了,此时Oracle9i就开始从LRU端淘汰A以腾出空间存放N.



                     图1

 

我们再来看另外一种情况:

   在State3之后,恰好使用者持续的查询A—这将会导致A一直被放置在靠近MRU端的缓冲区,结果将如图Statem’所示,你会发现图2的Statem’与图1的Statem缓冲区存放的数据完全一样但是存放位置不一样.此时LRUList满了,如果再放N的时候LRUList`淘汰的是B,因为A的查询率高于B,所以LRUList让A在缓冲区中呆上较长的时间而先淘汰掉”较不常用的”的B.



                            图2

   
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
阅读更多
个人分类: 数据库
想对作者说点什么? 我来说一句

MRU 一种cache的算法

2008年11月18日 6KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭