赞
踩
FIFO算法的性能较差,它所依据的条件是各个页面调入内存的时间,而页面调入的先后并不能反映页面的使用状况。最近最久未使用(LRU)的页面置换算法是根据页面调入内存后的使用情况做出决策的。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t。当需要淘汰一个页面时,选择现有也面中t值最大的,即最近最久未使用的页面予以淘汰。
LRU算法虽然是一种比较好的算法,但是要求系统有较多的支持硬件。为了了解一个进程在内存中的各个页面各有多少时间未被进程访问,以及如何快速得知道哪一页是最近最久未使用的页面,须有寄存器和栈两类硬件之一的支持。
1)寄存器
为了记录某进程在内存中各页的使用情况,须为每个内存中的页面配置一个移位寄存器,可表示为
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
class LRU
{
public:
LRU()
{
siz=0;
}
bool isOutofBoundary()
{
if(siz>=N)return true;
return false;
}
int indexOfElement(int o)
{
for(int i=0; i<N; i++)
{
if(o==a[i])
return i;
}
return -1;
}
void push(int o)
{
int t=-1;
if(!isOutofBoundary()&&indexOfElement(o)==-1)
{
a[siz]=o;
siz++;
}
else if(isOutofBoundary()&&indexOfElement(o)==-1)
{
for(int i=0; i<siz-1; i++)
{
a[i]=a[i+1];
}
a[siz-1]=o;
}
else
{
t=indexOfElement(o);
for(int i=t; i<siz-1; i++)
{
a[i]=a[i+1];
}
a[siz-1]=o;
}
}
void showMemoryBlock()
{
printf("now memory use:\n");
for(int i=0; i<siz; i++)
{
printf(i==siz-1?"%d\n":"%d ",a[i]);
}
}
private:
int N=5;
int a[5],siz;
};
int main()
{
int iter[]= {4,7,0,7,1,0,1,2,1,2,6};
LRU lru;
printf("%d %d %d\n",sizeof(iter),sizeof(int),sizeof(iter)/sizeof(int));
for(int i=0; i<sizeof(iter)/sizeof(int); i++)
{
lru.push(iter[i]);
lru.showMemoryBlock();
}
return 0;
}
输出结果:
now memory use:
4
now memory use:
4 7
now memory use:
4 7 0
now memory use:
4 0 7
now memory use:
4 0 7 1
now memory use:
4 7 1 0
now memory use:
4 7 0 1
now memory use:
4 7 0 1 2
now memory use:
4 7 0 2 1
now memory use:
4 7 0 1 2
now memory use:
7 0 1 2 6
Process returned 0 (0x0) execution time : 0.033 s
Press any key to continue.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。