C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。

First Input First Output的缩写,先入先出队列,这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令。

FIFO(First Input First Output),即先进先出队列。在超市购物之后会提着我们满满的购物车来到收银台排在结账队伍的最后,眼睁睁地看着前面的客户一个个离开。这就是一种先进先出机制,先排队的客户先行结账离开。

c语言实现fifo算法及代码

在操作系统中,当程序在运行过程中,若其所要访问的页面不再内存中而需要把他们调入内存,但内存已无空闲空间时,为了保证该进程能正常运行,系统必须从内存调出一页程序或数据送磁盘的兑换区中。但哪一个页面调出,须根据一定的算法确定。通常,把选择换出页面的算法称为页面置换算法(Page-Replacement Algorithms)。置换算法的好坏将直接影响到系统的性能。

1) 先进先出(FIFO)页面置换算法

该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程调入内存,按先后顺序排成一个队列,并设置一个指针,称为替换指针,使他总能指向最老的页面。但该算法与进程与实际运行的规律不相适应,效率最差。

2) 最近最久为使用(LRU)算法

LRU算法是根据页面调入内存后的使用情况进行决策的。就是利用“最近的过去”作为“最近的将来”的近似,因此是将最近最久未使用的页面予以淘汰。该算法赋予每一个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,当淘汰一个页面时,选择现有页面中t值最大的,及最近最久为使用的页面予以淘汰。

167#include 《stdio.h》

#define PAGES 12 /*页面引用页数*/

#define M 3 /*当前分配给改作业的物理块数*/

//#define M 4

/*页面引用串*/

int page[PAGES] = {4,3,2,1,4,3,5,4,3,2,1,5};

int rel[M][PAGES]; /*存储结果数组*/

/*内存物理块结构体*/

typedef struct{

int pnum; /*该块中所存的页面号*/

int tm; /*从最近一次调入所经历的时间*/

}PBlock;

/*初始化物理块数组*/

void init(PBlock *pb)

{

int i,j;

//pb = (PBlock*)malloc(sizeof(PBlock)*M);

for(i=0;i《M;i++){

pb[i].pnum = -1;

pb[i].tm = -1;

for(j=0;j《PAGES;j++){

rel[i][j] = -1;

}

}

}

/*打印结果数组*/

void printRelArr(int rel[M][PAGES])

{

int i,j;

for(i=0;i《M;i++){

for(j=0;j《PAGES;j++){

if(rel[i][j]==-1)

printf(“_ ”);

else

printf(“%d ”,rel[i][j]);

}

printf(“\n”);

}

}

/*打印一维数组*/

void printArr1(int *arr,int n)

{

int i;

for(i=0;i《n;i++){

printf(“%d ”,arr[i]);

}

printf(“\n”);

}

/*查看页面号为num的页面是否在内存块中,存在返回1*/

int in_mem(int num,PBlock *pb,int m)

{

int i;

int b = 0;

for(i=0;i《m;i++){

if(pb[i].pnum == num){

b = 1;

break;

}

}

return b;

}

/*FIFO 算法的实现,无需考虑时间*/

int fifo(PBlock *pb,int m)

{

int lps=0; /*缺页次数*/

double lpp; /*缺页率*/

int p = 0; /*替换指针*/

int index =0; /*页面号索引*/

while(index《PAGES){

if(!in_mem(page[index],pb,M)){ //如果该页面不在物理块中

pb[p].pnum = page[index]; /*将该页面放入物理块中*/

p = (p+1)%M; /*替换指针移动*/

lps++; /*却也次数加 1*/

for(int i=0;i《M;i++){

rel[i][index] = pb[i].pnum;

}

}

index++;

}

printf(“FIFO算法所得缺页次数为 %d\n”,lps);

lpp = (double)lps/PAGES;

printf(“FIFO算法缺页率为 %0.4lf \n”,lpp);

printf(“页面号序列为:\n”);

printArr1(page,PAGES);

printf(“结果数列为:\n”);

printRelArr(rel);

return 0;

}

/*获得最近最久的块*/

int getP(PBlock *pb,int p)

{

int i;

bool out = true; //

for(i=0;i《M;i++){

if(pb[i].tm == -1){

p = i;

out = false;

break;

}

}

if(out){

for(i=0;i《M;i++){

if(pb[i].tm》pb[p].tm)

p = i;

}

}

return p;

}

int getEQnum(int num,PBlock *pb)

{

int i;

int in = -1;

for(i=0;i《M;i++){

if(pb[i].pnum == num){

in = i;

break;

}

}

return in;

}

/*LRU算法*/

void lru(PBlock *pb,int m)

{

int lps=0; /*缺页次数*/

double lpp; /*缺页率*/

int p = 0; /*替换指针*/

int index =0; /*页面号索引*/

while(index《PAGES){

if(!in_mem(page[index],pb,m)){ /*如果页面不在物理块中*/

p = getP(pb,p);

pb[p].pnum = page[index];

pb[p].tm = 0;

lps++;

for(int i=0;i《M;i++){

rel[i][index] = pb[i].pnum;

}

}else{ /*如果页面在物理块中*/

int in = getEQnum(page[index],pb); /*获取该页面在物理块中的索引*/

pb[in].tm = 0;

}

int i;

for(i=0;i《M;i++){

if(i!=p&&pb[i].tm!=-1){

pb[i].tm++;

}

}

index++;

}

printf(“LRU算法所得缺页次数为 %d \n”,lps);

lpp = 1.0*lps/PAGES;

printf(“LRU算法缺页率为: %0.4lf\n”,lpp);

printf(“页面号序列为:\n”);

printArr1(page,PAGES);

printf(“LRU结果数组为:\n”);

printRelArr(rel);

}

int main()

{

//printArr(rel);

PBlock pb[M];

init(pb);

fifo(pb,M);

init(pb);

lru(pb,M);

return 0;

}

FIFO的C语言实现

/*-----------------FIFO算法-------------------*/ /*算法描述:淘汰最先进入物理块的页面*/ /* ---------writen by Xu Zhuozhuo----------*/

C++代码示例:

#include 《iostream》

#define Num_Ref 20 //引用字符串的最大字符个数 using namespace std; int main() {

int num_ref; //用户的字符个数 int Phy_Blk[3];

//物理块个数为3 int ref_arr[Num_Ref];

//存放用户字符串

cout 《《“-----First In First Out-----” 《《endl 《《endl; do {

cout 《《“Please input the number of reference chars:” 《《endl; cin 》》num_ref;

//用户的字符个数 }while(num_ref》Num_Ref);

cout 《《“Please input the queue of reference chars:” 《《endl;

for(int i=0;i《num_ref;i++) //输入引用字符串

cin 》》ref_arr[i];

for(int j=0;j《3;j++) //物理块数组初始化

Phy_Blk[j]=ref_arr[j];

//FIFO,并输出本次替换结果

cout 《《endl 《《“Display the replacement procedure: ”;

cout 《《endl 《《“---------------------------------- ” 《《endl;

for(int loop=3;loop《num_ref;loop++)

{

Phy_Blk[0]=Phy_Blk[1];

Phy_Blk[1]=Phy_Blk[2];

Phy_Blk[2]=ref_arr[loop];

cout 《《endl 《《“[” 《《loop-2 《《“]。 Physical block array content: ”;

for(int inloop=0;inloop《3;inloop++)

cout 《《Phy_Blk[inloop] 《《“ ”;

}

return 0;

}

fifo算法c语言程序代码,c语言实现fifo算法及代码相关推荐

  1. c语言程序前言,C语言 程序代码编写规范前言

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 一个好的程序编写规范是编写高质量程序的保证.清晰.规范的源程序不仅仅是方便阅读,更重要的是能够便于检查错误,提高调试效率,从而最终保证软件的质量和可维护性 ...

  2. 情人节c语言程序,情人节c语言代码.doc

    情人节c语言代码 篇一:一些简单的C语言程序代码 由键盘任意输入1个4位数整数,分别输出其中的个位.十位.百位.千位. /* expe 3-10 */ #include #include void m ...

  3. 最初编写的c语言程序称为,C语言程序设计复习参考答案

    <C语言程序设计复习参考答案>由会员分享,可在线阅读,更多相关<C语言程序设计复习参考答案(46页珍藏版)>请在人人文库网上搜索. 1.随堂练习12]1. 下面哪些标识符属于合 ...

  4. c语言 程序循环,C语言程序设计-循环例子

    <C语言程序设计-循环例子>由会员分享,可在线阅读,更多相关<C语言程序设计-循环例子(28页珍藏版)>请在人人文库网上搜索. 1.C 语言程序设计基础篇,第 7 章 简单程序 ...

  5. c语言 程序结集,c语言(结体程序设计).doc

    c语言(结体程序设计) C语言程序设计实验报告 实验七.结构体程序设计 [实验目的] (1)掌握结构体类型的概念.定义和使用: (2)掌握结构体数组.结构体指针的定义和使用: [实验内容及步骤] 1. ...

  6. 实验c语言程序数据类型,C语言编程实验.doc

    C语言编程实验.doc C语言程序设计上机安排C语言上机实验32学时序号实验项目名称内容提要学时数1上机操作初步熟悉VC语言上机环境:了解如何编辑.编译.连接和运行一个C程序.22简单的C程序设计掌握 ...

  7. 认识c语言程序,认识C语言 -一个完整的C语言程序是什么样的?

    为了创建完整的 C语言程序需要在 C 源文件中输入代码.任何文本编辑器(比如 Windows 中的"记事本")都可以创建 C 源文件,它们的文件名通常以".c" ...

  8. 简单说明c语言程序步骤,C语言的入门简介和三个简单的C语言程序详细说明

    学习一种编程语言,最重要的是建立一个练习环境,边学边练才能学好.Keil软件是目前最流行开发80C51系列单片机的软件,Keil提供了包括C编译器.宏汇编.连接器.库管理和一个功能强大的仿真调试器等在 ...

  9. c语言程序基本设计,C语言程序的设计基本6.ppt

    C语言程序的设计基本6 第六章 本章要点 建立循环程序设计的基本概念和逻辑思维 掌握循环程序设计的方法 6.1 if-goto 语句循环 一般形式: goto 标号: 标号:语句 其中:标号用标识符表 ...

  10. 好听的歌曲单片机c语言程序,单片机C语言程序举例(三)

    原标题:单片机C语言程序举例(三) 14.音乐播放 //此程序在硬件上调试通过 //本程序的晶振采用11.0592M #include sbit speaker=P1^2; unsigned char ...

最新文章

  1. 求二维数组最大子数组
  2. python使用matplotlib可视化、查看matplotlib中常用的线条形式(line style)和数据点标记形状(marker)
  3. Android应用开发—AsyncTask
  4. java判断ajax请求_判断Httprequest 是否ajax 请求的方法
  5. Java中Arrays.toString ()打印二维数组及Array数组的常用操作
  6. Java线程同步的一些例子
  7. log4j控制日志的输出文件
  8. 【Angular 4】数据绑定
  9. JavaScript 是如何工作的:WebRTC和对等网络的机制!
  10. Groovy 学习手册(4)
  11. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第3节 线程同步机制_3_线程安全问题产生的原理...
  12. Mybatis查询时数据丢失的问题
  13. Android超级好看的动态登陆界面(附有详细代码)
  14. 1. 走进Java语言 —— Java SE
  15. 怎么删除映射网络里的计算机,win10系统删除右键中“映射网络驱动器和断开网络驱动器”选项的详细办法...
  16. 2022-03-24 windows pc和Android 手机同屏软件vysor,download网址: https://www.vysor.io/#
  17. 重庆工程学院计算机设计大赛获奖名单,重大城科学子在2018年(第11届)中国大学生计算机设计大赛全国总决赛获一等奖...
  18. java点击按钮隐藏图片6_原生JS实现隐藏显示图片 JS实现点击切换图片效果
  19. NLP - 文本向量化
  20. 日期时间存入数据库会差一天?

热门文章

  1. 我在赶集网的两个月(完整版)--ZT
  2. WIN10 隐藏Administrator账户的方法
  3. Elasticsearch实战 | 如何从数千万手机号中识别出情侣号?
  4. 2019想脱单?这款Python智能化“天气提醒”程序暖心你的小姐姐!
  5. npm install简介
  6. 电子采购一体化解决方案
  7. 计算机应用订单班,计算机应用技术订单班人才培养模式
  8. Android 车企一年半技术总结
  9. 利用python的turtle库写生日祝福
  10. C语言-如何将大写字母转化成小写字母输出(新手初学版)