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);

参考技术A 这可是hen宝贵的啊
#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条指令,有四块物理块,为啥错了?的主要内容,如果未能解决你的问题,请参考以下文章

FIFO页面置换模拟

算法1---随机生成算法

模拟算法

数据结构与算法分析(C语言描述)习题2.7

操作系统——请求调页存储管理方式的各种模拟

MIPS汇编及模拟器下载