#include <iostream>
#include <string>
using namespace std;
typedef struct page{
int num;//page number
int time;//the time which page stay
}Page;
int queue[100];/*record the absolete page*/
int K;
/*init the ram*/
void init(Page *b,int n) {
for(int i = 0;i < n;i++) {
b[i].num = -1;
b[i].time = -1;
}
}
/*get the page which is the longest in ram,By default the page is the first time called in*/
int getMax(Page *b,int m) {
int i;
int max = -1;
int tag = 0;
for(i = 0;i < m;i++) {
if(b[i].time > max) {
max = b[i].time;
tag = i;
}
}
return tag;
}
/*judge whether the page was in ram*/
int equation(int fold,Page *b,int m) {
int i;
for(i = 0;i < m;i++) {
if(fold == b[i].num)
return i;
}
cout<<"×××";//中断标记
return -1;
}
void lru(int fold,Page *b,int m) {
int i;
int val;
val = equation(fold,b,m);
if(val >= 0) { //要访问的页在内存中
b[val].time = -1; //访问时间置零
for(i=0;i<m;i++) {
if(i!=val) b[i].time++; //未换出的页,时间加1
}
}else{ //不在内存中,需要可能需要换出
val = getMax(b,m); //找到在内存时间停驻最久的,
queue[++K] = b[val].num; //放入淘汰页面
b[val].num = fold; //换出新页面
b[val].time = -1; //时间
for(i = 0;i < m;i++) {
if(i!=val) b[i].time++; //其余页面时间加1
}
}
}
/*
70120304230321201701
*/
int main() {
int M,n;
M=4;
cout<<"内存的页表大小 M = "<<M<<";";
Page b[M];//内存
n = 20;
int a[20]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};//待进入内存的页面
for(int i = 0;i < n;i++) {
cout<<a[i]<<" ";
}
cout<<endl;
K = -1;
init(b,M);
for(int i = 0;i < n;i++) {
lru(a[i],b,M);
for(int j = 0;j < M;j++) {
if(-1 != b[j].num)
cout<<b[j].num<<" ";
}
cout<<endl;
}
cout<<"被淘汰的页面 :";
for(int i = 0;i < K + 1;i++) {
if(queue[i] >= 0) {
cout<<queue[i]<<" ";
}
}
cout<<endl;
cout<<"命中率:"<<(n - (K + 1)) * 100.0 / n<<"%"<<endl;
cout<<"缺页率:"<<(K+1) * 100.0 / n<<"%"<<endl;
return 0;
}
#include <iostream>
#include <string>
using nam