fifo算法
Ⅰ FIFO算法的解释
/*我知道FIFO算法的原理,可还是不理解这代码,哪位高手指教下各个程序段的意思啊?不胜感激! */
#include <stdio.h>
#include <stdlib.h>
#define mSIZE 3//分配三个内存页框
#define pSIZE 12//总共12个进程
static int memery[mSIZE] = {0};
static int process[pSIZE] = {1,2,3,4,1,2,5,1,2,3,4,5};//页面访问序列
void FIFO();
int main()
{
get();
printf("\n(FIFO)\tcount\n");
FIFO();
system("PAUSE");
return 0;
}
get()
{
int w[12]={1,2,3,4,1,2,5,1,2,3,4,5}; //需要访问的资源序列
int i,n;
for(i=0;i<12;i++) //输出序列
{
printf("%d ",w[i]);
}
}
void FIFO()
{
int time[mSIZE] = {0}; //分配的三个页框初始化为0
int i = 0, j = 0;
int m = -1, n = -1;
int max = -1,maxtime = 0;
int count = 0;
for(i = 0; i<pSIZE; i++) //开始循环,在页框中寻找所需资源
{
for(j=0; j<mSIZE; j++) //判断页框中是否满
{
if(memery[j] == 0) //寻找空页框,并且记录页号
{
m = j;
break;
}
}
for(j = 0; j < mSIZE; j++)
{
if(memery[j] == process[i]) //判断页框中是否有进程所需访问的资源
{
n = j;
}
}
for(j = 0; j < mSIZE;j++) //记录在页框中存放最长时间的资源,即第一个进入的资源
{
if(time[j]>maxtime)
{
maxtime = time[j]; //将存放最长时间资源的计数器的值赋给maxtime
max = j;
}
}
if(n == -1) //由于没有在页框中找到所需资源,并且也表已满,发生缺页中断。
{
if(m != -1)
{
memery[m] = process[i]; //没有替换的资源,则它对应的计数器加一
time[m] = 0;
for(j = 0;j <= m; j++)
{
time[j]++;
}
m = -1;
}
else
{
memery[max] = process[i]; //发生缺页中断,从前面的标记中寻找第一个进入页表的资源替换
time[max] = 0; //替换后原来的最长则清0,
for(j = 0;j < mSIZE; j++)
{
time[j]++; //替换后,此资源对应的计数器加一
}
max = -1;
maxtime = 0;
count++;
}
}
else
{
memery[n] = process[i];
for(j = 0;j < mSIZE; j++) //一次分配对所有在页表中的资源的计数器加一
{
time[j]++;
}
n = -1;
}
for(j = 0 ;j < mSIZE; j++)
{
printf("%d ",memery[j]); //输出此次资源访问时页表中资源的情况。
}
printf("\t%d\n",count);
}
}
Ⅱ 先进先出置换算法,(fifo)
的确是书错了
Ⅲ FIFO和LRU置换算法的问题
FIFO 先进先出
-------------
刚开始内存为空 null, null, null
使用2,缺页读入 2, null, null
使用3,缺页读入 2, 3, null
使用2,直接使用 2, 3, null
使用1,缺页读入 2, 3, 1
使用5,缺页读入 3, 1, 5 因为2是最先读入的,所以就把它删掉
使用2,缺页读入 1, 5, 2
使用4,缺页读入 5, 2, 4
使用5,直接使用 5, 2, 4
使用3,缺页读入 2, 4, 3
使用2,直接使用 2, 4, 3
使用5,缺页读入 4, 3, 5
使用2,缺页读入 3, 5, 2
共9次缺页
========================
LRU 会删除最不常访问的
----------------------
刚开始内存为空 null, null, null
使用2,缺页读入 2, null, null
使用3,缺页读入 3, 2, null
使用2,直接使用 2, 3, null
使用1,缺页读入 1, 2, 3
使用5,缺页读入 5, 1, 2 因为最近1和2都访问过而3是很早之前用过的,所以就把它删掉
使用2,直接使用 2, 5, 1
使用4,缺页读入 4, 2, 5
使用5,直接使用 5, 4, 2
使用3,缺页读入 3, 5, 4
使用2,缺页读入 2, 3, 5
使用5,直接使用 5, 2, 3
使用2,直接使用 2, 5, 3
共7次缺页
Ⅳ FIFO调度算法和LRU算法
FIFO:先进先出调度算法
LRU:最近最久未使用调度算法
两者都是缓存调度算法,经常用作内存的页面置换算法。
打一个比方,帮助你理解。
你有很多的书,比如说10000本。
由于你的书实在太多了,你只能放在地下室里面。
你看书的时候不会在地下室看书,而是在书房看书。
每次,你想看书都必须跑到地下室去找出来你想看的书,
然后抱回来放到书桌上,之后才开始看。
还有就是,有一些书你会反复的看,今天看了也许过几天又要看。
总之,你自己是不知道你哪天会需要看哪本书的。
你的老师每天下课的时候会给你布置一个书单,让你晚上回去去看哪本书。
(假设你老师让你看的书在你的地下室里面都有)
跑地下室当然是非常麻烦的,所以你希望你的经常看的那些书最好放在书桌上。
但是你的书房的书桌同时只能摆放10本书(这个是假设的啊)。
那么,问题来了。
到底把哪些说留在书桌上最好呢?
这里说的最好,就是说你尽量少的跑地下室去找书。
为了解决这个问题,人们发明了很多的算法。
其中,比较常见的就是上面这两种:FIFO算法和LRU算法。
FIFO算法
很简单,我把书桌上的10本书按照放置时间先后堆放成一堆。
这里的放置时间,就是说这本书在我的书桌上放了几天了。
每次要看书的时候,我先在书桌上找,找到就直接可以读了。
读完之后放回原来的位置就可以,不打乱顺序。
如果书桌上面没有我要读的书,就去地下室找。
找来之后,我就把书桌上放的时间最长的那本(也就是
书堆里面最下面的那本书)放回地下室。
然后把我今天需要看的这本书放在书堆的最上面。
LRU算法
也不难,我把书桌上的10本书按照阅读时间先后堆放成一堆。
这里的阅读时间,就是说我最近一次读这本书是几天之前。
每次要看书的时候,我先在书桌上找,找到就直接可以读了。
读完之后放在书堆的最上面。
如果书桌上面没有我要读的书,就去地下室找。
找来之后,我就把书桌上最久没有阅读的那本
(也就是书堆里面最下面的那本书)放回地下室。
然后把我今天需要看的这本书放在书堆的最上面。
上面这个比方,相信你可以看明白吧。
这里的地下室对应内存,书桌对应缓存,书对应页面。
Ⅳ fifo算法适用于什么场合又有何缺点
适用于:按线性顺序访问的地址空间
缺点:可能抖动,会发生Belady异常
Ⅵ LRU和FIFO算法计算缺页次数(急)
没分
LRU:9次
Ⅶ 如何用java实现fifo页面置换算法
[fifo.rar] - 操作系统中内存页面的先进先出的替换算法fifo
[先进先出页面算法程序.rar] - 分别实现最佳置换算法(optimal)、先进先出(fifo)页面置换算法和最近最久未使用(LRU)置换算法,并给出各算法缺页次数和缺页率。
[0022.rar] - 模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断
[Change.rar] - 用java实现操作系统的页面置换 其中包括 最佳置换算法(Optimal)、先进先出算法(First-in, First-out) 、最近最久不用的页面置换算法(LeastRecently Used Replacement)三种算法的实现
[M_Management.rar] - 操作系统中内存管理页面置换算法的模拟程序,采用的是LRU置换算法
[detail_of_44b0x_TCPIP.rar] - TCPIP 程序包加载到44b0x 的ADS1.2工程文件的说明书。说名了加载过程的细节和如何处理演示程序和代码。演示代码已经上传,大家可以搜索
[.rar] - java操作系统页面置换算法: (1)进先出的算法(fifo) (2)最近最少使用的算法(LRU) (3)最佳淘汰算法(OPT) (4)最少访问页面算法(LFU) (注:由本人改成改进型Clock算法) (5)最近最不经常使用算法(NUR)
Ⅷ hadoop集群中,fifo调度算法具有哪些特点
首先介绍了Hadoop平台下作业的分布式运行机制,然后对Hadoop平台自带的4种任务调度器做分析和比较,最后在分析JobTracker类文件的基础上指出了创建自定义任务调度器所需完成的工作。首先Hadoop集群式基于单服务器的,只有一个服务器节点负责调度整个集群的作业运行,主要的具体工作是切分大数据量的作业,指定哪些Worker节点做Map工作、哪些Worker节点做Rece工作、与Worker节点通信并接受其心跳信号、作为用户的访问入口等等。其次,集群中的每个Worker节点相当于一个器官,运行着主节点所指派的具体作业。这些节点会被分为两种类型,一种是接收分块之后的作业并做映射工作。另一种是负责把前面所做的映射工作按照约定的规则做一个统计。Task-Tracker通过运行一个简单循环来定期地发送心跳信号(heartbeat)给JobTracker.这个心跳信号会把TaskTracker是否还在存活告知JobTracker,TaskTracker通过信号指明自己是否已经准备好运行新的任务.一旦TaskTracker已经准备好接受任务,JobTracker就会从作业优先级表中选定一个作业并分配下去.至于到底是执行Map任务还是Rece任务,是由TaskTracker的任务槽所决定的.默认的任务调度器在处理Rece任务之前,会优先填满空闲的Map任务槽.因此,如果TaskTracker满足存在至少一个空闲任务槽时,JobTracker会为它分配Map任务,否则为它选择一个Rece任务.TaskTracker在运行任务的时候,第一步是从共享文件系统中把作业的JAR文件复制过来,从而实现任务文件的本地化.第二步是TaskTracker为任务新建一个本地文件夹并把作业文件解压在此目录中.第三步是由Task-Tracker新建一个TaskRunner实例来运行该任务.Hadoop平台默认的调度方案就是JobQueueTaskScheler,这是一种按照任务到来的时间先后顺序而执行的调度策略.这种方式比较简单,JobTracker作为主控节点,仅仅是依照作业到来的先后顺序而选择将要执行的作业.当然,这有一定的缺陷,由于Hadoop平台是默认将作业运行在整个集群上的,那么如果一个耗时非常大的作业进入执行期,将会导致其余大量作业长时间得不到运行.这种长时间运行的优先级别并不高的作业带来了严重的作业阻塞,使得整个平台的运行效率处在较低的水平.Hadoop平台对这种FIFO(FirstINAndFirstOut)机制所给出的解决法是调用SetJobPriority()方法,通过设置作业的权重级别来做平衡调度.FairScheler是一种“公平”调度器,它的目标是让每个用户能够公平地共享Hadoop集群计算能力.当只有一个作业运行的时候,它会得到整个集群的资源.随着提交到作业表中作业的增多,Hadoop平台会把集群中空闲出来的时间槽公平分配给每个需要执行的作业.这样即便其中某些作业需要较长时间运行,平台仍然有能力让那些短作业在合理时间内完成[3].FairScheler支持资源抢占,当一个资源池在一定时段内没有得到公平共享时,它会终止该资源池所获得的过多的资源,同时把这些释放的资源让给那些资源不足的资源池.Hadoop平台中的CapacityScheler是由Yahoo贡献的,在调度器上,设置了三种粒度的对象:queue,job,task.在该策略下,平台可以有多个作业队列,每个作业队列经提交后,都会获得一定数量的TaskTracker资源.具体调度流程如下.(1)选择queue,根据资源库的使用情况从小到大排序,直到找到一个合适的job.(2)选择job,在当前所选定的queue中,按照作业提交的时间先后以及作业的权重优先级别进行排序,选择合适的job.当然,在job选择时还需要考虑所选作业是否超出目前现有的资源上限,以及资源池中的内存是否够该job的task用等因素.(3)选择task,根据本地节点的资源使用情况来选择合适的task.虽然Hadoop平台自带了几种调度器,但是上述3种调度方案很难满足公司复杂的应用需求.因此作为平台的个性化使用者,往往需要开发自己的调度器.Hadoop的调度器是在JobTracker中加载和调用的,因此开发一个自定义的调度器就必须搞清楚JobTracker类文件的内部机制.作为Hadoop平台的核心组件,JobTracker监控着整个集群的作业运行情况并对资源进行管理调度.每个Task-Tracker每隔3s通过heartbeat向JobTracker汇报自己管理的机器的一些基本信息,包括内存使用量、内存的剩余量以及空闲的slot数目等等[5].一旦JobTracker发现了空闲slot,便会调用调度器中的AssignTask方法为该TaskTracker分配task。
Ⅸ fifo算法怎么写
用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;
}
Ⅹ 请大佬帮忙讲解一下这个FIFO算法和LRU算法 跪求(T^T)
注意:
书上的表示方法不能很好的表示LRU的思想,所以我们都采用上图的画图方法
对于前三个是否算做缺页这个不同的教材有不同的说法,要具体看题目说明