本篇文章给大家谈谈fifoc语言程序,以及c++ fifo对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
1、怎样用C语言编写简单的FIFO置换算法2、C语言模拟FIFO算法,随机生成320条指令,有四块物理块,为什么错了?3、c语言,打开fifo文件时就没有反应,也不报错,就像是被暂停了一样,请问是怎么个情况?代码如下。4、用单片机如何把fifo中的数据读出来,通过串口发出。c语言程序。下面的汇编不太明白
怎样用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;icount;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;icount1;i++)
{
printf(“please input a number to tail\n”);
scanf(“%d”,dataa);
insertdatatail(q,dataa);
}
puttail(q);
deltail(q);
puttail(q);
return 0;
}
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;iBsize;i++)
{
block[i].pagenum=-1;
block[i].accessed=0;
pc=n=0;
}
}
//————————————————————-
int findExist(int curpage)
{
for(int i=0; iBsize; i++)
{
if(block[i].pagenum == curpage )
return i;//检测到内存中有该页面,返回block中的位置
}
return -1;
}
//————————————————————-
int findSpace( )
{
for(int i=0; iBsize; i++)
{
if(block[i].pagenum == -1)
return i;//找到空闲的block,返回block中的位置
}
return -1;
}
//————————————————————-
int findReplace( )
{
int pos = 0;
for(int i=0; iBsize; i++)
{
if(block[i].accessed block[pos].accessed)
pos = i;//找到应予置换页面,返回BLOCK中位置
}
return pos;
}
//————————————————————-
void display( )
{
for(int i=0; iBsize; i++)
{
if(block[i].pagenum != -1)
{ printf(” %02d”,block[i].pagenum);}
}
coutendl;
}
//————————————————————-
void suijishu( )
{ int flag=0;
cinpc;
cout”******按照要求产生的320个随机数:*******”endl;
for(int i=0;i320;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) coutendl;
}
}
//————————————————————-
void pagestring( )
{
for(int i=0;i320;i++)
{
printf(” %02d”,temp[i]/10);
if((i+1)%10==0) coutendl;
}
}
//————————————————————-
void OPT( )
{
int exist,space,position ;
int curpage;
for(int i=0;i320;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;kBsize;k++)
{
for(int j=i;j320;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”缺页次数:”nendl;
cout”缺页率:”(n/320.0)*100″%”endl;
}
//————————————————————-
void LRU( )
{
int exist,space,position ;
int curpage;
for(int i=0;i320;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; j4; j++)
{block[j].accessed++;}
}
cout”缺页次数:”nendl;
cout”缺页率:”(n/320.0)*100″%”endl;
}
//————————————————————-
void FIFO( )
{
int exist,space,position ;
int curpage;
for(int i=0;i320;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; jBsize; j++)
block[j].accessed++;
}
cout”缺页次数:”nendl;
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” 请选择一种页面置换算法:”;
cinselect;
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文件时就没有反应,也不报错,就像是被暂停了一样,请问是怎么个情况?代码如下。
你需要再写一个读的程序 一起运行。
FIFO的打开规则:
如果当前打开操作是为读而打开FIFO时,若已经有相应进程为写而打开该FIFO,则当前打开操作将成功返回;否则,可能阻塞直到有相应进程为写而打开该FIFO(当前打开操作设置了阻塞标志);或者,成功返回(当前打开操作没有设置阻塞标志)。
如果当前打开操作是为写而打开FIFO时,如果已经有相应进程为读而打开该FIFO,则当前打开操作将成功返回;否则,可能阻塞直到有相应进程为读而打开该FIFO(当前打开操作设置了阻塞标志);或者,返回ENXIO错误(当前打开操作没有设置阻塞标志)。
总之就是一句话,一旦设置了阻塞标志,调用mkfifo建立好之后,那么管道的两端读写必须分别打开,有任何一方未打开,则在调用open的时候就阻塞。
用单片机如何把fifo中的数据读出来,通过串口发出。c语言程序。下面的汇编不太明白
这汇编程序等价于
sbit ef = P3^3;
sbit rst = P3^5;
sbit read = P3^7;
void main()
{
unsigned char tempP1;
TMOD = 0x21;
PCON |= 0x80;
TH1 = 0xFD;
TR1 = 1;
SCON = 0x50;
TI = 0;
read = 1;
rst = 0;
_nop_();
rst = 1;
while(1)
{
while(ef==0);
_nop_();
tempP1 = P1;
_nop_();
read = 1;
while(TI==0);
TI = 0;
SBUF = tempP1;
}
}
fifoc语言程序的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c++ fifo、fifoc语言程序的信息别忘了在本站进行查找喔。