⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 试做上机题4.cpp

📁 设有两个周期性的实时任务A和B
💻 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 + -