好久没有更新博客了,现在开始不定时更新博客。嘿嘿嘿
今天更新的是操作系统的页面置换算法。今天这篇文章主要讲的是FIFO(先进先出算法)还有LRU(最近最久不使用算法)。都用的是数组的方法。
FIFO算法顾名思义就是先进物理块的页面先出去。
LRU算法,我采用的是栈的方法实现的,但是这个栈跟咱们数据结构意义上的栈不太一样,其实还是数组把。
具体的思路就不讲解了,直接看代码把,其他的博主还会画图,我不会。看代码,我的注释自认为还是挺详细的。不懂可以私聊我。
# include<iostream>
using namespace std;
int main (void)
{
int n,m,t=0,a[100],b[100],num=0,flag;
double sum;
cout<<"请输入页面数n和物理块数m"<<endl;
cout<<"页面数:"<<endl;
cin>>n;
cout<<"物理块数"<<endl;
cin>>m;
cout<<"请输入具体页面"<<endl;
for(int i=0;i<m;i++)
{
b[i]=-1;//对数组进行初始化
}
for(int i=0;i<n;i++)
{
cin>>a[i];
}
//FIFO算法
printf("开始FIFO算法演示\n"); //FIFO算法的本质就是根据你进入的时间进行淘汰。
for(int j=0;j<n;j++)
{
for(int k=0;k<m;k++)
{
if(b[k]==a[j]) //如果我的物理块内已经有了该页面,无需任何操作
{
flag=1;
break;
}
else flag=0;
}
if(flag==0)//如果物理块中没有找到该页面,进行更新。具体方法为找到上次更新的物理块,在他的下一个物理块进行置换操作
{
b[t%m]=a[j];
t++;//用来标记一下次需要进行置换的物理块位置
num++;
}
for(int k=0;k<m;k++)
{
cout<<b[k]<<" ";//打印检查
}
cout<<endl;
}
printf("缺页次数是%d次数",num);
sum=num/(n*1.0);
printf("缺页率为%lf\n",sum);
//LRU算法
printf("开始LRU算法演示\n");//运用栈的方法进行演算。数组即是栈。数字小的就是栈顶。最不经常访问的页面在栈底。
int zhan[100];
num=0;
for(int i=0;i<m;i++)
{
zhan[i]=-1;//同样进行初始化
}
for(int j=0;j<n;j++)
{
for(int k=0;k<m;k++)
{
if(zhan[k]==a[j]) //在能找到的情况下,对栈里面的数据进行更新,访问到的页面放到栈顶的位置,即数组的第一个位置。
{
flag=1;
int tmp=zhan[k];
if(k==0) break;//如果找到的位置在第一个栈 ,直接跳出循环,无需进行任何操作
for(int z=k-1;z>=0;z--)
{
zhan[z+1]=zhan[z];//以我找的为标记,然后用前面的覆盖后面。
}
zhan[0]=tmp;//将访问到的页面更新到栈顶
break;
}
else flag=0;
}
if(flag==0)//如果没有找到,直接对栈内元素进行覆盖,用第一个的数据覆盖第二个的,以此类推。将栈顶的位置空出来用来存放新的页面
{
for(int z=m-2;z>=0;z--)
{
zhan[z+1]=zhan[z];
}
zhan[0]=a[j];
num++;
}
for(int k=0;k<m;k++)
{
cout<<zhan[k]<<" ";
}
cout<<endl;
}
printf("缺页次数是%d次数",num);
sum=num/(n*1.0);
printf("缺页率为%lf",sum);
return 0;
}