单处理器任务调度1需求说明1.1基本需求目标:本次实验的目标是在Linux环境下实现任务调度仿真,利用多线程实现任务池中的多个任务,支持先来先服务、轮转和反馈三种调度策略,提高对Linux环境下多进程、多线程和单处理器调度等知识的理解。问题描述:设有任务A、B、C、D、E,分别具有不同的优先级和处理时间,通过一个调度线程对这5个任务进行调度。功能需求:正确输出三种调度算法下,任务的执行顺序、每个任务占用CPU的时间以及优先级队列(反馈调度)通过一个调度进程实现任务调度有输出界面,在每个时间点输出任务状态、每个任务已经占用CPU时间(TIMECOUNTER)和还需CPU时间,已经执行的任务顺序(order2)和时间(time)。非功能需求:程序应有较好的容错性(即能对用户输入的命令进行判断,并对错误的命令进行错误处理)过程需求:使用vi进行代码的编写使用make工具建立工程将实现不同类别功能的函数写到不同的.c文件中,并使用makefile链接编译。#includestdio.h#includestring.h#includestdlib.htypedefstructquen{charpname[8];inttime1;inttime2;charstate;structquen*next;}QUEN;floatt,d;struct{intid;floatArriveTime;//到达时间floatServiceTime;//该进程需要的服务时间floatStartTime;//进程真正开始运行时间floatEndTime;//进程真正结束时间floatRunTime;//运行的时间floatDQRunTime;//相对执行时间实际运行/请求的服务时间intstatus;//进程状态,是否被运行过}arrayTask[4];voidGetTask();intfcfs();intsjf();voidnew_n(ints);voidPrintresult(intj);voidcl();voidGetTask(){inti;floata;for(i=0;i=4;i++){arrayTask[i].id=i+1;printf(inputthenumber);printf(inputtheArriveTimeofarrayTask[%d]:,i);scanf(%f,&a);arrayTask[i].ArriveTime=a;printf(inputtheRequestTimeofarrayTask[%d]:,i);scanf(%f,&a);arrayTask[i].RequestTime=a;arrayTask[i].StartTime=0;arrayTask[i].EndTime=0;arrayTask[i].RunTime=0;arrayTask[i].status=0;}}intfcfs(){inti,j,w;for(i=0;i=4;i++){if(arrayTask[i].status==0){t=arrayTask[i].ArriveTime;w=1;}if(w==1){break;}}for(i=0;i=4;i++){if(arrayTask[i].ArriveTimet&&arrayTask[i].status==0){t=arrayTask[i].ArriveTime;}}for(i=0;i=4;i++){if(arrayTask[i].ArriveTime==t){returni;}}//选择排序,先找到第一个没有执行的任务,然后再对所有任务遍历,找到到达时间最小的任务,返回该任务,执行之}//函数目的:用先来先服务策略,找到当前需要执行的任务intsjf(){inti,x=0,a=0,b=0;floatg;for(i=0;i=4;i++){if(arrayTask[i].status==1){g=arrayTask[i].EndTime;x=1;}}if(x==0){t=arrayTask[0].ArriveTime;for(i=0;i=4;i++){if(arrayTask[i].ArriveTimet){t=arrayTask[i].ArriveTime;a=i;}}returna;}else{for(i=0;i=4;i++){if(arrayTask[i].EndTimeg){g=arrayTask[i].EndTime;}}for(i=0;i=4;i++){if(arrayTask[i].status==0&&arrayTask[i].ArriveTime=g){t=arrayTask[i].RequestTime;a=i;b=1;}}if(b!=0){for(i=0;i=4;i++){if(arrayTask[i].status==0&&arrayTask[i].ArriveTime=g&&arrayTask[i].RequestTimet){t=arrayTask[i].RequestTime;a=i;}}returna;}else{for(i=0;i=4;i++){if(arrayTask[i].status==0){t=arrayTask[i].ArriveTime;}}for(i=0;i=4;i++){if(arrayTask[i].status==0&&arrayTask[i].ArriveTimet){t=arrayTask[i].ArriveTime;a=i;}}returna;}}}voidnew_n(ints){inti,g=0;for(i=0;i=4;i++){//查找是否有进程未执行,如果没有,令g=0,如果有,令g=1;if(arrayTask[i].status==0)continue;else{g=1;break;}}if(g==0){//当前进程为最后一个进程arrayTask[s].StartTime=arrayTask[s].ArriveTime;arrayTask[s].EndTime=arrayTask[s].RequestTime+arrayTask[s].ArriveTime;arrayTask[s].RunTime=arrayTask[s].RequestTime;arrayTask[s].status=1;g=2;}if(g==1){arrayTask[s].status=1;//将该进程执行for(i=0;i=4;i++){if(arrayTask[i].status==1)d=arrayTask[i].EndTime;//找到一个进程的结束时间}for(i=0;i=4;i++){if(arrayTask[i].EndTimed&&arrayTask[i].status==1)d=arrayTask[i].EndTime;//找到这几个进程的最晚结束时间}if(arrayTask[s].ArriveTimed){arrayTask[s].StartTime=d;//s的到达在前一个进程结束之前,由于非抢占,故要等待s完成}else{//处理器有空闲时间,即上一个进程完成,下一个进程还没请求arrayTask[s].StartTime=arrayTask[s].ArriveTime;arrayTask[s].EndTime=arrayTask[s].StartTime+arrayTask[s].RequestTime;arrayTask[s].RunTime=arrayTask[s].EndTime-arrayTask[s].ArriveTime;}arrayTask[s].DQRunTime=arrayTask[s].RunTime/arrayTask[s].RequestTime;}}voidPrintresult(intj){printf(%d\t,arrayTask[j].id);printf(%5.2f\t,arrayTask[j].ArriveTime);printf(%5.2f\t,arrayTask[j].RequestTime);printf(%5.2f\t,arrayTask[j].StartTime);printf(%5.2f\t,arrayTask[j].EndTime);printf(%5.2f\t,arrayTask[j].RunTime);printf(%5.2f\n,arrayTask[j].DQRunTime);}voidcl(){QUEN*q,*p,*head,*m;charstr[8],f;intt,d,n;printf(Enterthemaxnumberofnodes(n):\n);scanf(%d,&n);d=n;if(d0){printf(enterthepname:);scanf(%s,str);printf(entertheneedtime:);scanf(%d,&t);head=p=(QUEN*)malloc(sizeof(QUEN));strcpy(p-pname,str);p-time1=t;p-time2=0;p-state='R';p-next=NULL;head=p;getchar();--d;}//建立头结点,并初始化while(d0){printf(enterthepname:);scanf(%s,str);printf(enterneedtime:);scanf(%d,&t);q=(QUEN*)malloc(sizeof(QUEN));strcpy(q-pname,str);q-time1=t;q-time2=0;q-state='R';q-next=NULL;p-next=q;p=q;--d;p-next=head;q=head;}//头插法建立链表printf(processnameneedtimerunnedstatic\n);do{printf(%s%d%d%c\n,q-pname,q-time1,q-time2,q-state);q=q-next;}while(q!=head);printf(\n);do{if(head-time2head-time1){head-time2++;//基于时间片,一次++操作,就是一次的时间片if(head-time2==head-time1){head-state='END';q=head;printf(Therunningprocessis%s\n,q-pname);printf(processnamelefttimerunnedstatic\n);do{printf(%s%d%d%c\n,q-pname,q-time1,q-time2,q-state);q=q-next;}while(q!=head);printf(\n);head=head-next;q=head;p-next=head;}else{printf(Therunningprocessis%s\n,q-pname);printf(processnamelefttimerunnedstatic\n);do{printf(%s%d%d%c\n,q-pname,q-time1,q-time2,q-state);q=q-next;}while(q!=head);printf(\n);head=head-next;q=head;p=p-next;}printf(Isitneedingnewprocess?(yorn)\n);getchar();scanf(%c,&f);if(f=='Y'||f=='y'){getchar();printf(Enterthenewpname:);scanf(%s,str);printf(Enterthenewneededtime:);scanf(%d,&t);m=(QUEN*)malloc(si