短作业优先调度和时间片轮转调度算法.docx
- 文档编号:6364088
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:11
- 大小:16.38KB
短作业优先调度和时间片轮转调度算法.docx
《短作业优先调度和时间片轮转调度算法.docx》由会员分享,可在线阅读,更多相关《短作业优先调度和时间片轮转调度算法.docx(11页珍藏版)》请在冰豆网上搜索。
短作业优先调度和时间片轮转调度算法
装有VC++6.0的PC机一台
七、实验步骤:
1.打开VC,设计编写程序的源代码
2.编译运行程序的源代码
3.分析检验程序的结果是否正确
4.总结实验结果及结论
短进程优先调度源代码:
#include"stdio.h"
structsjf{
charname[10];
floatarrivetime;
floatservicetime;
floatstarttime;
floatfinishtime;
floatzztime;
floatdqzztime;
};
sjfa[100];
voidinput(sjf*p,intN)
{inti;
printf("intputtheprocess'sname&arrivetime&servicetime:
\nforexmple:
a0100\n");
for(i=0;i<=N-1;i++)
{
printf("inputthe%dthprocess'sinformation:
\n",i+1);
scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime);
}
}
voidPrint(sjf*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,floatzztime,floatdqzztime,intN)
{intk;
printf("runorder:
");
printf("%s",p[0].name);
for(k=1;k {printf("-->%s",p[k].name); } printf("\ntheprocess'sinformation: \n"); printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tdqzz\n"); for(k=0;k<=N-1;k++) {printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime); } } //排序 voidsort(sjf*p,intN) { for(inti=0;i<=N-1;i++) for(intj=0;j<=i;j++) if(p[i].arrivetime { sjftemp; temp=p[i]; p[i]=p[j]; p[j]=temp; } } //运行阶段 voiddeal(sjf*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,float&zztime,float&dqzztime,intN) {intk; for(k=0;k<=N-1;k++) { if(k==0) { p[k].starttime=p[k].arrivetime; p[k].finishtime=p[k].arrivetime+p[k].servicetime;} else { p[k].starttime=p[k-1].finishtime; p[k].finishtime=p[k-1].finishtime+p[k].servicetime;} } for(k=0;k<=N-1;k++) { p[k].zztime=p[k].finishtime-p[k].arrivetime; p[k].dqzztime=p[k].zztime/p[k].servicetime; } } voidsjff(sjf*p,intN) {floatarrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;//对结构进行初始化 sort(p,N); for(intm=0;m {if(m==0) p[m].finishtime=p[m].arrivetime+p[m].servicetime; else p[m].finishtime=p[m-1].finishtime+p[m].servicetime; inti=0; for(intn=m+1;n<=N-1;n++) {if(p[n].arrivetime<=p[m].finishtime)//判断内存中每次完成之后有多少到达的进程 i++; } floatmin=p[m+1].servicetime; intnext=m+1;//m+1=n for(intk=m+1;k { if(p[k+1].servicetime {min=p[k+1].servicetime; next=k+1;} } sjftemp; temp=p[m+1]; p[m+1]=p[next]; p[next]=temp; } deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N); Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N); } voidmain() {intN; printf("------短作业优先调度算法------\n"); printf("inputtheprocess'snumber: \n"); scanf("%d",&N); input(a,N); sjf*b=a; sjf*c=a; sjff(b,N); } 时间片轮转法源代码: #include #defineM5//物理页数 #defineMyprintfprintf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n") typedefstructPCB { intID; intReachTime; intTotalTime; }PCB;//进程号,到达时间和服务时间 typedefstructNOTE//备份 { intID; intTotalTime; }NOTE; PCBA[M];//5个进程 PCBa[M]; NOTEtemp; intqueue[50];//记录调度的进程 intK=0;//调度进程数组的标识 voidINIT()//初始化 { inti; for(i=0;i { A[i].ID=-1; } } intGetNum()//计算进程数 { inti,j=0; for(i=0;i { if(A[i].ID! =-1) { j++; } } returnj; } intGetReach(inttime)//找出到达进程号 { inti; for(i=0;i { if(a[i].ReachTime<=time) { a[i].ReachTime=100; returni; } } return-1; } intGetInsert()//找出插入位置 { inti; for(i=0;i { if(A[i].ID==-1) returni; } return-1; } voidForward(intnum)//前移 { inti; for(i=0;i { A[i].ID=A[i+1].ID; A[i].TotalTime=A[i+1].TotalTime; } A[num-1].ID=-1; } voidProcess()//执行进程 { queue[K]=A[0].ID; K++; A[0].TotalTime--; =A[0].ID; =A[0].TotalTime; } voidmain() { inti; inttime; intt=0; intreach; intinsert; intnum; printf("RR算法\n\n"); INIT(); for(i=0;i { printf("请输入进程ID: "); scanf("%d",&a[i].ID); printf("请输入到达时间: "); scanf("%d",&a[i].ReachTime); printf("请输入服务时间: "); scanf("%d",&a[i].TotalTime); } for(i=0;i { t=t+a[i].TotalTime; } for(i=0;i<50;i++)//初始化 { queue[i]=-1; } for(time=0;time<=t;time++) { reach=GetReach(time); if(reach! =-1)//有进程到达 { insert=GetInsert(); A[insert].ID=a[reach].ID; A[insert].TotalTime=a[reach].TotalTime; num=GetNum(); if(num==1) continue;//进程数为1 else { //进程数不为1 Process(); Forward(num); if(! =0) { A[num-1].ID=; A[num-1].TotalTime=; } } } else//没有进程到达 { num=GetNum(); if(num==1) {//进程数为1 Process(); if(==0) { A[0].ID=-1; } } elseif(num==0) continue;//进程数为0 else { Process(); Forward(num); if(! =0) { A[num-1].ID=; A[num-1].TotalTime=; } } } } printf("\n"); printf("调度顺序为: \n"); Myprintf; for(i=0;i<50;i++) { if(queue[i]! =-1) printf("|%2d",queue[i]); } printf("|\n"); Myprintf; printf("\n"); } 八、实验数据及结果分析: 短作业优先调度算法的实验结果: 时间片轮转调度算法结果: 九、实验结论: 本次实验成功的完成了短作业优先调度算法和轮转时间片调度算法的模拟,通过本次实验我们了解到短作业优先调度算法不利于长作业的处理,因为长作业将长期得不到处理,而轮转时间片调度算法则解决了这一问题。 短长作业均能在每一个周期内分得一个时间片处理自己的任务。 十、总结及心得体会: 通过本次实验对短作业优先调度算法和时间片轮转调度算法有了更深入的理解,同时,对程序算法能力有了进一步的提高,同时对模块化编程有了更深入得理解,代码的模块化会使程序的代码复用率提高,提高编程的效率。 十一、对本实验过程及方法、手段的改进建议: 本次实验的时间片轮转调度算法由于教材版本不一样有两种结果,本次实验本人采取的新教材的版本,新版本的难度较老教材要大很多,实验时候可以根据具体情况选择一个适合自己的来做。 报告评分: 指导教师签字:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 作业 优先 调度 时间 轮转 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)