horizonheart 2020-07-19
LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。
1存在
存在就比较简单了,直接取出数据,页面数据不变,并把这个结点放在list链表最前面,删除原来位置的节点
2不存在
cache满
把最靠后的页面删除,然后把需要的页面放到最前的位置
cache不满
直接去读取数据,然后把他放在最前的位置
#include<iostream>
#include<list>
void fun(std::list<int>&L,int x)
{
for(std::list<int>::iterator it=L.begin();it!=L.end();it++)
{
if(*it==x)
{
L.push_front(x);
L.erase(it);
return;
}
}
std::cout<<"发生缺页中断 "<<x<<std::endl;
L.pop_back();
L.push_front(x);
}
int main()
{
std::list<int>L;
int sum, n, i,x;
sum = 0; //初始cache内没有数据
std::cin>>n; //读入页数
while (true)
{
scanf("%d", &x);
if (x < 0)
{
break;
}
else
{
if (sum < n) //cache未满,放至后面
{
L.push_front(x);
std::cout<<"发生缺页中断 "<<x<<std::endl;
sum += 1; //并对cache+1
}
else
{
fun(L,x);
}
}
}
return 0;
}
C++ list 因为内部就是双向链表