📄 试做上机题4.cpp
字号:
/*设有两个周期性的实时任务A和B,任务A要求每20ms执行一次,执行时间为10ms;
任务B要求每50ms执行一次,执行时间为25ms;试编一调度程序按最小松弛度优先算法
(Least Laxity First)对这两个任务进行调度并输出每次调度时被调入运行任务的
状态:(任务名,所处周期数,调度时刻,运行持续时间)。
注:程序中设置一closetime控制调度程序的终止。*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define closetime 200
#define PERIOD1 20
#define PERIOD2 50
#define CPUTIME1 10
#define CPUTIME2 25
typedef struct TCB {
int period; /*周期*/
int cputime;/*需要的cpu时间*/
int remain; /*剩余的cpu时间*/
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("非法周期!");exit(0);
}
for(i=0;i<2;++i){
tcb[i].pnum=1;/*初始周期号*/
tcb[i].remain=tcb[i].cputime;/*初始剩余时间*/
tcb[i].laxity=tcb[i].period-tcb[i].remain;/*初始松弛度*/
}
}
void schedule(void)/*调度程序*/
{ int i,j;/*i是被调度运行任务,j是未运行任务*/
int duration;/*本次运行持续时间*/
i=tcb[0].laxity<=tcb[1].laxity?0:1;/*选最小松弛度的任务*/
if(curtime<tcb[i].period*(tcb[i].pnum-1))/*尚未进入该周期*/
i=(i+1)%2;/*选另一个任务*/
j=(i+1)%2;
if(tcb[i].remain<=tcb[j].laxity)
duration=tcb[i].remain; /*让它运行到结束*/
else
duration=tcb[j].laxity;/*只能运行另一任务的松弛度的时间*/
tcb[i].remain-=duration;/*修改剩余时间*/
printf(" 任务号=%-3d周期序号=%-3d调度时刻=%-6d运行时间长度=%-3d\n",
i,tcb[i].pnum,curtime,duration);
curtime+=duration;/*时间推进到下一调度时刻*/
if(tcb[i].remain==0){/*本周期的任务已完成*/
tcb[i].pnum++;/*向前推进一个周期*/
tcb[i].remain=tcb[i].cputime;/*设置初始剩余时间*/
}
for(i=0;i<2;++i)/*重新计算松弛度*/
tcb[i].laxity=tcb[i].pnum*tcb[i].period-curtime-tcb[i].remain;
}
void main(void)
{ init();
while(curtime<closetime)
schedule();
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -