分享
 
 
 

自适应Lru(最近最少使用)算法

王朝other·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

在缓存管理算法中,Lru 几乎是公认的最优的算法。然而它也有一些缺陷,主要是因为:它假定对实体的访问有局部特性。当访问模式没有局部特性的时候,它就会退化为FIFO(先进先出)算法。

在我写一个文件系统的实现时,这种现象很让我头疼,因为很多时候,对一个文件的访问大多是顺序的,前面读取过的内容几乎不会被再次读取。苦思冥想之后,我终于找到了一种方案:

就是在缓存击中率降低时,移动将被换出的缓存结点,当击中率很低时,此算法就变成了LIFO(后进先出)。在顺序访问,和完全随机访问时,比Lru有很大的优越性。而在击中率比较高的时侯,它就是 Lru 算法。

以下是算法的关键代码:

// insert p to lru-list...

// but fixed item can not be swaped(can not goes into Lru List)..

// const named BF_XXX or BM_XXX, see its definition..

void LruMap_Release(LruMap* self, LruMapNode* p)

{

FS_ASSERT(p->refCount);

if (0 != --p->refCount)

return;

#ifdef LRU_WRITE_BACK_AT_RELEASE

if (SIG_TRUE(p->flag, BF_DIRTY))

{

self->write(self, p);

CLR_SIG(p->flag, BF_DIRTY);

}

#endif

if (SIG_TRUE(p->flag, BF_FIXED))

return;

if (SIG_TRUE(p->flag, BF_HITED))

{

INSERT_NODE_NEXT(_M_LruHead, p);

self->last = self->last->prev; // --last, move backward...

}

else // not hited..

{

switch (p->flag & BF_METHOD_MASK)

{

default:

break;

case BM_NOMAL: {

unsigned int i;

LruMapNode* iter;

LruMapNode* headPrev = _M_LruHead->prev;

INSERT_NODE_NEXT(self->last, p);

if (self->last == _M_LruHead)

{

#ifdef _FS_DEBUG

int dgb_only = 0; // for set break point here..

#endif

}

else if (self->tmap.nCount > self->workSetSize)

{

i = 0;

iter = p;

while (i < self->workSetSize)

{ // 'workSetSize' is very small (normally == 4),

// so this cycle will not make a big overhead

if (iter == headPrev)

{ // when hit prob is from high becoming to low,

// in this case, it will not go here..

// when hit prob has been very low,

// it hardly always goes here..

break;

}

iter = iter->next;

++i;

}

if (iter != headPrev)

{ // working set is not full...

// must += 2, if not += 2, old hited item will be swaped out

// the lru-list becomes a queue..

self->last = p->next; // last += 2;

}

}

break; }

case BM_LRU: // insert as most recent used..

INSERT_NODE_NEXT(_M_LruHead, p);

break;

case BM_ACC_ONCE: // insert as most UNrecent used..

INSERT_NODE_PREV(p, _M_LruHead);

break;

}

}

return;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有