📄 存储管理.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
struct type{
int address;
int mingzhong;
int pagenumber;
}virtualpage[13]={{0},{0},{3728},{11023},{11024},{20055},{7800},{9096},{6800},{13728},{10000},{4234},{4521}};
int table[33]={0}; //页表
int later[33]={0};
int efficiency,pagesize,pagenumber;
int output[13][33];
void init();
void OPT();
void LRU();
void action();
void push(int);
void print();
void main()
{init();
action();
}
void init() //得到用户输入的页面尺寸及页数,并初始化实际应用到的virtualpage的页数
{int i;
printf("请输入页面尺寸,以k为单位(1--8之间)\n");
scanf("%d",&pagesize);
printf("请输入主存页数(4--32之间)\n");
scanf("%d",&pagenumber);
for(i=1;i<=12;i++)
virtualpage[i].pagenumber=1+virtualpage[i].address/(pagesize*1024);
//初始化实际应用到的virtualpage的页数
}
void action()
{ int i,j,select;
char c;
while(1)
{for(i=1;i<=pagenumber;i++)
{table[i]=0; //清空页表
efficiency=0; //命中率初值=1
}
for(i=1;i<=12;i++)
{for(j=1;j<=pagenumber;j++)
output[i][j]=0; //清空所要输出的所有页表信息
virtualpage[i].mingzhong=0; //当前虚页的命中标志=0
}
printf("\n请选择替换算法\n1.OPT算法 2.LRU算法\n");
scanf("%d",&select);
if(select==1)
OPT(); //调用OPT()算法进行页面管理
else
LRU(); //调用LRU()算法进行页面管理
print(); //打印每次页面的信息及每次的命中情况
getchar();
printf("\n\n您想继续吗?(y/n)\n");
scanf("%c",&c);
if(c=='n')
break;}
}
void OPT()
{int current,j,k,m,i,max,pagedelete,h;
for(current=1;current<=12;current++)
{for(j=1;j<=pagenumber;j++)
if(virtualpage[current].pagenumber==table[j])//虚页号已存在于页表中
{virtualpage[current].mingzhong=1; //命中标志=1
efficiency++; //命中次数+1
break;
}
else if(table[j]==0)
{table[j]=virtualpage[current].pagenumber; //如果是0,表明页表中仍有空位
break;}
if(j==pagenumber+1) //虚页号不在页表中,根据替换算法OPT进行淘汰
{ for(k=1;k<=pagenumber;k++)
{ for(m=current+1;m<=12;m++) //later数组的维数=虚地址流的个数
if(table[k]==virtualpage[m].pagenumber)
{later[k]=m;
break;} //若虚页地址流的第m个与当前虚页地址相等,则将m记录在later数组中,以备随后的比较
if(m==13)
later[k]=100; //表明今后该虚页未在虚地址流中出现过,将无穷大记录在later数组的对应单元中
}
max=later[1];
pagedelete=1;
for(h=2;h<=pagenumber;h++)
if(later[h]>max)
{ max=later[h];
pagedelete=h;
} //比较later中的各个单元,将值最大的---即最久才出现或根本未出现的找到
table[pagedelete]=virtualpage[current].pagenumber; //找到后,将此虚页替换掉
}
for(i=1;i<=pagenumber;i++)
output[current][i]=table[i];//将每次页表中内容保存以备输出
}
}
void LRU()
{
int current,i,j;
for(current=1;current<=12;current++)
{for(j=1;j<=pagenumber;j++)
if(virtualpage[current].pagenumber==table[j])//虚页号已存在于页表中
{virtualpage[current].mingzhong=1; //标志命中
efficiency++; //命中次数+1
push(j); //命中后,调用push函数,把新的虚页移到链首
break;}
if(j==pagenumber+1) //虚页号不在页表中,根据替换算法LRU进行淘汰链尾
{for(i=pagenumber;i>=2;i--)
table[i]=table[i-1]; //将table的1,2,...pagenumber-单元依次下移一个单元
table[1]=virtualpage[current].pagenumber; //将新来的页表放在链首
}
for(i=1;i<=pagenumber;i++)
output[current][i]=table[i]; //将每次页表中内容保存以备输出
}
}
void push(int j)
{int temp,i;
if(j!=1) //命中后,如果命中的页不在链首,才执行下列操作,否则不予执行(没有执行的必要)
{temp=table[j]; //先保存新的虚页
for(i=j-1;i>=1;i--)
table[i+1]=table[i]; //将此单元以上内容下移
table[1]=temp; //把新的虚页放到链首
}
}
void print() //打印一系列输出信息
{int i,j;
printf("\n虚页号: "); //输出虚页地址流
for(i=1;i<=12;i++)
printf("%d ",virtualpage[i].pagenumber);
printf("\n ---------------------------------------------------------\n");
printf("页表内容:");
for(i=1;i<=pagenumber;i++)
{for(j=1;j<13;j++)
printf("%d ",output[j][i]); //输出每次页表内容
printf("\n ");
}
printf("--------------------------------------------------------\n命中情况:");
for(i=1;i<=12;i++)
if(virtualpage[i].mingzhong==1) //输出每次命中情况
printf("H ");
else
printf(" ");
printf("\n\n");
printf(" ******* 命中率= %d/12 = %f%% *******",efficiency,float(efficiency)/12*100);
//输出命中率
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -