当前位置:首页 » 编程语言 » c语言实现fifo

c语言实现fifo

发布时间: 2023-01-11 07:20:36

c语言模拟FIFO算法,随机生成320条指令,有四块物理块,为什么错了

这可是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.h

UINT8 UINT16 都是自定义的类型别名, 你顺着头文件找找
一般这俩是
typedef unsigned char UINT8;
typedef unsigned short UINT16;

⑶ 页面调度先进先出算法(FIFO) 用C语言描述 欢迎高手前来挑战

c语言实现的页面调度算法,用三种算法实现调度1.先进先出2.OPT3.LRU 2.页面序列从指定的文本文件(TXT文件)中取出3.输出:第一行:每次淘汰的页面号 第二行:显示缺页的总次数(上机已经运行通过!!)-pages scheling algorithm, a three-Scheling Algorithm 1. FIFO 2.OPT3.LRU 2. Pages from the designated sequence of text files (TXT) out of three. Output : the first line : each of the pages out of the second line : show na the total number of pages (on the plane had run through! !)

⑷ 怎样用C语言编写简单的FIFO置换算法

#include "stdio.h"
#include "malloc.h"
#define OK 1
#define ERROR 0
#define NULL 0
#define status int
typedef int Elemtype;

/*这个定义的是队列的元素的数据结构*/
typedef struct tailDATA{
Elemtype data;/*这个存放的是队列元素的值*/
struct tailDATA *next;//指向下一个元素
}datatail,*map;

/*以下定义的是队列头的数据结构*/
typedef struct Tail{
/*说明:对队列进行操作的时候,插入的时候是对front操作,删除*/
Elemtype data;/*这个记载的是队列的元素的个数*/
map front;/*这个是队列的头*/
map rear;/*这个是队列的尾*/
}tail,*mappath;

/*以下定义的就是操作了,初始话的操作就不想做了,直接写个插入和删除等的一些的算法就可以了*/
status inserttail(mappath &T,map P)
{/*这个函数的功能是将一个个已知的元素插入队列中*/
if(T==NULL)
{
T=(mappath)malloc(sizeof(tail));
T->data=0;
T->front=NULL;
T->rear=NULL;
}
if(!P) return OK;
T->rear->next=P;
T->rear=P;
if(!(T->front)) T->front=P;
return OK;
}

status insertdatatail(mappath &T,int a)
{/*这个函数将一个元素插入队列中,其实这个函数是没有必要的,但是为了方便起见,还是写了个*/
if(T==NULL)
{
T=(mappath)malloc(sizeof(tail));
T->data=0;
T->front=NULL;
T->rear=NULL;
map linshi=(map)malloc(sizeof(datatail));
linshi->data=a;
linshi->next=NULL;
T->front=linshi;
T->rear=linshi;
T->data=1;
return OK;
}
map linshi=(map)malloc(sizeof(datatail));
linshi->data=a;
linshi->next=NULL;
T->rear->next=linshi;
T->rear=linshi;
if(!(T->front)) T->front=linshi;
T->data++;
return OK;
}

status deltail(mappath &T)
{/*因为对队列进行删除操作的时候,基本上是没有什么条件,就是对front做一些相应的操作就可以了
,所以他的函数列表也就比较少了*/
if(!T) return ERROR;/*如果队列本来就是空的,那么就返回一个错误的信息*/
if(T->front==T->rear)
{/*如果队列只有一个元素,就执行下面的操作,防止出现了错误*/
map linshi=T->front;
free(linshi);
T->data=0;
T->front=NULL;
T->rear=NULL;
return OK;
}
map linshi=T->front;
T->front=T->front->next;
T->data--;
free(linshi);
return OK;
}

status puttail(mappath T)
{/*这个是对一个已经存在的队列进行输出*/
if(!T) return ERROR;
printf("the tail'count is %d\n",T->data);
int count=T->data;map q=T->front;
for(int i=0;i<count;i++)
{
printf("%d ",q->data);
q=q->next;
}
return OK;
}

int main()
{
printf("hello,world!\n");
mappath q=NULL;int count1=0;int dataa=0;
printf("please input a number to the count of tail\n");
scanf("%d",&count1);
for(int i=0;i<count1;i++)
{
printf("please input a number to tail\n");
scanf("%d",&dataa);
insertdatatail(q,dataa);
}
puttail(q);
deltail(q);
puttail(q);
return 0;
}

⑸ 用c语言分页式存储管理的地址转换过程实现

逻辑地址转换为物理地址
#include<stdio.h>
main()
{int p,d,la,pa,ps,a[100],n,i;/*pa为物理地址,la为物理地址,ps为页面大小,a[100]存放页表中对应主存的页号,n为页面数*/
printf("请输入逻辑地址la=");/*输入逻辑地址*/
scanf("%d",&la);
printf("请输入页面大小ps=");/*输入页面大小*/
scanf("%d",&ps);
printf("请输入页面数n=");/*输入页面数*/
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("输入页表中第%d页项中主存页号=",i);
scanf("%d",&a[i]);
}/*输入页表中主存的页号*/
p=la/ps;d=la-p*ps;/*p为页表项的页号,d为页内位移*/
pa=a[p]*ps+d;
printf("逻辑地址为%d的物理地址为%d",la,pa);
}

⑹ 页面调度先进先出算法(FIFO) C语言描述

7,0,1 //先把三个页面放入主存 0,1,2//缺少页面2,把2放入,页面7出 1,2,0 2,0,3//缺少页面3,放入3,页面1出 2.3.0 3,0,4//缺少页面4,放入4,页面2出 0,4,2//缺少页面2,放入2,页面3出 4,2,3//缺少页面3,放入3,页面0出 2,3,0//缺少页面0,放入0,页面4出 2,0,3 0,3,2 3,2,1//缺少页面1,放入1,页面0出 3,1,2

⑺ c语言,打开fifo文件时就没有反应,也不报错,就像是被暂停了一样,请问是怎么个情况代码如下。

你需要再写一个读的程序 一起运行。
FIFO的打开规则:
如果当前打开操作是为读而打开FIFO时,若已经有相应进程为写而打开该FIFO,则当前打开操作将成功返回;否则,可能阻塞直到有相应进程为写而打开该FIFO(当前打开操作设置了阻塞标志);或者,成功返回(当前打开操作没有设置阻塞标志)。
如果当前打开操作是为写而打开FIFO时,如果已经有相应进程为读而打开该FIFO,则当前打开操作将成功返回;否则,可能阻塞直到有相应进程为读而打开该FIFO(当前打开操作设置了阻塞标志);或者,返回ENXIO错误(当前打开操作没有设置阻塞标志)。
总之就是一句话,一旦设置了阻塞标志,调用mkfifo建立好之后,那么管道的两端读写必须分别打开,有任何一方未打开,则在调用open的时候就阻塞。

⑻ c语言fifo算法后几个数据输出错误

参数k 循环一次之后没有归零,导致只输出一组数 应该改为 :参数k在定义部分定义吧,然后别赋值,在循环里面赋值 for(k=0;k<3;k++)

我改的函数如下,不知道适合你说的算法没有:
#include <stdio.h>
int main()
{
int a[20]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
int b[3]={-1,-1,-1};
int i=0,j,k;
for(j=0;j<20;j++)
{

if(a[j]!=b[i])
{
b[i]=a[j];
for(k=0;k<3;k++)
printf("%d",b[k]);
printf("\n");
i++;
if(i>2)
i=0;
}

}
return 0;
}

热点内容
如何用密码锁定 发布:2025-07-12 14:39:10 浏览:924
软件发布源码 发布:2025-07-12 14:29:34 浏览:178
sql函数和存储过程的区别 发布:2025-07-12 14:26:37 浏览:29
查看存储功空间 发布:2025-07-12 14:17:22 浏览:941
安卓手机的朗读功能在哪里 发布:2025-07-12 14:17:07 浏览:298
mysql属于什么数据库 发布:2025-07-12 13:55:52 浏览:166
源码抓捕 发布:2025-07-12 13:47:34 浏览:873
安卓哪里有李小龙 发布:2025-07-12 13:31:49 浏览:439
苹果保存账号密码在哪里找 发布:2025-07-12 13:31:07 浏览:99
东北大学c语言考试题 发布:2025-07-12 13:26:40 浏览:756