实时调度算法
EDF实时调度算
一、基本思想:
在该实验中有两个周期性任务A、B,A的周期时间为20ms,每个周期的处理时间为10ms;任务B的周期时间为50ms,每个周期的处理时间为25ms。 在t=0是,A1和B1同时到达,由于A1的截止时间比B1早,故调度A1执行;在t=10时,A1完成,又调度B1执行;在t=20时,A2到达,由于A2的截止时间比B2早,B1被中断而调度A2执行;在t=30时,A2完成,又重新调度B1执行;在t=40时,A3到达,但B1的截止时间要比A3早,仍执行B1,在t=45时,B1执行完,再调度A3执行;在t=55时,A3完成,调度B2执行。该实验将最早截止时间优先算法用于抢占调度方式。在该实验中,定义了两个开关来判断两个任务是中断还是调度执行。
二、源程序代码:
#include
int main()
{
int A,B;
int tA,tB,serveA,serveB; //进程的周期时间和处理时间
float m;
int i,j,a=0,b=0,ka=0,kb=0; //ka,kb为开关,i,j,a,b为进程下标
int numa=0,numb=0; //处理累计时间
printf("输入进程A的周期时间和处理时间:");
scanf("%d%d",&tA,&serveA);
printf("输入进程B的周期时间和处理时间:");
scanf("%d%d",&tB,&serveB);
m=(float)serveA/tA+(float)serveB/tB;
for(int T=0;T
{
if(m-1>1e-6)
{
printf("超出CPU的处理能力!\n");
return 0;
}
if(numa==serveA) //进程A完成
{
numa=serveA+1;
printf("当T=%d时",T);
printf("进程A%d完成\n",a);
if(numb
{
printf(" 调度进程B%d\n",b);
kb=1;
}
ka=0;
}
if(numb==serveB)
{
numb=serveB+1;
printf("当T=%d时",T);
printf("进程B%d结束\n",b);
if(numa
{
printf(" 调度进程A%d\n",a);
ka=1;
}
kb=0;
}
if(T%tA==0 && T%tB==0)
{
A=B=T;
j=++a;
i=++b;
printf("当T=%d时,进程A%d和进程B%d同时到达,此时,",T,j,i); if(tA
{
printf("调度进程A%d,中断进程B%d\n",j,i);
ka=1;
kb=0;
}
else
{
printf("调度进程B%d,中断进程A%d\n",i,j);
ka=0;
kb=1;
}
numa=numb=0;
}
if(T%tA==0&&T%tB!=0)
{
A=T;
printf("当T=%d时",T);
printf("进程A%d到达 ",++a); //不可能与进程A竞争处理器 numa=0;
if(numb
if(B+tB>A+tA) //若进程B最早截止时间大于进程A的 {
printf("进程A%d执行。\n",a);
ka=1;
kb=0;
}
else //若进程B最早截止时间小于等于进程A的
printf("进程B%d继续执行。\n",b);
else //进程B完成
{
printf("进程A%d执行。\n",a);
ka=1;
}
}
if(T%tA!=0&&T%tB==0)
{
B=T;
printf("当T=%d时",T);
printf("进程B%d到达,",++b); //不可能与进程B竞争处理器
numb=0;
if(numa
if(B+tB>=A+tA) //进程A的最早截止时间不小于B printf("进程A%d继续执行。\n",a);
else
{
printf("进程B%d执行。\n",b);
kb=1;
ka=0;
}
else //进程A完成
{
printf("进程B%d执行。\n",b);
kb=1;
}
}
if(ka)
numa++;
if(kb)
numb++;
}
return 1;
}
三、实验结果截图: