任务调度实验.docx
- 文档编号:7435834
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:17
- 大小:185.01KB
任务调度实验.docx
《任务调度实验.docx》由会员分享,可在线阅读,更多相关《任务调度实验.docx(17页珍藏版)》请在冰豆网上搜索。
任务调度实验
大作业三任务调度
:
学号:
班级:
日期:
2015年7月
1需求说明
本次实验的目标是在Linux环境下实现任务调度仿真,利用多线程实现任务池中的多个任务,支持先来先服务、轮转和反馈三种调度策略,提高对Linux环境下多进程、多线程和单处理器调度等知识的理解。
2设计说明
设有任务A、B、C、D、E,分别具有不同的优先级和处理时间,通过一个调度线程对这5个任务进行调度。
2.1结构设计
将先来先服务与优先级队列用结构体数组进行设计,对到达时间、
运行时间结束时间进行相关的调度与修改
将时间片轮转用循环队列来表示,使五种不同任务不断的论寻,直至运行结束。
2.2功能设计
●正确输出三种调度算法下,任务的执行顺序、每个任务占用CPU的时间以及优先级队列(反馈调度)
●通过一个调度进程实现任务调度
●有输出界面,在每个时间点输出任务状态、每个任务已经占用CPU时间和还需CPU时间,已经执行的任务顺序和时间。
3测试和使用说明
3.1使用说明
无
3.2测试说明
4程序清单
[cpp]viewplaincopy
OBJS=main.ofcfs_sjf.ocl.o
a.out:
$(OBJS)mon.h
gcc$(OBJS)-oa.out
main.o:
main.cmon.h
gcc-cmain.c
fcfs_sjf.o:
fcfs_sjf.cmon.h
gcc-cfcfs_sjf.c
cl.o:
cl.cmon.h
gcc-ccl.c
mon.h
#include
#include"stdio.h"
#include"string.h"
#defineNULL0
/*定义结构*/
typedefstructquen
{
charpname[8];
inttime1;
inttime2;
charstate;
structquen*next;
}QUEN;
floatt,d;
struct{
intid;
floatArriveTime;
floatRequestTime;
floatStartTime;
floatEndTime;
floatRunTime;
floatDQRunTime;
intstatus;
}arrayTask[4];
voidGetTask();
ntfcfs();
intsjf();
voidnew_n(ints);
voidPrintresult(intj);
voidcl();
fcfs_sjf.c
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;
}
}
/*定义FCFS中寻找未执行的进程的最先到达时间*/
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].ArriveTime { t=arrayTask[i].ArriveTime; } } for(i=0;i<=4;i++)/*返回最小到达时间的数组的下标*/ { if(arrayTask[i].ArriveTime==t) { returni; } } } //最短作业优先算法SJF intsjf()/*定义FCFS中寻找未执行的进程的最先到达时间*/ { 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].ArriveTime { t=arrayTask[i].ArriveTime; a=i; } } returna; } else { for(i=0;i<=4;i++) { if(arrayTask[i].EndTime>g) { 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)/*有进程到达则按SJF*/ { for(i=0;i<=4;i++) { if(arrayTask[i].status==0&&arrayTask[i].ArriveTime<=g&&arrayTask[i].RequestTime { t=arrayTask[i].RequestTime; a=i; } } returna; } else { /*否则按FCFS*/ 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].ArriveTime { t=arrayTask[i].ArriveTime; a=i; } } returna; } } } voidnew_n(ints)/*定义执行进程后相关数据的修改*/ { inti,g=0; for(i=0;i<=4;i++) { 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].EndTime>d&&arrayTask[i].status==1) d=arrayTask[i].EndTime; } if(arrayTask[s].ArriveTime { arrayTask[s].StartTime=d; } 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); } cl.c voidcl() { QUEN*q,*p,*head,*m; charstr[8],f; intt,d,n; printf("Enterthemaxnumberofnodes(n): \n");/*输入进程数*/ scanf("%d",&n); d=n; if(d>0) { 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(d>0) { /*构建队列表*/ 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->time2 { head->time2++; if(head->time2==head->time1) { head->state='E'; 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(sizeof(QUEN)); strcpy(m->pname,str); m->time1=t; m->time2=0; m->state='R'; m->next=NULL; if(q->next->state=='E') { p=m; head=m; p->next=head; q=head; } else { p->next=m; m->next=head; p=m; } } } }while(q->next->state! ='E'); printf("Theprocessesarefinished\n"); } main.c intmain(void) { inti,b,k,c=0; chara; intd[4]; //clrscr(); //cls(); printf("\t1.FCFS\n"); printf("\t2.SFJ\n"); printf("\t3.EXIT\n"); printf("\t4.cl\n"); for(i=0;;i++) { if(c) { break; } printf("pleaseinputthenumbera: \n"); scanf("%d",&a); switch(a) { case3: c=1; break; case1: printf("pleaseinputthedifferent-ArriveTimeofarrayTasks\n"); GetTask(); printf("*******************************theresultoffcfs\n"); printf("Number\tArrive\tServer\tStart\tFinish\tTurnove\tTakepowerturnovertime\n"); for(b=0;b<=4;b++) { k=fcfs(); d[b]=k; new_n(k); } for(b=0;b<=4;b++) { Printresult(d[b]);/*调用打印函数打出结果*/ } continue; case2: printf("pleaseinputthedifferent-RequestTimeofarrayTasks\n"); GetTask(); printf("******************************theresultofsjf\n"); printf("Number\tArrive\tRequest\tStart\tEnd\tRun\tDQRuntime\n"); for(b=0;b<=4;b++) { k=sjf(); d[b]=k; new_n(k); } for(b=0;b<4;b++) { Printresult(d[b]);/*调用打印函数打出结果*/ } continue; case4: cl(); continue; default: printf("thenumberError.pleaseinputanothernumber! \n"); } } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 任务 调度 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)