存取缓冲区的LRU与MRU算法
来源:互联网 发布:windows snmp配置文件 编辑:程序博客网 时间:2024/05/16 06:08
<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>
数据库存取缓冲区的LRU与MRU算法
1.CacheHitandCacheMiss
当使用者第一次向数据库发出查询数据的请求的时候,数据库会先在缓冲区中查找该数据,如果要访问的数据恰好已经在缓冲区中(我们称之为CacheHit)那么就直接用缓冲区中读取该数据.
反之如果缓冲区中没有使用者要查询的数据那么这种情况称之为CacheMiss,在这种情况下数据库就会先从磁盘上读取使用者要的数据放入缓冲区,使用者再从缓冲区读取该数据.
很显然从感觉上来说CacheHit会比CacheMiss时存取速度快.
2.LRU(最近最少使用算法)andMRU(最近最常使用算法)
所谓的LRU(Leastrecentlyused)算法的基本概念是:当内存的剩余的可用空间不够时,缓冲区尽可能的先保留使用者最常使用的数据,换句话说就是优先清除”较不常使用的数据”,并释放其空间.之所以”较不常使用的数据”要用引号是因为这里判断所谓的较不常使用的标准是人为的、不严格的.所谓的MRU(Mostrecentlyused)算法的意义正好和LRU算法相反.
下面我们通过9iCache中对LRU和MRU的使用来看一下两者在缓冲区工作机制中的作用和区别:
在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>
数据库存取缓冲区的LRU与MRU算法
1.CacheHitandCacheMiss
当使用者第一次向数据库发出查询数据的请求的时候,数据库会先在缓冲区中查找该数据,如果要访问的数据恰好已经在缓冲区中(我们称之为CacheHit)那么就直接用缓冲区中读取该数据.
反之如果缓冲区中没有使用者要查询的数据那么这种情况称之为CacheMiss,在这种情况下数据库就会先从磁盘上读取使用者要的数据放入缓冲区,使用者再从缓冲区读取该数据.
很显然从感觉上来说CacheHit会比CacheMiss时存取速度快.
2.LRU(最近最少使用算法)andMRU(最近最常使用算法)
所谓的LRU(Leastrecentlyused)算法的基本概念是:当内存的剩余的可用空间不够时,缓冲区尽可能的先保留使用者最常使用的数据,换句话说就是优先清除”较不常使用的数据”,并释放其空间.之所以”较不常使用的数据”要用引号是因为这里判断所谓的较不常使用的标准是人为的、不严格的.所谓的MRU(Mostrecentlyused)算法的意义正好和LRU算法相反.
下面我们通过9iCache中对LRU和MRU的使用来看一下两者在缓冲区工作机制中的作用和区别:
在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>
- 存取缓冲区的LRU与MRU算法
- 数据库存取缓冲区的LRU与MRU算法
- 数据库存取缓冲区的LRU与MRU算法
- 数据库存取缓冲区的LRU与MRU算法
- LRU与MRU算法
- LRU与MRU概念
- 常用缓存淘汰算法(LFU、LRU、ARC、FIFO、MRU)
- LRU MRU应用场景
- 关于MRu算法的实现研究
- LRU 与 LFU 算法
- PWLRU:一种面向闪存数据库的缓冲区存取算法论文总结
- LRU算法的实现
- LRU算法的实现
- LRU算法的实现
- LRU算法的实现
- LRU算法的实现
- LRU算法的实现
- Memcached的LRU算法
- 查看和监控
- NULL及DUAL详解
- 怎样将中的数据导入到2000中
- SQL恢复技术
- Flex事件讲解
- 存取缓冲区的LRU与MRU算法
- 忘了电脑开机密码怎么办
- 关于批量添加问题
- 一个成功的增量SNAPSHOT例子
- 窗体动态效果的实现
- SqlServer中如何按姓氏笔画排序
- 模拟字符串处理函数stuff处理Ntext字段
- Ntext字段拆分处理
- 百钱买百鸡代码