1.LRU算法:
算法原理不再论述,此处只写实现。
#include <iostream>
#include<map>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
using namespace std;
#define PAGESIZE 3 //内存中的最大页数
int find(const vector<int>& vec,int x){
if(vec.size()==0) return -1; //无内容
else {
for (int i = 0; i < vec.size(); i++)
{
if (x == vec.at(i))
{
return i;
}
}
}
return -1;//找不到
}
int LRU(int N){ //以离栈顶距离判断时间长短
vector<int> memory; //内存
vector<int> pages; //页块
int p;
int x;
int lackpage = 0;
for(int i = 0;i < N;i++){
cout << "请输入页号" <<endl;
cin >> p;
if(find(memory,p)!= -1 ){ //找到即该页存在
x = find(memory,p); //返回该页索引
memory.erase(memory.begin()+x); //把其在栈中删除
memory.push_back(p); //将其压入栈顶
}
else{ // 该页不存在
lackpage ++; // 缺页数加1
cout<<"第"<<lackpage<<"次缺页:"<<p<<endl;
if(memory.size()<PAGESIZE){ //并且内存中有空余
memory.push_back(p); //放进内存尾,压栈
}
else{ //内存不足,需要淘汰索引为0的页面
//所有元素向下移动,即覆盖。
for(int i = 0;i < PAGESIZE;++i){ //
memory[i]=memory[i+1];
}
memory.erase(memory.begin()+PAGESIZE-1); //栈里面腾位置给栈顶
memory.push_back(p); //把此页面放栈顶
}
}
}
return lackpage;
}
int main(int argc, char *argv[]) {
int N; //页面置换总数
cout << "请输入页面置换总数";
cin >> N;
int missPage = LRU(N);
cout << missPage << endl;
return 0;
}
2.FIFO算法
同为C实现
// FIFO
int FIFO(int N){
vector<int> memory; //内存堆栈
int p;
int x;
int lackpage = 0;
for(int i = 0;i < N;i++){
cout << "请输入页号" <<endl;
cin >> p;
x = find(memory,p);//在内存中找到该页
if(x == -1) //找不到该页,开始置换
{
lackpage++;
cout<<"第"<<lackpage<<"次缺页:"<<p<<endl;
if(memory.size()<PAGESIZE) //内存中有空位
{
memory.push_back(p); //入队,到队尾
}
else //内存不足,需要淘汰掉最先进来的页面,即索引为0的;
{
//需要页面置换
memory.erase(memory.begin()); //淘汰最先进来的页面 即队首的页面'
memory.push_back(p); //把页面p放入队尾;
}
}
}
return lackpage;
}