C语言模拟FIFO算法,随机生成320条指令,有四块物理块,为啥错了?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言模拟FIFO算法,随机生成320条指令,有四块物理块,为啥错了?相关的知识,希望对你有一定的参考价值。
#include <stdio.h>
#include <stdlib.h> //rand函数的头文件
#include <time.h> //时间函数的头文件
#define N 4
int srand(int x,int y)
int z; //循环变量
z = rand()%(y-x+1)+x; //产生[100,200]内的随机整数
return z;
//采用表达式rand()%(Y-X+1)+X 可以产生[X,Y]区间内随机整数。
//先进先出页面淘汰算法(FIFO)
int Fifo(int f1[N], int p1[320], int n1)
int i, j, flag, page, c1 = 0;
for (i=n1; i<=319; i++)
flag = 0;
page = p1[i];
for (j=0; j<=N-1; j++)
if (page == f1[i])
flag = 0;
break;
else
flag++;
if (flag == 4)
for (i=0; i<N-1; i++)
f1[i] = f1[i+1];
f1[N-1] = page;
c1 = c1 + 1;
return c1;
/*
//最近最久未使用页面淘汰法(LRU)
int Lru()
int ;
*/
int main()
int m, i, n, c;
int a[320], p[320], f[N];
int j = 0, count = 1;
int flag, page, k, q;
//按原则执行320条指令
srand((unsigned) time(NULL)); //产生随机数的起始数据(以时间为种子)
for (i = 1; i <= 80; i++)
m = srand(0,319);
a[j] = m + 1;
a[j+1] = srand(0,a[j]);
a[j+2] = a[j+1] + 1;
a[j+3] = srand(a[j+1]+2,319);
j = j+4;
/*
for (i = 0; i<=319; i++)
printf("%d\t",a[i]);
if (count%12==0)
printf("\n");
count++;
*/
//指令序列变换成页地址流
int count1 = 1;
for (i = 0; i<=319; i++)
p[i] = a[i]/10;
printf("%d\t",p[i]);
if (count1%4==0)
printf("\n");
count1++;
printf("\n\n");
//初始化物理块
for (i=0; i<=N-1; i++)
for (j=0; j<=319; j++)
flag = 0;
page = p[j];
for (k=0; k<=N-1; k++)
if (page == f[k])
flag = 0;
break;
else
flag++;
if (flag == 4)
f[i] = page;
n++;
break;
n = j;
c = Fifo(f, p, n) + N;
printf("%d\n",c);
#include
#include
#include
#include
#define Bsize 4
typedef struct BLOCK//声明一种新类型——物理块类型
int pagenum;//页号
int accessed;//访问字段,其值表示多久未被访问
BLOCK;
int pc;//程序计数器,用来记录指令的序号
int n;//缺页计数器,用来记录缺页的次数
static int temp[320];//用来存储320条随机数
BLOCK block[Bsize]; //定义一大小为4的物理块数组
//*************************************************************
void init( ); //程序初始化函数
int findExist(int curpage);//查找物理块中是否有该页面
int findSpace( );//查找是否有空闲物理块
int findReplace( );//查找应予置换的页面
void display ( );//显示
void suijishu( );//产生320条随机数,显示并存储到temp[320]
void pagestring( );//显示调用的页面队列
void OPT( );//OPT算法
void LRU( );// LRU算法
void FIFO( );//FIFO算法
//*************************************************************
void init( )
for(int i=0;i<Bsize;i++)
block[i].pagenum=-1;
block[i].accessed=0;
pc=n=0;
//-------------------------------------------------------------
int findExist(int curpage)
for(int i=0; i<Bsize; i++)
if(block[i].pagenum == curpage )
return i;//检测到内存中有该页面,返回block中的位置
return -1;
//-------------------------------------------------------------
int findSpace( )
for(int i=0; i<Bsize; i++)
if(block[i].pagenum == -1)
return i;//找到空闲的block,返回block中的位置
return -1;
//-------------------------------------------------------------
int findReplace( )
int pos = 0;
for(int i=0; i<Bsize; i++)
if(block[i].accessed >block[pos].accessed)
pos = i;//找到应予置换页面,返回BLOCK中位置
return pos;
//-------------------------------------------------------------
void display( )
for(int i=0; i<Bsize; i++)
if(block[i].pagenum != -1)
printf(" %02d",block[i].pagenum);
cout<<endl;
//-------------------------------------------------------------
void suijishu( )
int flag=0;
cin>>pc;
cout<<"******按照要求产生的320个随机数:*******"<<endl;
for(int i=0;i<320;i++)
temp[i]=pc;
if(flag%2==0) pc=++pc%320;
if(flag==1) pc=rand( )% (pc-1);
if(flag==3) pc=pc+1+(rand( )%(320-(pc+1)));
flag=++flag%4;
printf(" %03d",temp[i]);
if((i+1)%10==0) cout<<endl;
//-------------------------------------------------------------
void pagestring( )
for(int i=0;i<320;i++)
printf(" %02d",temp[i]/10);
if((i+1)%10==0) cout<<endl;
//-------------------------------------------------------------
void OPT( )
int exist,space,position ;
int curpage;
for(int i=0;i<320;i++)
if(i%100==0) getch( );
pc=temp[i];
curpage=pc/10;
exist = findExist(curpage);
if(exist==-1)
space = findSpace ( );
if(space != -1)
block[space].pagenum = curpage;
display( );
n=n+1;
else
for(int k=0;k<Bsize;k++)
for(int j=i;j<320;j++)
if(block[k].pagenum!= temp[j]/10)
block[k].accessed = 1000;
//将来不会用,设置为一个很大数
else
block[k].accessed = j;
break;
position = findReplace( );
block[position].pagenum = curpage;
display( );
n++;
cout<<"缺页次数:"<<n<<endl;
cout<<"缺页率:"<<(n/320.0)*100<<"%"<<endl;
//-------------------------------------------------------------
void LRU( )
int exist,space,position ;
int curpage;
for(int i=0;i<320;i++)
if(i%100==0) getch( );
pc=temp[i];
curpage=pc/10;
exist = findExist(curpage);
if(exist==-1)
space = findSpace( );
if(space != -1)
block[space].pagenum = curpage;
display( );
n=n+1;
else
position = findReplace( );
block[position].pagenum = curpage;
display( );
n++;
else block[exist].accessed = -1;//恢复存在的并刚访问过的BLOCK中页面accessed为-1
for(int j=0; j<4; j++)
block[j].accessed++;
cout<<"缺页次数:"<<n<<endl;
cout<<"缺页率:"<<(n/320.0)*100<<"%"<<endl;
//-------------------------------------------------------------
void FIFO( )
int exist,space,position ;
int curpage;
for(int i=0;i<320;i++)
if(i%100==0) getch( );
pc=temp[i];
curpage=pc/10;
exist = findExist(curpage);
if(exist==-1)
space = findSpace( );
if(space != -1)
block[space].pagenum = curpage;
display( );
n=n+1;
else
position = findReplace( );
block[position].pagenum = curpage;
display( );
n++;
block[position].accessed--;
for(int j=0; j<Bsize; j++)
block[j].accessed++;
cout<<"缺页次数:"<<n<<endl;
cout<<"缺页率:"<<(n/320.0)*100<<"%"<<endl;
//*************************************************************
void main( )
int select;
cout<<"请输入第一条指令号(0~320):";
suijishu( );
cout<<"*****对应的调用页面队列*******"<<endl;
pagestring( );
do
cout<<"****************************************"<<endl;
cout<<"------1:OPT 2:LRU 3:FIFO 4:退出-----"<<endl;
cout<<"****************************************"<<endl;
cout<<" 请选择一种页面置换算法:";
cin>>select;
cout<<"****************************************"<<endl;
init( );
switch(select)
case 1:cout<<"最佳置换算法OPT:"<<endl;
cout<<"*****************"<<endl;
OPT( );
break;
case 2:cout<<"最近最久未使用置换算法LRU:"<<endl;
cout<<"**************************"<<endl;
LRU( );
break;
case 3:cout<<"先进先出置换算法FIFO:"<<endl;
cout<<"*********************"<<endl;
FIFO( );
break;
default: ;
while(select!=4);
你试试可以不,应该没问题的
要注意这是用C++编写的,你改一下就可以用了
以上是关于C语言模拟FIFO算法,随机生成320条指令,有四块物理块,为啥错了?的主要内容,如果未能解决你的问题,请参考以下文章