上学期操作系统实训中的内容,当时百度的代码基本都用了链表,自己数据结构学的又不太好,感觉直接用百度的代码太过高级,自己就用C语言纯数组实现了这些算法,代码简单,符合自己的水平。
先进先出置换算法(FIFO)
#include<stdio.h>
void doit(int a[],int b[]){ //实现先进先出置换算法的方法
int i,j,k,z,temp;
for(i=0;i<15;i++){ //遍历15个页面
for(j=0;j<3;j++){ //遍历3个物理块
if(a[i]==b[j]){ //判断物理块中是否存在该页面
break;
}
}
if(j==3){ //如果物理块中不存在该页面
temp=a[i];
for(k=0;k<2;k++){
b[k]=b[k+1];
}
b[k]=temp;//替换最先进物理块的页面,即数组索引为0的页面
}
//打印
printf("\t第%d次\t",i+1);
for(z=0;z<3;z++){
printf("%d",b[z]);
}
if((i-1)%2==0){
printf("\n");
}
}
}
int main(){
int a[] = {1,5,4,8,5,6,9,7,4,0,2,1,2,5,3}; //页面数组
int b[3] ={0,0,0}; //物理块数组
doit(a,b);
return 0;
}
运行结果
最佳置换算法(OPT)
#include<stdio.h>
int main(){
int resource[] = {7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1}; //页面资源
//物理块在这里运用二维数组,第一列代表页号,第二列代表往后所需的位置,即索引号
int storge[3][2] = {{7,0},{0,0},{1,0}};
int i,j,k,s,count=0;
double result;
int flag_one=1,flag_two=1,flag_three=1;
//遍历物理块中是否存在所需的页面
for(i=0;i<20;i++){
for(j=0;j<3;j++){
if(resource[i]==storge[j][0]){
break;
}
}
//如果不存在
if(j==3){
count++; //计算缺页率会用到
//遍历往后所需该页号的位置,记录索引号,并更改标识
for(k=i+1;k<20;k++){
if(flag_one){
if(resource[k]==storge[0][0]){
storge[0][1]=k;
flag_one=0;
}
}
if(flag_two){
if(resource[k]==storge[1][0]){
storge[1][1]=k;
flag_two=0;
}
}
if(flag_three){
if(resource[k]==storge[2][0]){
storge[2][1]=k;
flag_three=0;
}
}
}
//选择应该替换的页面
if(storge[0][1]==0) {
storge[0][0]=resource[i];
}
else if(storge[1][1]==0) {
storge[1][0]=resource[i];
}
else if(storge[2][1]==0){
storge[2][0]=resource[i];
}
else{
if(storge[0][1]>storge[1][1]&&storge[0][1]>storge[2][1]){
storge[0][0]=resource[i];
}
else if(storge[1][1]>storge[0][1]&&storge[1][1]>storge[2][1]){
storge[1][0]=resource[i];
}
else if(storge[2][1]>storge[0][1]&&storge[2][1]>storge[1][1]){
storge[2][0]=resource[i];
}
}
//更改标识
storge[0][1]=0;
storge[1][1]=0;
storge[2][1]=0;
flag_one=1;
flag_two=1;
flag_three=1;
}
//打印
printf("\t第%d次\t",i+1);
for(s=0;s<3;s++){
printf("%d",storge[s][0]);
}
if((i-1)%2==0){
printf("\n");
}
}
result=(double)count/20*100;
printf("缺页率:%.2f%%",result);
}
运行结果
最近最久未使用(LRU)
此算法和OPT算法实现方法很类似,就没有再写了。