#include <bits/stdc++.h>
using namespace std;
#define max1 200
#define max2 0x3f3f3f
struct LRU
{
int num;
int time;
};
struct table
{
int queyechishu;
int mingzhongcishu;
int zhihuancishu;
double queyelv;
double mingzhongvlv;
};
table lru2,option2,clock2;
int output1[max1][max1],output2[max1][max1],output3[max1][max1],s=0,s2=0,s3=0,zhong1=0,zhong2=0,zhong3=0,kk;
LRU lru[max1];
char ch;
int pre[max1],dist[max1][max1],block1[max1];
int block,length,page[max1],papelack=0;
int n,m,pages,replace1,replace2,replace3;
int a1[max1],a2[max1],a3[max1];
int num1=0;
int num2=0;
int num3=0;
void menu();
void menu1();
void menu2();
bool flag;
void init()
{
for (int i = 1; i <= n; i++)
{
lru[i].time = 0;
lru[i].num = -1;
}
}
/******************************
返回找到的位置或者替换的位置
*******************************/
int findpage(int k)
{
int i = 0;
for(int j = 1; j <= block; j++)
{
if(lru[j].num == page[k])
{
i = j;
flag = false;
break;
}
}
if(flag)///没有找到
{
for(int j = 1; j <= block; j++)
{
if(lru[i].time < lru[j].time)
{
i = j; ///返回最后使用的内存块用来被替换。
}
}
}
return i;
}
int LRU1()
{
init(); //初始化
int line = 0;
bool flag1; //访问标志
int i, j, tmp;
for (i = 1; i <= n; i++) {
flag = true;
if (line < block){ //没有装满的情况
flag1 = false;
for (j = 0; j < line; j++){
if (lru[j].num == page[i]) { //访问序列目标已经存在
printf("%d页面已经存在\n", lru[j].num);
for(int pp = 0; pp < block; pp++)
{
output1[s][pp] = lru[pp].num;
}
s++;
flag1 = true;
lru[j].time = 0;
break;
}
}
if (!flag1){
printf("没有装满,添加新页面:");
cout<<page[i]<<endl;
lru[line++].num = page[i];
lru[line].time = 0;
for(int pp = 0; pp < block; pp++)
{
output1[s][pp] = lru[pp].num;
}
s++;
papelack++;
}
}
else{
tmp = findpage(i);
if (flag){
printf("产生页面置换中断\n");
printf("将%d页置换出去,将%d页置换进来\n",lru[tmp].num,page[i]);
a1[num1++] = lru[tmp].num;
lru[tmp].num = page[i];
lru[tmp].time = 0;
for(int pp = 0; pp < block; pp++)
{
output1[s][pp] = lru[pp].num;
}
s++;
replace1++;
papelack++;
}
else{
printf("访问%d页面成功\n", lru[tmp].num);
lru[tmp].time = 0; //时间清零
zhong1++;
for(int pp = 0; pp < block; pp++)
{
output1[s][pp] = lru[pp].num;
}
s++;
}
}
if (line > block) { //内存装满
for (int k = 1; k <= block; k++) {
lru[k].time++;
}
}
else {
for (int k= 0; k < line; k++) {
lru[k].time++;
}
}
}
if(line >= block)
kk = block;
else kk = line;
return papelack;
}
int OPT1()
{
int pre[max1];
int papelack = 0;
fill(pre,pre+max1,0);
fill(dist[0],dist[0]+max1*max1,max2);
fill(block1,block1+max1,-1);
for(int i = n; i >= 1; i--)
{
for(int j = 0; j <= pages;j++)
{
if(pre[j])
{
dist[i][j] = pre[j] - i;
}
pre[page[i]] = i;
}
}
for(int i = 1; i <= n; i++)
{
int j;
int maxdist = 0,p;
for( j = 1; j <= m; j++)
{
if(block1[j] == -1)
{
block1[j] = page[i];
cout<<"页面"<<page[i]<<"不在内存,直接放入物理块"<<j<<"中!"<<endl;
papelack++;
for(int k = 1; k <= m; k++)
{
output2[s2][k] = block1[k];
}
s2++;
cout<<endl<<"当前内存页面:";
for(int k=1; k<=m; ++k)//内存中页面加载情况
cout<<block1[k]<<" ";
cout<<endl<<endl;
break;
}
else if(block1[j] == page[i])
{
cout<<page[i]<<"已经存在内存"<<endl<<endl;
zhong2++;
for(int k = 1; k <= m; k++)
{
output2[s2][k] = block1[k];
}
s2++;
break;
}
if(maxdist < dist[i][block1[j]])
{
maxdist = dist[i][block1[j]];
p = j;
}
}
if(j > m)
{
cout<<"页面"<<page[i]<<"不在内存 置换: "<<block1[p]<<" --> "<<page[i]<<endl;
replace2++;
a2[num2++] = block1[p];
block1[p] = page[i];
papelack++;
for(int k = 1; k <= m; k++)
{
output2[s2][k] = block1[k];
}
s2++;
cout<<endl<<"当前内存页面:";
for(int k=1; k<=m; ++k)//内存中页面加载情况
cout<<block1[k]<<" ";
cout<<endl<<endl;
}
}
return papelack;
}
int nru[max1];//表示 物理块 i 最近时候被访问过
int page_in_block[max1];//页面 i 在 block的下标索引
int CLOCK1(){
int index = 1;
papelack = 0;
memset(block1, -1, sizeof(block1));
for(int i=1; i<=n; i++){
if(page_in_block[page[i]])
{//如果page[i]已经在内存中
nru[page_in_block[page[i]]] = 1;//重新标记这个物理块中的页面被访问过了
cout<<endl<<"第"<<i<<"次: 页面"<<page[i]<<"已经存在物理块"<< page_in_block[page[i]] << "中!"<<endl;
zhong3++;
}
else {
while(true){
if(index > m) index = 1;
if(block1[index] == -1) {
nru[index] = 1;
page_in_block[page[i]] = index;
block1[index++] = page[i];
papelack++;
break;
}
if(block1[index] == page[i]){
nru[index++] = 1;
break;
} else {
if(nru[index] == 0){//替换该页面
nru[index] = 1;
page_in_block[block1[index]] = 0;
cout<<endl<<"第"<<i<<"次: 物理块"<<index<<"中的页面"<< block1[index] <<"最近未被使用,将要被页面"<<page[i]<<"替换!"<<endl;
page_in_block[page[i]] = index;
block1[index++] = page[i];
papelack++;
replace3++;
a3[num3++] = block1[index];
break;
} else
nru[index++] = 0;
}
}
}
for(int k = 1; k <=m; k++)
output3[s3][k] = block1[k];
s3++;
for(int k=1; k<=m; ++k)
cout<<block1[k]<<" ";
cout<<endl;
}
return papelack;
}
/*********************
设计一个表格输出三种算法的结果
*********************/
void compare()
{
int queye = LRU1();
lru2.queyelv = queye;
lru2.zhihuancishu = replace1;
lru2.mingzhongcishu = zhong1;
lru2.queyelv = 1.0*queye/n;
lru2.mingzhongvlv = 1.0*zhong1/n;
int queye2 = OPT1();
option2.queyelv = queye2;
option2.zhihuancishu = replace2;
option2.mingzhongcishu = zhong2;
option2.queyelv = 1.0*queye2/n;
option2.mingzhongvlv = 1.0*zhong2/n;
int queye3 = CLOCK1();
clock2.queyelv = queye3;
clock2.zhihuancishu = replace3;
clock2.mingzhongcishu = zhong3;
clock2.queyelv = 1.0*queye3/n;
clock2.mingzhongvlv = 1.0*zhong3/n;
int a[3];
a[0] = lru2.mingzhongvlv;
a[1] = option2.mingzhongvlv;
a[2] = clock2.mingzhongvlv;
for(int i = 0; i < 2; i++)
{
for(int j = 0; j < i-1; j++)
{
if(a[j] < a[j+1])
{
int t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
cout<<"LRU"<<" "<<"OPTION"<<" "<<"CLOCK"<<
}
void menu2(string string1)
{
cout<<endl;
cout<<" ▂▃▅▆▇█████▇▆▅▃▂ "<<endl;
cout<<"☆ =================================================================== ☆"<<endl;
cout<<" "<<endl;
cout<<" 您已经选择";cout<<string1;cout<<" "<<endl;
cout<<" 请输入页面访问串个数及访问串: "<<endl;
cout<<" "<<endl;
//cout<<" "<<endl;
cout<<"☆ =================================================================== ☆"<<endl;
}
void menu1()
{
int k;
cin>>k;
if(k == 1)
{
system("CLS");
menu2("LRU");
cin>>n;
for(int i = 1; i <= n ;i++)
{
cin>>page[i];
pages = max(pages,page[i]);
}
cout<<"请输入物理块个数:";
cin>>block;
cout<<"/*******************************/"<<endl<<endl;
cout<<"这里是LRU算法"<<endl<<endl;
cout<<"/*******************************/"<<endl<<endl;
int pa = LRU1();
cout<<"缺页中断次数:"<<pa<<endl;
cout<<"页面置换次数:"<<replace1<<endl;
printf("缺页率: %2.2lf",1.0*pa/n*100);
cout<<"%"<<endl;
printf("命中率: %.2lf",1.0*zhong1/n*100);
cout<<"%"<<endl;
cout<<"依次被置换的页面:";
for(int i = 0; i < num1; i++)
cout<<a1[i]<<" ";
cout<<endl;
for(int i = 0; i < kk; i++)
{
for(int j = 0; j < s; j++)
{
cout<<output1[j][i]<<" ";
}
cout<<endl;
}
cout<<"按任意键返回主菜单....."<<endl;
cin>>ch;
system("CLS");
menu();
replace1 = 0;
}
else if(k == 2)
{
system("CLS");
menu2("OPTION");
cin>>n;
for(int i=1; i<=n; ++i)
{
cin>>page[i];
pages = max(pages, page[i]) ;
}
cout<<"请输入物理块个数:";
cin>>m;
system("CLS");
cout<<" *******************************"<<endl<<endl;
cout<<" OPTION算法运行结果"<<endl<<endl;
cout<<" *******************************"<<endl<<endl;
int pa = OPT1();
cout<<" 中断次数:"<<pa<<endl;
cout<<" 置换次数:"<<replace2<<endl;
cout<<" 依次被置换的页面:";
printf("缺页率: %2.2lf",1.0*pa/n*100);
cout<<"%"<<endl;
printf("命中率: %.2lf",1.0*zhong2/n*100);
cout<<"%"<<endl;
cout<<"依次被置换的页面:";
for(int i = 0; i < num2; i++)
cout<<a2[i]<<" ";
cout<<endl;
for(int i = 1; i <= m; i++)
{
for(int j = 0; j < s2; j++)
{
cout<<output2[j][i]<<" ";
}
cout<<endl;
}
cout<<"按任意键返回主菜单....."<<endl;
cin>>ch;
system("CLS");
menu();
replace2 = 0;
}
else
if(k == 3)
{
system("CLS");
menu2("CLOCK");
cin>>n;
for(int i = 1; i <= n ;i++)
{
cin>>page[i];
pages = max(pages,page[i]);
}
cout<<"请输入物理块个数:";
cin>>m;
cout<<"/*******************************/"<<endl;
cout<<"这里是CLOCK算法"<<endl;
cout<<"/*******************************/"<<endl;
int pa = CLOCK1();
cout<<"缺页中断次数:"<<pa<<endl;
cout<<"页面置换次数:"<<replace3<<endl;
printf("缺页率: %2.2lf",1.0*pa/n*100);
cout<<"%"<<endl;
printf("命中率: %.2lf",1.0*zhong3/n*100);
cout<<"%"<<endl;
cout<<"依次被置换的页面:";
for(int i = 0; i < num3; i++)
cout<<a3[i]<<" ";
cout<<endl;
for(int i = 1; i <= m; i++)
{
for(int j = 0; j < s3; j++)
{
cout<<output3[j][i]<<" ";
}
cout<<endl;
}
replace3 = 0;
cout<<"按任意键返回主菜单....."<<endl;
cin>>ch;
system("CLS");
menu();
}
else
if(k == 4)
{
system("CLS");
menu2("算法比较");
cin>>n;
for(int i = 1; i <= n ;i++)
{
cin>>page[i];
pages = max(pages,page[i]);
}
cout<<"请输入物理块个数:";
cin>>m;
cout<<"/*******************************/"<<endl;
cout<<"这里是CLOCK算法"<<endl;
cout<<"/*******************************/"<<endl;
}
else
{
system("CLS");
cout<<endl;
cout<<" 请您按要求输入哟! "<<endl;
menu();
}
}
void menu() //默认主菜单界面 ***********************************************
{
cout<<endl;
cout<<" ▂▃▅▆▇█████▇▆▅▃▂ "<<endl;
cout<<"☆ =================================================================== ☆"<<endl;
cout<<" "<<endl;
cout<<" 欢迎来到操作系统页面置换算法界面 "<<endl;
cout<<" "<<endl;
//cout<<" "<<endl;
cout<<"☆ =================================================================== ☆"<<endl;
//cout<<" "<<endl;
cout<<" 请输入一下数字选择相应算法 "<<endl;
cout<<" "<<endl;
cout<<" 【1】 LRU算法 "<<endl;
cout<<" 【2】 OPTION算法 "<<endl;
cout<<" 【3】 CLOCK算法 "<<endl;
cout<<" 【4】 查看算法比较表 "<<endl;
cout<<"☆ =================================================================== ☆"<<endl;
cout<<endl;
cout<<" 请输入【1—3】:";
menu1();
}
int main()
{
system("color 8e");
menu();
return 0;
}
/*
3
0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
3
3 2 1 5 2 4 5 3 2 5 2
*/
05-12
648