




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、江南大学实验报告课程名称 操作系统 实验名称 作业调度实验 实验日期 2014 12 11 班级 信计1202 姓名 任航 学号 1130112211 仪器编号 实验报告要求 1实验目的 2实验要求 3实验步骤 4程序清单 5运行情况 5实验体会 一、 实验目的:用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。二 . 实验要求:(1)编写并调试一个单道处理系统的作业调度模拟程序。作业等待算法:分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以
2、及这组作业的平均周转时间及带权平均周转时间,以比较各种算法的优缺点。(2) 编写并调度一个多道程序系统的作业调度模拟程序。作业调度算法:采用基于先来先服务的调度算法。可以参考课本中的方法进行设计。对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。3. 实验步骤.4. 程序清单:单道批处理先来先服务算法:#include #include #include int n;/全局变量nfloat T1=0,T2=0;/分别用来表示周转时间和带权周转时间之和int times=0;struct jcb /作业控制块 char name10; /作业名 int
3、reachtime; /作业到达时间 int starttime; /作业开始时间 int needtime; /作业需要运行的时间 int finishtime; /作业完成时间 float cycletime; /作业周转时间 float cltime; /作业带权周转时间 char state; /作业状态 struct jcb *next; /结构体指针*ready=NULL,*p,*q;typedef struct jcb JCB;void inital()/建立作业控制块队列,先将其排成先来先服务的模式队列 int i; printf(ntt输入作业数:); scanf(%d,&n
4、); for(i=0; iname); p-reachtime=i;/第一个0秒到,第二个1秒到 printf(tt第%d个作业到达时间默认为:%d,i+1,i); printf(ntt输入作业要运行的时间:); scanf(%d,&p-needtime); p-state=W;/状态初始化为等待 p-next=NULL; if(ready=NULL)/如果是第一个结点的话执行 ready=q=p; else/不是第一个结点 q-next=p;/链接起来 q=p;/q向后移动一个结点,ready始终指向第一个 void disp(JCB* q)/显示作业运行后的周转时间及带权周转时间等 pri
5、ntf(n作业%s正在运行,其运行情况如下:n,q-name); printf(开始运行时刻:%dn,q-starttime); printf(完成时刻:%dn,q-finishtime); printf(周转时间:%fn,q-cycletime); printf(带权周转时间:%fn,q-cltime); getch();void running(JCB *p) /运行作业 if(p=ready)/先将要运行的作业从队列中分离出来 ready=p-next; p-next=NULL; else q=ready; while(q-next!=p) q=q-next; q-next=p-next
6、; p-starttime=times;/计算作业运行后的完成时间,周转时间等等 p-state=R; p-finishtime=p-starttime+p-needtime; p-cycletime=(float)(p-finishtime-p-reachtime); p-cltime=(float)(p-cycletime/p-needtime); T1+=p-cycletime;/周转时间之和 T2+=p-cltime;/带全周转时间之和 disp(p);/调用disp()函数,显示作业运行情况 times+=p-needtime;/累加时间量 p-state=F;/完成状态 print
7、f(n%s has been finished!npress any key to continue.n,p-name); free(p); /释放 getch();void final() /最后打印作业的平均周转时间,平均带权周转时间 float s,t; t=T1/n; s=T2/n; getch(); printf(nn作业已经全部完成!); printf(n%d个作业的平均周转时间是:%f,n,t); printf(n%d个作业的平均带权周转时间是%f:nnn,n,s);void fcfs() /先来先服务算法 int i,iden; system(cls); inital(); f
8、or(i=0; istate=W&p-reachtimenext; while(p!=NULL&iden) ; if(iden) i-; printf(n没有满足要求的进程,需等待); times+; if(times100) printf(n时间过长); getch(); else running(p); /调用running()函数 final(); /调用running()函数int main() /主函数 printf(ntt先来先服务算法,按任意键继续.); getch(); fcfs();单道批处理最短作业优先算法:#include #include #include int n;
9、/全局变量nfloat t1=0,t2=0;/分别用来表示周转时间和带权周转时间之和int times=0;struct jcb /作业控制块 char name10; /作业名 int reachtime; /作业到达时间 int starttime; /作业开始时间 int needtime; /作业需要运行的时间 float super; /作业的响应比 int finishtime; /作业完成时间 float cycletime; /作业周转时间 float cptime; /作业带权周转时间 char state; /作业状态 struct jcb *next; /结构体指针*he
10、ad=NULL,*p,*q;typedef struct jcb JCB;void inital()/建立作业控制块队列,先将其排成先来先服务的模式队列 int i; printf(ntt输入作业数:); scanf(%d,&n); for(i=0; iname); p-reachtime=i;/默认第一个0秒到,第二个1秒到。 printf(tt第%d个作业到达时间默认为:%d,i+1,i); printf(ntt输入作业要运行的时间:); scanf(%d,&p-needtime); p-state=W;/状态初始化为等待 p-next=NULL; if(head=NULL)/如果是第一个
11、结点的话执行 head=q=p; else/不是第一个结点 q-next=p;/链接起来 q=p;/q向后移动一个结点,ready始终指向第一个 void display(JCB* q)/显示作业运行后的周转时间及带权周转时间等 printf(n作业%s正在运行,其运行情况如下:n,q-name); printf(开始运行时刻:%dn,q-starttime); printf(完成时刻:%dn,q-finishtime); printf(周转时间:%fn,q-cycletime); printf(带权周转时间:%fn,q-cptime); getch();void run(JCB *min)/
12、min为正在运行作业 if(min=head)/先将要运行的作业从队列中分离出来,此时的min是min head=min-next; min-next=NULL; else q=head;/形成循环对列 while(q-next!=min) q=q-next; q-next=min-next;/分离出最小作业 min-starttime=times;/计算作业运行后的完成时间,周转时间等等 min-state=R; min-finishtime=min-starttime+min-needtime; min-cycletime=(float)(min-finishtime-min-reacht
13、ime); min-cptime=(float)(min-cycletime/min-needtime); t1+=min-cycletime;/周转时间之和 t2+=min-cptime;/带全周转时间之和 display(min);/调用disp()函数,显示作业运行情况 times+=min-needtime;/累加时间量 min-state=F;/完成状态 printf(n%s has been finished!npress any key to continue.n,min-name); free(min); /释放 getch();void super() /计算队列中作业的高响
14、应比 JCB *padv; padv=head; do if(padv-state=W&padv-reachtimesuper=(float)(times-padv-reachtime+padv-needtime)/padv-needtime; padv=padv-next; while(padv!=NULL);void final() /最后打印作业的平均周转时间,平均带权周转时间 float s,t; t=t1/n; s=t2/n; getch(); printf(nn作业已经全部完成!); printf(n%d个作业的平均周转时间是:%f,n,t); printf(n%d个作业的平均带权
15、周转时间是%f:nnn,n,s);void sjf()/ 最短作业优先算法 JCB *min;/min表示最短作业 int i,iden; system(cls); inital(); for(i=0; istate=W&p-reachtimeneedtimeneedtime)/判断作业的长短,min min=p; p=p-next; while(p!=NULL) ;/这个循环遍历作业队列,目的是找出最短的作业,最后p=null,min指向最短作业 if(iden) i-; /printf(ntime=%d:tno JCB submib.wait.,time); times+; if(time
16、s100) printf(nruntime is too long.error); getch(); else run(min); /调用run()函数 final(); /调用final()函数int main() /主函数 printf(ntt最短作业优先算法,按任意键继续.); getch(); sjf();运行结果:单道批处理响应比高者优先算法:#include #include #include int n;/全局变量nfloat T1=0,T2=0;/分别用来表示周转时间和带权周转时间之和int times=0;struct jcb /作业控制块 char name10; /作业名
17、 int reachtime; /作业到达时间 int starttime; /作业开始时间 int needtime; /作业需要运行的时间 float super; /作业的响应比 int finishtime; /作业完成时间 float cycletime; /作业周转时间 float cltime; /作业带权周转时间 char state; /作业状态 struct jcb *next; /结构体指针*ready=NULL,*p,*q;typedef struct jcb JCB;void inital()/建立作业控制块队列,先将其排成先来先服务的模式队列 int i; prin
18、tf(ntt输入作业数:); scanf(%d,&n); for(i=0; iname); p-reachtime=i;/第一个0秒到,第二个1秒到 printf(tt第%d个作业到达时间默认为:%d,i+1,i); printf(ntt输入作业要运行的时间:); scanf(%d,&p-needtime); p-state=W;/状态初始化为等待 p-next=NULL; if(ready=NULL)/如果是第一个结点的话执行 ready=q=p; else/不是第一个结点 q-next=p;/链接起来 q=p;/q向后移动一个结点,ready始终指向第一个 void display(JCB
19、* q)/显示作业运行后的周转时间及带权周转时间等 printf(n作业%s正在运行,其运行情况如下:n,q-name); printf(开始运行时刻:%dn,q-starttime); printf(完成时刻:%dn,q-finishtime); printf(周转时间:%fn,q-cycletime); printf(带权周转时间:%fn,q-cltime); printf(响应比:%fn,q-super); getch();void run(JCB *p) /运行作业 if(p=ready)/先将要运行的作业从队列中分离出来 ready=p-next; p-next=NULL; else
20、 q=ready; while(q-next!=p) q=q-next; q-next=p-next; p-starttime=times;/计算作业运行后的完成时间,周转时间等等 p-state=R; p-finishtime=p-starttime+p-needtime; p-cycletime=(float)(p-finishtime-p-reachtime); p-cltime=(float)(p-cycletime/p-needtime); T1+=p-cycletime;/周转时间之和 T2+=p-cltime;/带全周转时间之和 display(p);/调用disp()函数,显示
21、作业运行情况 times+=p-needtime;/累加时间量 p-state=F;/完成状态 printf(n%s has been finished!npress any key to continue.n,p-name); free(p); /释放 getch();void super() /计算队列中作业的高响应比 JCB *padv; padv=ready; do if(padv-state=W&padv-reachtimesuper=(float)(times-padv-reachtime+padv-needtime)/padv-needtime; padv=padv-next;
22、while(padv!=NULL);void final()/最后打印作业的平均周转时间,平均带权周转时间 float s,t; t=T1/n; s=T2/n; getch(); printf(nn作业已经全部完成!); printf(n%d个作业的平均周转时间是:%f,n,t); printf(n%d个作业的平均带权周转时间是%f:nnn,n,s);void hrn()/高响应比算法 JCB *min; int i,iden; system(cls); inital(); for(i=0; istate=W&p-reachtimesupermin-super) min=p; p=p-next
23、; while(p!=NULL); if(iden) i-; times+; if(times1000) printf(nruntime is too long.error.); getch(); else run(min); /调用run()函数 final(); /调用run()函数int main() /主函数 printf(tt响应比高者优先算法,按任意键继续.); getch(); hrn(); getch();(2)、编写并调度一个多道程序系统的作业调度模拟程序。 作业调度算法:采用基于先来先服务的调度算法。可以参考课本中的方法进行设计。 对于多道程序系统,要假定系统中具有的各种资
24、源及数量、调度作业时必须考虑到每个作业的资源要求。多道程序(基于先来先算服务)#include #include #define getjch(type) (type*)malloc(sizeof(type) #define N 10struct jcb /* 定义作业控制块PCB */ char name10; float needtime; /*运行时间*/float arrivetime;/*提交时刻*/float storageN;/*系统资源*/struct jcb* link; *ready=NULL,*pb=NULL,*p; typedef struct jcb JCB; flo
25、at Tc,Ti,Wi,T=0;/*完成时刻,周转时间,带权周转时间,时间量*/float TiSum=0,WiSum=0;/*平均周转时间,带权a平均周转时间*/float sourceN;int n;void input(); /*输入作业信息*/int space(); /* 返回就绪队列中作业的数目*/void fcfs(); /*先来先服务算法*/void disp(JCB *pr); /* 显示相应的作业*/void running(); /*运行作业组*/void destroy(); /* 撤销作业*/void input() /* 建立作业控制块函数*/ int i,k,nu
26、m; printf(请输入所拥有的资源种类:);scanf(%d,&n);printf(输入系统所拥有资源数:n);for(i=0;in;i+)printf(资源%d:,i);scanf(%f,&sourcei); printf(n 输入作业数量:);scanf(%d,&num); for(i=0;iname); printf(输入提交时间:);scanf(%f,&p-arrivetime);printf(输入运行时间:);scanf(%f,&p-needtime); printf(输入所需资源数:n);for(k=0;kstoragek); printf(n); p-link=NULL; f
27、cfs(); int space() int l=0; JCB* pr=ready; while(pr!=NULL) l+; pr=pr-link; return(l); void disp(JCB * pr) /*建立作业显示函数,用于显示当前作业*/ int i;printf(n%6st%6st%6st,作业名,运行时间,提交时刻);for(i=0;iname,pr-needtime,pr-arrivetime);for(i=0;istoragei);printf(n); void destroy() /*建立作业撤消函数(作业运行结束,撤消作业)*/ free(p); void chec
28、k()JCB *first,*fir,*p;int flag=0,i,test=0;first=pb;while(first&(T=first-arrivetime)&(flag=0)for(i=0;i=first-storagei)sourcei=sourcei-first-storagei;elsetest=1;if(test=0)p=first;first=first-link;p-link=NULL;if(ready=NULL)ready=p;elsefir=ready;while(fir-link!=NULL)fir=fir-link;fir-link=p;elseflag=1;pb
29、=first;void fcfs()JCB *first,*second;int ins=0;if(pb=NULL)|(p-arrivetimearrivetime)p-link=pb;pb=p;elsefirst=pb;second=first-link;while(second!=NULL)if(p-arrivetimearrivetime)p-link=second;second=NULL;first-link=p;ins=1;else first=first-link; second=second-link;if(ins=0)first-link=p;void running()JCB *pr;int i;printf(正在运行的作业是:%sn,p-name);disp(p);if(ready!=NULL)printf(就绪队列如下:n);pr=ready;while(pr!=NULL)disp(pr)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业土地征收合同范例
- 传媒临时合同范例
- 管道废除施工方案
- 农村小院征用合同范例
- 仓库平房出售合同范例
- 镀锌钢管埋地施工方案
- 公司承包土地合同范例
- 农机车合同范例
- 仓储厂房建设合同范本
- 利用合同范例
- 县国有企业改革转型方案
- 高中家长会 高考考前家长会家长心理调整课件
- 2025年皖北卫生职业学院单招职业适应性测试题库附答案
- 住宅老旧电梯更新改造方案
- 2025年山东国电投莱阳核能有限公司校园招聘笔试参考题库附带答案详解
- 《主题六 研学旅行我做主》教学设计-2023-2024学年六年级下册综合实践活动辽师大版
- 电力工程建设中的风险控制与管理措施
- 中小学生开学第一课主题班会-以哪吒之魔童降世为榜样
- 八年级北师大版上册数学期中卷面分析
- 2025年张家界航空工业职业技术学院高职单招职业技能测试近5年常考版参考题库含答案解析
- 深静脉置管的护理及维护
评论
0/150
提交评论