![](https://video.ask-data.xyz/img.php?b=https://iknow-pic.cdn.bcebos.com/83025aafa40f4bfbc0130724084f78f0f63618fa?x-bce-process=image%2Fresize%2Cm_lfit%2Cw_600%2Ch_800%2Climit_1%2Fquality%2Cq_85%2Fformat%2Cf_auto)
//参考一下
#include <stdio.h>
#include <stdlib.h>
#define CPU_TIME 50 //CPU时间片
struct mission //单个任务的结构体
{
char name[20]; //任务名称
int finished; //任务是否已完成,完成为1,未完成为0
int need_time; //任务总共需要的CPU时间
int finished_time;//任务已经执行的CPU时间
};
int work_mission=5; //未完成任务计数
struct mission s[5]={{"one",0,100,0}, //假设有5个任务
{"two",0,380,0},
{"three",0,200,0},
{"four",0,440,0},
{"five",0,230,0}
};
int move_mission(int flag) //任务排序
{
if(work_mission==0)
{
return 1;
}
struct mission temp;
temp=s[0];
int i;
if(flag==1)
{
for(i=1;i<work_mission+1;i++)
{
s[i-1]=s[i];
}
s[work_mission]=temp;
}
else
{
for(i=1;i<work_mission;i++)
{
s[i-1]=s[i];
}
s[work_mission-1]=temp;
}
return 0;
}
int main(int argc, char *argv[]) {
struct mission temp;
int finished=0;
int cpu_time_count=0;
while(finished==0)
{
printf("\n第%d个CPU时间片即将执行\n",cpu_time_count/CPU_TIME+1);
printf("\n当前任务队列(即将执行下面第一行任务,执行后将任务移到队列末尾): CPU已用时:%d\n",cpu_time_count);
int i;
for(i=0;i<5;i++)
{
printf("任务名称:%5s 是否已完成:%d 需时间:%03d 已执行时间:%03d 已完成:%03.2f%%\n",s[i].name,s[i].finished,s[i].need_time,s[i].finished_time,100*((float)s[i].finished_time/(float)s[i].need_time));
}
if(s[0].finished==1)
{
finished=1;
break;
}
if((s[0].need_time-s[0].finished_time)>CPU_TIME)
{
s[0].finished_time+=CPU_TIME;
cpu_time_count+=CPU_TIME;
finished=move_mission(0);
}
else
{
cpu_time_count+=(s[0].need_time-s[0].finished_time);
s[0].finished_time=s[0].need_time;
s[0].finished=1;
work_mission-=1;
finished=move_mission(1);
}
}
printf("\n当前任务队列(全部执行完毕): CPU用时:%d\n",cpu_time_count);
int i;
for(i=0;i<5;i++)
{
printf("任务名称:%5s 是否已完成:%d 需时间:%03d 已执行时间:%03d 已完成:%03.2f%%\n",s[i].name,s[i].finished,s[i].need_time,s[i].finished_time,100*((float)s[i].finished_time/(float)s[i].need_time));
}
printf("\n\n总共用了CPU时间: %d",cpu_time_count);
return 0;
}