1.实验步骤:
本实验只有两个算法的实现,先输入初始进程信息和物理块数,再用两个置换算法对数据进行处理。
1.1先进先出置换算法:
进来一个进程,判断是否在当前物理块中,如果在,不做处理,如果不在,替换掉最先进来的那个进程,实现很简单,若在指针不动,在替换当前指针所指位置,指针再循环下移。
1.2.最近最久未使用置换算法:
和上述算法类似,只是替换的方式不一样,实现的时候多加了一个当前物理块的已访问时间,若存在当前进程,时间置零,不存在,替换掉时间最多的那个页面,替换的页面时间为零,其他所有进程时间都加1。
2.源代码:
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
//先进先出页面置换算法
void FIFO(int a[],int n,int m){
int i,j;
int k=0;//当前替换位置
int b[100];//当前物理块信息
int flag=0;//是否存在
int count=0;//缺页次数
//给物理块初始化为-1,-1为未使用的
for(i=0;i<m;i++)
b[i]=-1;
//每个进程顺次进来
for(i=0;i<n;i++){
flag=0;
//判断现在物理块中是否有当前进程
for(j=0;j<m;j++){
if(a[i]==b[j]){
flag=1;
break;
}
}
//如果没有当前进程,进行页面置换,采用先进先出算法
if(flag==0){
count++;//缺页次数加1
b[k]=a[i];
k=(k+1)%m;//当前缺页指针循环后移
}
//输出现在物理块情况
cout<<a[i]<<" ";
for(j=0;j<m;j++){
cout<<b[j]<<" ";
}
cout<<endl;
}
cout<<"缺页次数:"<<count<<endl;
cout<<"页面置换次数:"<<count-m<<endl;
}
//最近最久未使用置换算法
void LRU(int a[],int n,int m){
int cishu[100]={0};//当前物理块的未访问时间
int i,j,max=0;
int k=0;//当前替换位置
int b[100];//当前物理块信息
int flag=0;//是否存在
int count=0;//缺页次数
for(i=0;i<m;i++)
b[i]=-1;
//每个进程顺次进来
for(i=0;i<n;i++){
flag=0;
//判断现在物理块中是否有当前进程
for(j=0;j<m;j++){
if(a[i]==b[j]){
flag=1;
k=j;
break;
}
}
//如果不存在,页面置换,采用最久未使用页面置换算法
if(flag==0){
count++;//缺页次数加1
max=-1;
//找到最久未使用的页面
for(j=0;j<m;j++){
if(cishu[j]>max){
max=cishu[j];
k=j;
}
}
b[k]=a[i];
//现在页面时间置零,其他加1
cishu[k]=0;
for(j=0;j<m;j++){
if(j!=k)
cishu[j]++;
}
}
else{
cishu[k]=0;//已经访问过,置零
//其他页面时间加1
for(j=0;j<m;j++){
if(j!=k)
cishu[j]++;
}
}
//输出现在物理块情况
cout<<a[i]<<" ";
for(j=0;j<m;j++){
cout<<b[j]<<" ";
}
cout<<endl;
}
cout<<"缺页次数:"<<count<<endl;
cout<<"页面置换次数:"<<count-m<<endl;
}
int main(){
int a[100];//存储引用序列
int i=0,n,m;
char x;
cin>>x;
//初始数据输入,到#结束
while(x!='#'){
a[i++]=x-'0';//将字符转换为数字
cin>>x;
}
cout<<"请输入物理块数:";
cin>>m;
n=i;//总数量
cout<<"初始输入信息:"<<endl;
for(i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
cout<<"使用FIFO页面调度算法:"<<endl;
FIFO(a,n,m);
cout<<"--------------------------------------"<<endl;
cout<<"使用LRU页面调度算法:"<<endl;
LRU(a,n,m);
return 0;
}