Thursday, April 28, 2005

在C++中用list容器实现LRU cache

Cache从本质上是个数组,但是LRU cache则似乎不太相同,它有一种内在的顺序,
也就是被淘汰的顺序.

考虑LRU cache的如下操作:

1.添加 Add item
向LRU Cache中添加永远只需要向队列尾部添加

2.删除 Delete item
对应尾部添加,则删除应该发生在队列头部.

3.查找 Search item
查找应该做两件事,一是真正的查找,返回一个True or False.
但是如果命中,则还应该把命中的item移动到尾部,使它不容易被删除.

4.替换-Replace item
Replace可以被看成是两个操作的合并:Replace = Add + Delete,
其中add发生在尾部,delete发生在头部。

5.是否还应该加上有效位,valid bit,以及对应的修改该位的功能?
set_invalid(),set_valid(),is_valid()

可能会需要的参数,
1. Cache size (number of items, Cache 容量)
2. Cache item Data Type (每个item是一个文件,一个block,还是...?)
3. 好像没有了吧?^_^

一下是我的LRU Cache实现的主要代码片断:
class LRU_Cache
{
public:
void _add(int id);
void _del(int id);
bool _find(int id);
bool search(int id);
private:
list lru;
}

void LRU_Cache::_add(int id)
{
lru.push_back(id);
}
void LRU_Cache::_del(int id)
{
lru.remove(id);
}
bool LRU_Cache::_find(int id)
{
list::iterator it;
for (it=lru.begin(); it!=lru.end(); it++)
if ((*it)==id)
return true;
return false;
}

No comments: