- 相關(guān)推薦
實(shí)時(shí)調(diào)度算法
EDF實(shí)時(shí)調(diào)度算
一、基本思想:
在該實(shí)驗(yàn)中有兩個(gè)周期性任務(wù)A、B,A的周期時(shí)間為20ms,每個(gè)周期的處理時(shí)間為10ms;任務(wù)B的周期時(shí)間為50ms,每個(gè)周期的處理時(shí)間為25ms。 在t=0是,A1和B1同時(shí)到達(dá),由于A1的截止時(shí)間比B1早,故調(diào)度A1執(zhí)行;在t=10時(shí),A1完成,又調(diào)度B1執(zhí)行;在t=20時(shí),A2到達(dá),由于A2的截止時(shí)間比B2早,B1被中斷而調(diào)度A2執(zhí)行;在t=30時(shí),A2完成,又重新調(diào)度B1執(zhí)行;在t=40時(shí),A3到達(dá),但B1的截止時(shí)間要比A3早,仍執(zhí)行B1,在t=45時(shí),B1執(zhí)行完,再調(diào)度A3執(zhí)行;在t=55時(shí),A3完成,調(diào)度B2執(zhí)行。該實(shí)驗(yàn)將最早截止時(shí)間優(yōu)先算法用于搶占調(diào)度方式。在該實(shí)驗(yàn)中,定義了兩個(gè)開(kāi)關(guān)來(lái)判斷兩個(gè)任務(wù)是中斷還是調(diào)度執(zhí)行。
二、源程序代碼:
#include
int main()
{
int A,B;
int tA,tB,serveA,serveB; //進(jìn)程的周期時(shí)間和處理時(shí)間
float m;
int i,j,a=0,b=0,ka=0,kb=0; //ka,kb為開(kāi)關(guān),i,j,a,b為進(jìn)程下標(biāo)
int numa=0,numb=0; //處理累計(jì)時(shí)間
printf("輸入進(jìn)程A的周期時(shí)間和處理時(shí)間:");
scanf("%d%d",&tA,&serveA);
printf("輸入進(jìn)程B的周期時(shí)間和處理時(shí)間:");
scanf("%d%d",&tB,&serveB);
m=(float)serveA/tA+(float)serveB/tB;
for(int T=0;T<=100;T++)
{
if(m-1>1e-6)
{
printf("超出CPU的處理能力!\n");
return 0;
}
if(numa==serveA) //進(jìn)程A完成
{
numa=serveA+1;
printf("當(dāng)T=%d時(shí)",T);
printf("進(jìn)程A%d完成\n",a);
if(numb
{
printf(" 調(diào)度進(jìn)程B%d\n",b);
kb=1;
}
ka=0;
}
if(numb==serveB)
{
numb=serveB+1;
printf("當(dāng)T=%d時(shí)",T);
printf("進(jìn)程B%d結(jié)束\n",b);
if(numa
{
printf(" 調(diào)度進(jìn)程A%d\n",a);
ka=1;
}
kb=0;
}
if(T%tA==0 && T%tB==0)
{
A=B=T;
j=++a;
i=++b;
printf("當(dāng)T=%d時(shí),進(jìn)程A%d和進(jìn)程B%d同時(shí)到達(dá),此時(shí),",T,j,i); if(tA<=tB)
{
printf("調(diào)度進(jìn)程A%d,中斷進(jìn)程B%d\n",j,i);
ka=1;
kb=0;
}
else
{
printf("調(diào)度進(jìn)程B%d,中斷進(jìn)程A%d\n",i,j);
ka=0;
kb=1;
}
numa=numb=0;
}
if(T%tA==0&&T%tB!=0)
{
A=T;
printf("當(dāng)T=%d時(shí)",T);
printf("進(jìn)程A%d到達(dá) ",++a); //不可能與進(jìn)程A競(jìng)爭(zhēng)處理器 numa=0;
if(numb
if(B+tB>A+tA) //若進(jìn)程B最早截止時(shí)間大于進(jìn)程A的 {
printf("進(jìn)程A%d執(zhí)行。\n",a);
ka=1;
kb=0;
}
else //若進(jìn)程B最早截止時(shí)間小于等于進(jìn)程A的
printf("進(jìn)程B%d繼續(xù)執(zhí)行。\n",b);
else //進(jìn)程B完成
{
printf("進(jìn)程A%d執(zhí)行。\n",a);
ka=1;
}
}
if(T%tA!=0&&T%tB==0)
{
B=T;
printf("當(dāng)T=%d時(shí)",T);
printf("進(jìn)程B%d到達(dá),",++b); //不可能與進(jìn)程B競(jìng)爭(zhēng)處理器
numb=0;
if(numa
if(B+tB>=A+tA) //進(jìn)程A的最早截止時(shí)間不小于B printf("進(jìn)程A%d繼續(xù)執(zhí)行。\n",a);
else
{
printf("進(jìn)程B%d執(zhí)行。\n",b);
kb=1;
ka=0;
}
else //進(jìn)程A完成
{
printf("進(jìn)程B%d執(zhí)行。\n",b);
kb=1; 實(shí)時(shí)調(diào)度算法 }
}
if(ka)
numa++;
if(kb)
numb++;
}
return 1;
}
三、實(shí)驗(yàn)結(jié)果截圖:
【實(shí)時(shí)調(diào)度算法】相關(guān)文章:
動(dòng)態(tài)車間調(diào)度算法04-27
基于UKF的測(cè)速定軌實(shí)時(shí)算法04-30
基于A*算法的實(shí)時(shí)航跡規(guī)劃方法研究05-01
多軸液壓聯(lián)動(dòng)實(shí)時(shí)插補(bǔ)控制算法04-28
靶場(chǎng)彈道跟蹤實(shí)時(shí)數(shù)據(jù)平滑算法及實(shí)現(xiàn)05-02
雙通道角跟蹤體制實(shí)時(shí)校相算法研究05-02