实时调度最早截止时间优先算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实时调度最早截止时间优先算法
一、设计思路
最早截止时间算法是根据任务的开始截止时间来确定任务的优先级,截止时间愈早,其优先级愈高,我以书上的抢占式调度方式用于周期实时任务的例子来编写程序,在该例中有两个周期性任务,我设计的可以输入这两个的周期时间和服务时间,然后比较它们的截止时间,哪个截止时间早就谁先执行,在单处理机情况下,必须满足∑Ci/Pi<=1,我用的是C语言编写的,只用到了一些简单的if语句for循环语句。
二、运行结果和功能
1.输入进程A的周期时间和服务时间、B的周期时间和服务时间
2.回车后执行实时调度最早截止时间优先算法,可得到下列结果
三、源程序代码
#include
int main()
{
int A,B; //标记进程A,进程B的到达时间
int cycA,cycB,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",&cycA,&serveA);
printf("输入进程B的周期时间,服务时间:");
scanf("%d%d",&cycB,&serveB);
m=(float)serveA/cycA+(float)serveB/cycB;
for(int T=0;T<=100;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%cycA==0 && T%cycB==0) { A=B=T; j=++a; i=++b; printf("当T=%d时,进程A%d和进程B%d同时产生,此时,",T,j,i); if(cycA<=cycB) { 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%cycA==0&&T%cycB!=0) { A=T; printf("当T=%d时",T); printf("进程A%d产生",++a); //不可能与进程A竞争处理器 numa=0; if(numb if(B+cycB>A+cycA) //若进程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%cycA!=0&&T%cycB==0) { B=T; printf("当T=%d时",T); printf("进程B%d产生,",++b); //不可能与进程B竞争处理器numb=0; if(numa if(B+cycB>=A+cycA) //进程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; }