1. 最早截止时间优先EDF(Earliest DeadlineFirst)算法是非常著名的实时调度算法之一。在每一个新的就绪状态,调度器都是从那些已就绪但还没有完全处理完毕的任务中选择最早截止时间的任务,并将执行该任务所需的资源分配给它。在有新任务到来时,调度器必须立即计算EDF,排出新的定序,即正在运行的任务被剥夺,并且按照新任务的截止时间决定是否调度该新任务。如果新任务的最后期限早于被中断的当前任务,就立即处理新任务。按照EDF算法,被中断任务的处理将在稍后继续进行。
2. 该算法的思想是从两个任务中选择截至时间最早的任务,把它暂作为当前处理任务,再判断该任务是否在当前周期内,若不在当前周期内,就让另一任务暂作当前处理任务,若该任务也不在当前周期内,就让CPU空跑到最靠近的下一个截至时间的开始,若有任务在该周期内,就判断该任务的剩余时间是否小于当前截至时间与当前时间的差,若小于,则让该任务运行到结束.否则,就让该任务运行到该周期的截止时间,就立即抢回处理器,再判断紧接着的最早截至时间,并把处理器给它,做法同上,如此反复执行.
3.最早截止时间优先即EDF算法的程序如下: #include
#define closetime 200
#define PERIOD1 10 /*任务1的周期*/
#define PERIOD2 40 /*任务2的周期*/
#define CPUTIME1 5 /*任务1需要的CPU时间*/
#define CPUTIME2 20 /*任务2需要的CPU时间*/
typedef struct TCB { int period;
int cputime;
int remain;
int pnum;
int laxity;
} TCB;
TCB tcb[2];
int curtime;
void init(void)
{
int i;float f;
curtime=0;
tcb[0].period=PERIOD1;tcb[0].cputime=CPUTIME1;
tcb[1].period=PERIOD2;tcb[1].cputime=CPUTIME2;
f=(float)tcb[0].cputime/tcb[0].period+(float)tcb[1].cputime/tcb[1].period;
if(f>1)
{
printf("非法周期!");return;
}
for(i=0;i<2;++i){ tcb[i].pnum=1;
tcb[i].remain=tcb[i].cputime;
}
}
void schedule(void)
{
int i,p;
int duration;
i=tcb[0].period*tcb[0].pnum<=tcb[1].period*tcb[1].pnum?0:1;
if(curtime1))
{
p=tcb[i].period*(tcb[i].pnum-1);
i=(i+1)%2;
if(curtime1))
curtime=p;
else if(tcb[i].remain<=p-curtime)
duration=tcb[i].remain;
else
duration=p-curtime;
tcb[i].remain-=duration;
printf("任务号=%-3d周期序号=%-3d调度时刻=%-6d运行时间长度=%-3d
",i,tcb[i].pnum,curtime,duration);
curtime+=duration;
if(tcb[i].remain==0)
{
tcb[i].pnum++;
tcb[i].remain=tcb[i].cputime;
}
}
else
{
p=tcb[i].period*tcb[i].pnum;
if(tcb[i].remain<=p-curtime)
duration=tcb[i].remain;
else
duration=p-curtime;
tcb[i].remain-=duration;
printf("任务号=%-3d周期序号=%-3d调度时刻=%-6d运行时间长度=%-3d
",i,tcb[i].pnum,curtime,duration);
curtime+=duration;
if(tcb[i].remain==0)
{
tcb[i].pnum++;
tcb[i].remain=tcb[i].cputime;
}
}
}
void main(void)
{
init();
while(curtime