多级反馈队列调度算法 多级反馈队列调度算法是一种CPU处理机调度算法,UNIX *** 作系统采取的便是这种调度算法。 多级反馈队列调度算法即能使高优先级的作业得到响应又能使短作业(进程)迅速完成。(对比一下FCFS与高优先响应比调度算法的缺陷)。 多级(假设为N级)反馈队列调度算法可以如下原理: 1、设有N个队列(Q1,Q2QN),其中各个队列对于处理机的优先级是不一样的,也就是说位于各个队列中的作业(进程)的优先级也是不一样的。一般来说,优先级Priority(Q1) > Priority(Q2) > > Priority(QN)。怎么讲,位于Q1中的任何一个作业(进程)都要比Q2中的任何一个作业(进程)相对于CPU的优先级要高(也就是说,Q1中的作业一定要比Q2中的作业先被处理机调度),依次类推其它的队列。 2、对于某个特定的队列来说,里面是遵循时间片轮转法。也就是说,位于队列Q2中有N个作业,它们的运行时间是通过Q2这个队列所设定的时间片来确定的(为了便于理解,我们也可以认为特定队列中的作业的优先级是按照FCFS来调度的)。 3、各个队列的时间片是一样的吗?不一样,这就是该算法设计的精妙之处。各个队列的时间片是随着优先级的增加而减少的,也就是说,优先级越高的队列中它的时间片就越短。同时,为了便于那些超大作业的完成,最后一个队列QN(优先级最高的队列)的时间片一般很大(不需要考虑这个问题)。 多级反馈队列调度算法描述: 1、进程在进入待调度的队列等待时,首先进入优先级最高的Q1等待。 2、首先调度优先级高的队列中的进程。若高优先级中队列中已没有调度的进程,则调度次优先级队列中的进程。例如:Q1,Q2,Q3三个队列,只有在Q1中没有进程等待时才去调度Q2,同理,只有Q1,Q2都为空时才会去调度Q3。 3、对于同一个队列中的各个进程,按照时间片轮转法调度。比如Q1队列的时间片为N,那么Q1中的作业在经历了N个时间片后若还没有完成,则进入Q2队列等待,若Q2的时间片用完后作业还不能完成,一直进入下一级队列,直至完成。 4、在低优先级的队列中的进程在运行时,又有新到达的作业,那么在运行完这个时间片后,CPU马上分配给新到达的作业(抢占式)。 我们来看一下该算法是如何运作的: 假设系统中有3个反馈队列Q1,Q2,Q3,时间片分别为2,4,8。 现在有3个作业J1,J2,J3分别在时间 0 ,1,3时刻到达。而它们所需要的CPU时间分别是3,2,1个时间片。 1、时刻0 J1到达。于是进入到队列1 , 运行1个时间片 , 时间片还未到,此时J2到达。 2、时刻1 J2到达。 由于时间片仍然由J1掌控,于是等待。 J1在运行了1个时间片后,已经完成了在Q1中的 2个时间片的限制,于是J1置于Q2等待被调度。现在处理机分配给J2。 3、时刻2 J1进入Q2等待调度,J2获得CPU开始运行。 4、时刻3 J3到达,由于J2的时间片未到,故J3在Q1等待调度,J1也在Q2等待调度。 5、时刻4 J2处理完成,由于J3,J1都在等待调度,但是J3所在的队列比J1所在的队列的优先级要高,于是J3被调度,J1继续在Q2等待。 6、时刻5 J3经过1个时间片,完成。 7、时刻6 由于Q1已经空闲,于是开始调度Q2中的作业,则J1得到处理器开始运行。 8、时刻7 J1再经过一个时间片,完成了任务。于是整个调度过程结束。
/建立一座两层楼,一部电梯的模拟程序。为简化起见,每部电梯限乘一人,电梯每天在一楼关门等待
模拟程序包括一个时钟,每天从零开始。模拟程序得调度器组件随机设置每一层第一个人到来的时间,当时钟的时间等于第一个人到来的时间时,模拟程序生成一个新到的人将该人放到这一层。然后这个人按下按钮,请求电梯开门。这个人的目的地楼层不能与他上电梯的楼层相同。
如果第一个人到达第一层,则可以在按下按钮、等待电梯开门之后立即进入电梯。如果第一个人在第2层,则电梯要升到第2层去接他。电梯从1层移到2层需要5秒。
电梯到达一层时,打开电梯门上的灯,并在电梯内发出铃声,该层的按钮和电梯中表示该层的按钮复位,电梯门打开,乘客走出电梯(如果有到该层的乘客)。另一乘客(如果该层有人等待)进入电梯按下目的层按钮,电梯们关上。电梯移动前确定移动方向(两层很容易判断),为简单起见,电梯到达一层直到关门所花时间为0。
任何时间每层最多只能有一人等待,如果新到的人(不在电梯中)要到达该层时该层被占用,则一秒后才能安排新到达者。假设每隔5到20秒人们随机到达每层/
#include < iostream >
#include < ctime >
#include < iomanip >
#include < string >
#include <stdlibh>
#include < windowsh >
using namespace std;
class person
{
public:
string sex; //定义人员类
person();
void newset();
};
person::person()
{ sex="man"; }
void person::newset()
{
int i;
srand((unsigned)time(NULL));
for(i=0;;i++)
{
if(rand()==1)
{sex="man"; break; }
if(rand()==2)
{sex="woman"; break; }
}
}
class elevator
{
public:
int now; //定义电梯类
elevator();
};
elevator::elevator()
{ now=1; }
class Time
{
public:
static void outtime() //定义时间类,用于输出电梯每次运行时的时间
{
SYSTEMTIME t;
GetLocalTime(& t);
cout<<" //"<<twYear<<""<<twMonth<<""<<twDay<<" "<<twHour<<":"<<twMinute<<":"<<twSecond<<endl;
}
};
void last(long n) //用于等待时输出的函数
{
long i;
i=n/500;
for(i=0;i<n/500;i++)
{
cout<<''; Sleep(500);
}
cout<<endl;
}
void waiting()
{ long m; //模拟随机等待的时间函数
srand((unsigned)time(NULL));
cout<<"elevator waiting";
for(int i=0;i<1000;i++)
m=rand()%(20000-5000+1)+5000;
last(m);
}
void output(long t,person & p,elevator & e) //电梯模拟函数
{
static n=1; //定义乘客的个数
if( t==1) //有人在一楼按铃
{
pnewset();
if(enow!=1) //但是此时电梯停留在二楼
{
cout<<"person "<<n<<"(a "<<setw(5)<<psex<<") arrived floor 1"; //输出有人到达一楼
Time::outtime(); //输出此时的准确时间
cout<<"elevator running";
last(5000);
cout<<"person "<<n<<"(a "<<setw(5)<<psex<<") enters elevator"; //输出乘客进入电梯
Time::outtime(); //输出此时的准确时间
cout<<"elevator running";
last(5000);
cout<<"person "<<n<<"(a "<<setw(5)<<psex<<") arrives floor 2"; //输入乘客到达二楼
Time::outtime(); //输出此时的准确时间
enow=2;
n++;
system("color 0C"); waiting(); system("color 0F");
}
else //此时电梯就是一楼
{
cout<<"person "<<n<<"(a "<<setw(5)<<psex<<") arrives floor 1"; //输出有人到达一楼
Time::outtime(); //输出此时的准确时间
cout<<"person "<<n<<"(a "<<setw(5)<<psex<<") enters elevator"<<endl;
cout<<"elevator running";
last(5000);
cout<<"person "<<n<<"(a "<<setw(5)<<psex<<") arrives floor 2";
Time::outtime();
enow=2;
n++;
system("color 0C"); waiting(); system("color 0F");
}
}
if(t==2) //有人在二楼按铃
{
if(enow!=2) //但是电梯此时不在二楼
{
cout<<"person "<<n<<"(a "<<setw(5)<<psex<<") arrived floor 2";
Time::outtime();
cout<<"elevator running";
last(5000);
cout<<"person "<<n<<"(a "<<setw(5)<<psex<<") enters elevator";
Time::outtime();
cout<<"elevator running";
last(5000);
cout<<"person "<<n<<"(a "<<setw(5)<<psex<<") arrives floor 1";
Time::outtime();
enow=1;
n++;
system("color 0C"); waiting(); system("color 0F");
}
else //此时电梯就是二楼
{
cout<<"person "<<n<<"(a "<<setw(5)<<psex<<") arrives floor 2";
Time::outtime();
cout<<"person "<<n<<"(a "<<setw(5)<<psex<<") enters elevator";
Time::outtime();
cout<<"elevator running";
last(5000);
cout<<"person "<<n<<"(a "<<setw(5)<<psex<<") arrives floor 1";
Time::outtime();
enow=1;
n++;
system("color 0C"); waiting(); system("color 0F");
}
}
}
int main()
{
coutfill('');
cout<<setw(80)<<'';
coutfill(' ');
system("color 0C");
cout<<setw(50)<<"欢迎使用电梯模拟程序"<<endl; //输出头菜单
coutfill('');
cout<<setw(80)<<'';
coutfill(' ');
int i;
person p;
elevator e;
srand((unsigned)time(NULL)); //定义随机数种
waiting();
system("color 0F");
for(i=0;;i++)
output(rand(),p,e); //调用电梯模拟函数
return 0;
}
三层楼电梯自动控制设计指导书一、 PLC毕业设计的基本知识1、 一般原则:1) 逻辑设计正确,说明详细,内容全面2) 梯形图语言、助记符语言符号正确,结构间捷2、基本内容:1) 详细说明课题中的逻辑动作关系2) I/O的分配表3) 梯形图语言、助记符语言4) 外部接线图3、目的和要求:通过PLC课程设计进一步巩固理论知识,初步掌握PLC的运用、程序设计方法、 及外部的线路联接二、 设计题目:三层楼电梯自动控制三、动作要求:1、 图24-8是三层楼电梯示意图,电梯上、下由一台电机控制:正转(上升)、反转(下降)。1)每层设有呼叫开关SBl一SB3;呼叫指示灯H1一H3和到位行程开关STl一ST3。2)若令电梯上升途中只响应上升呼叫,下降途中只响应下降呼叫,任何反方向呼叫均无效(以下简称“不可逆响应”),则其动作要求如表2.4-1所示。3)因实际电梯的呼叫开关为按钮式开关,所以SBl一SB3开关要求瞬间接通有效。4)各楼层问有效运行时间应小于10s,否则认为有故障,自动令电机停转。注:第11、12项在运行中,后发出的反方向呼叫无效。2、附加动作要求:1)到达每层楼后,电梯应有开、关门动作*2)将不可逆响应控制程序修改为可逆响应控制程序,其动作要求为:将表2.4-1 中的11、12两项改为表2.4-2所示内容,其余不变。表2.4-2四 设计要求:1)详细说明书一份2)I/O的分配表3)梯形图语言、助记符语言4)外部接线图
以上就是关于 *** 作系统模拟电梯调度算法C语言程序全部的内容,包括: *** 作系统模拟电梯调度算法C语言程序、求一个电梯的调度管理程序,c++的、三层电梯PLC梯形图是怎么样的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)