在C ++中实现LRU

时间:2012-11-12 00:20:59

标签: c++ arrays algorithm

我正在尝试实现LRU页面替换。我能够让FIFO算法工作。但我不确定如何跟踪最近最少使用的?

我在阅读文件。其结构类似于第一个数字是pid(1),第二个数字是ref(45),依此类推:

1 45
1 46
1 45
1 44
2 76
2 75
2 77
2 77

所以,我正在使用一个类数组,并逐行解析文件,如果它不在数组中,则将pid和ref放在该索引中。如果阵列已满,请返回到开头的广告开始。

class pagetable
{

public:
int pid;
int ref;
int faults;
pagetable();
};
pagetable* page = new pagetable[frames];

我正在提示帧数。 我提示输入文件名并将其存储在

ifstream inputStream;

然后我可以调用我的LFU函数并抓住每个pid并参考。

int runsimLFU(ifstream &inputStream, pagetable* page, int frames ){

int i =0;
int j=0;
bool flag = false;
int cnt=0;
int index = 0;
int value = 0;

while(1){

  inputStream >> pid;
  inputStream >> ref;

      page[count].pid = pid;
      page[count].ref = ref;
  pagefaults++;

像这样的东西,我可以继续抓住文件的每一行。

这就是我搜索数组的方式

bool findinarray(pagetable* page, int frames, int pid, int ref)
{

 for(int i=0; i < frames+1; i++) {
    if(page[i].pid == pid && page[i].ref == ref)
    {
        return true;

    }
 }
    return false;

 }

两个问题

1)我不确定如何跟踪LRU。我会想象第二个数组和一个计数器变量,但就我所知,该怎么做。

2)一旦我知道了LRU,当输入pid时,ref不在数组中,我将其填入索引LRU号的数组中?

谢谢

1 个答案:

答案 0 :(得分:1)

通常,您对LRU有两种竞争需求:

  • 快速找到一个条目 - 建议将数组查找,哈希表或二进制映射作为索引,并
  • 快速添加/追加/删除条目 - 建议链接列表

如果您单独解决任何一项要求,最终会导致暴力效率低下。您可以自己协调两个容器 - 理想情况下将它们包装到LRU类中以提供一些封装并提高可靠性。或者,boost多索引容器可满足这些要求:www.boost.org/libs/multi_index/