《2022年操作系统作业实验二报告》由会员分享,可在线阅读,更多相关《2022年操作系统作业实验二报告(28页珍藏版)》请在金锄头文库上搜索。
1、江南大学实验报告课程名称操作系统实验名称作业调度实验实验日期2014 12 11 班级信计 1202 姓名任航学号1130112211 仪器编号实验报告要求1实验目的2实验要求3实验步骤4程序清单5运行情况5实验体会一、实验目的:用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。二 . 实验要求:(1)编写并调试一个单道处理系统的作业调度模拟程序。作业等待算法:分别采用先来先服务(FCFS ),最短作业优先(SJF)、响应比高者优先(HRN )的调度算法。对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权
2、平均周转时间,以比较各种算法的优缺点。(2) 编写并调度一个多道程序系统的作业调度模拟程序。作业调度算法:采用基于先来先服务的调度算法。可以参考课本中的方法进行设计。对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。三. 实验步骤 . 四. 程序清单:单道批处理先来先服务算法:#include #include #include int n;/ 全局变量 n float T1=0,T2=0;/ 分别用来表示周转时间和带权周转时间之和int times=0; struct jcb /作业控制块 char name10; /作业名int reachtime
3、; /作业到达时间int starttime; /作业开始时间int needtime; /作业需要运行的时间int finishtime; /作业完成时间float cycletime; /作业周转时间float cltime; /作业带权周转时间char state; /作业状态名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 28 页 - - - - - - - - - struct jcb *next; /结构体指针*ready=NULL,*p,*q; typede
4、f 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(ready=NULL)/如果是第一个结点的话执行 ready=q=
5、p; else/不是第一个结点 q-next=p;/ 链接起来q=p;/q 向后移动一个结点,ready 始终指向第一个 void disp(JCB* q)/ 显示作业运行后的周转时间及带权周转时间等 printf(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) /运
6、行作业 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 28 页 - - - - - - - - - if(p=ready)/ 先将要运行的作业从队列中分离出来 ready=p-next; p-next=NULL; else q=ready; while(q-next!=p) q=q-next; q-next=p-next; p-starttime=times;/ 计算作业运行后的完成时间,周转时间等等p-state=R; p-finishtime=p-starttime
7、+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;/完成状态printf(n%s has been finished!npress any key to continue.n,p-name); free(p); / 释放
8、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(); for(i=0; istate=W&p-reachtimenext; while(p!=NULL&iden) ; if(iden) i-; pri
9、ntf(n 没有满足要求的进程,需等待 ); times+; if(times100) printf(n 时间过长 ); getch(); else running(p); /调用 running()函数 final(); /调用 running() 函数 int main() /主函数 printf(ntt先来先服务算法,按任意键继续 .); getch(); fcfs(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 28 页 - - - - - - - - -
10、单道批处理最短作业优先算法:#include #include #include int n;/ 全局变量 n float 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; /作业带权周转时间c
11、har state; /作业状态struct jcb *next; /结构体指针*head=NULL,*p,*q; typedef struct jcb JCB; void inital()/ 建立作业控制块队列,先将其排成先来先服务的模式队列 int i; printf(ntt输入作业数 :); scanf(%d,&n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 28 页 - - - - - - - - - for(i=0; iname); p-reachtim
12、e=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)/ 如果是第一个结点的话执行 head=q=p; else/不是第一个结点 q-next=p;/ 链接起来q=p;/q 向后移动一个结点,ready 始终指向第一个 void display(JCB* q)/ 显示作业运行后的周转时间及带权周转时间等 printf(n 作业 %s 正在运行,
13、其运行情况如下:n,q-name); printf( 开始运行时刻:%dn,q-starttime); printf( 完成时刻: %dn,q-finishtime); printf( 周转时间: %fn,q-cycletime); printf( 带权周转时间:%fn,q-cptime); getch(); void run(JCB *min)/min为正在运行作业 if(min=head)/ 先将要运行的作业从队列中分离出来,此时的min 是 min head=min-next; min-next=NULL; else q=head;/形成循环对列while(q-next!=min) q=
14、q-next; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 28 页 - - - - - - - - - q-next=min-next;/ 分离出最小作业 min-starttime=times;/ 计算作业运行后的完成时间,周转时间等等min-state=R; min-finishtime=min-starttime+min-needtime; min-cycletime=(float)(min-finishtime-min-reachtime); min-cpt
15、ime=(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() /计算队列中作业的高响应比 JCB *pa
16、dv; 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个作业的平均带权周转时间是%f:
17、nnn,n,s); void sjf()/ 最短作业优先算法 JCB *min;/min表示最短作业名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 28 页 - - - - - - - - - int i,iden; system(cls); inital(); for(i=0; istate=W&p-reachtimeneedtimeneedtime)/ 判断作业的长短,min min=p; p=p-next; while(p!=NULL) ;/这个循环遍历作业队列,目
18、的是找出最短的作业,最后p=null ,min 指向最短作业if(iden) i-; /printf(ntime=%d:tno JCB submib.wait.,time); times+; if(times100) printf(nruntime is too long.error); getch(); else run(min); /调用 run() 函数 final(); /调用 final() 函数 int main() /主函数名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第
19、 8 页,共 28 页 - - - - - - - - - printf(ntt最短作业优先算法,按任意键继续.); getch(); sjf(); 运行结果:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 28 页 - - - - - - - - - 单道批处理响应比高者优先算法:#include #include #include int n;/全局变量 n float T1=0,T2=0;/分别用来表示周转时间和带权周转时间之和int times=0; struct
20、 jcb /作业控制块 char name10; /作业名 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()/建立作业控制
21、块队列 , 先将其排成先来先服务的模式队列 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 28 页 - - - - - - - - - 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-needt
22、ime); p-state=W;/状态初始化为等待 p-next=NULL; if(ready=NULL)/如果是第一个结点的话执行 ready=q=p; else/不是第一个结点 q-next=p;/链接起来 q=p;/q向后移动一个结点, ready 始终指向第一个 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 28 页 - - - - - - - - - void display(JCB* q)/显示作业运行后的周转时间及带权周转时间等 printf(n作业%s
23、正在运行,其运行情况如下: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 q=ready; 名师资料总结 - - -精品资料欢迎下载 -
24、 - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 28 页 - - - - - - - - - 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-need
25、time); T1+=p-cycletime;/周转时间之和 T2+=p-cltime;/带全周转时间之和 display(p);/调用 disp() 函数, 显示作业运行情况 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 名师资料总结 - - -精品资料欢迎下载 - - - -
26、 - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 28 页 - - - - - - - - - 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作业已经全部
27、完成 !); printf(n%d个作业的平均周转时间是:%f,n,t); printf(n%d个作业的平均带权周转时间是%f:nnn,n,s); void hrn()/高响应比算法 JCB *min; int i,iden; system(cls); inital(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 28 页 - - - - - - - - - for(i=0; istate=W&p-reachtimesupermin-super) min=p; p
28、=p-next; while(p!=NULL); if(iden) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 28 页 - - - - - - - - - i-; times+; if(times1000) printf(nruntime is too long.error.); getch(); else run(min); /调用 run() 函数 final(); /调用 run() 函数 int main() /主函数 printf(tt响应比高者优先算法
29、,按任意键继续.); getch(); hrn(); getch(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 28 页 - - - - - - - - - (2)、编写并调度一个多道程序系统的作业调度模拟程序。作业调度算法:采用基于先来先服务的调度算法。可以参考课本中的方法进行设计。对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。多道程序(基于先来先算服务)#include #include 名师资料总结 - - -
30、精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 28 页 - - - - - - - - - #define getjch(type) (type*)malloc(sizeof(type) #define N 10 struct jcb /* 定义作业控制块 PCB */ char name10; float needtime; /*运行时间 */ float arrivetime;/*提交时刻 */ float storageN;/*系统资源 */ struct jcb* link; *re
31、ady=NULL,*pb=NULL,*p; typedef struct jcb JCB; float 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();
32、/*运行作业组 */ void destroy(); /* 撤销作业 */ void input() /* 建立作业控制块函数 */ int i,k,num; printf(请输入所拥有的资源种类 :); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 28 页 - - - - - - - - - scanf(%d,&n); printf(输入系统所拥有资源数 :n); for(i=0;in;i+) printf(资源%d:,i); scanf(%f,&sourcei)
33、; 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); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 28 页 - - - - - - - - - printf(n); p
34、-link=NULL; fcfs(); 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); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 -
35、 - - - - - - 第 20 页,共 28 页 - - - - - - - - - for(i=0;istoragei); printf(n); void destroy() /*建立作业撤消函数 ( 作业运行结束 , 撤消作业 )*/ free(p); void check() 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; else
36、test=1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 21 页,共 28 页 - - - - - - - - - if(test=0) p=first; first=first-link; p-link=NULL; if(ready=NULL) ready=p; else fir=ready; while(fir-link!=NULL) fir=fir-link; fir-link=p; else flag=1; pb=first; void fcfs() 名师资料总结 -
37、 - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 22 页,共 28 页 - - - - - - - - - JCB *first,*second; int ins=0; if(pb=NULL)|(p-arrivetimearrivetime) p-link=pb; pb=p; else first=pb; second=first-link; while(second!=NULL) if(p-arrivetimearrivetime) p-link=second; second=NULL; firs
38、t-link=p; ins=1; else first=first-link; second=second-link; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 23 页,共 28 页 - - - - - - - - - if(ins=0) first-link=p; void running() JCB *pr; int i; printf(正在运行的作业是 :%sn,p-name); disp(p); if(ready!=NULL) printf(就绪队列如下 :n); p
39、r=ready; while(pr!=NULL) disp(pr); pr=pr-link; else 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 24 页,共 28 页 - - - - - - - - - printf(就绪队列为空队列 !n); if(pb!=NULL) printf(后备队列如下 :n); pr=pb; while(pr!=NULL) disp(pr); pr=pr-link; else printf(后备队列为空队列 !n); printf(作业%s的开始
40、运行时刻 T:%4.2fn,p-name,T); Tc=T+p-needtime; T=Tc; Ti=Tc-p-arrivetime; Wi=Ti/(p-needtime); for(i=0;istoragei; printf(完成时刻 Tc:%4.2fn,Tc); printf(周转时间 Ti:%4.2fn,Ti); printf(带权周转时间 Wi:%4.2fn,Wi); TiSum+=Ti; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 25 页,共 28 页 - - - -
41、 - - - - - WiSum+=Wi; destroy(); main() /主函数 int len; char ch; input(); T=pb-arrivetime; check(); len=space(); while(len!=0)&(ready!=NULL) system(pause); p=ready; ready=p-link; p-link=NULL; running(); if(pb!=NULL) if(ready=NULL) if(Tarrivetime) T=pb-arrivetime; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - -
42、 - - - - - - - - - 名师精心整理 - - - - - - - 第 26 页,共 28 页 - - - - - - - - - check(); len=space(); printf(n该作业组的平均周转时间:%4.2fn,TiSum /len); printf(该作业组的带权平均周转时间:%4.2fn,WiSum/len); ch=getchar(); 运行结果:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 27 页,共 28 页 - - - - - - - -
43、 - 实验体会:FCFS 算法比较简单,有利于长作业,而不利于短作业,从运行结果数据来看平均周转时间和平均带权周转时间最长,因此效率最差; SJF算法效率高,适合短作业,但对长作业不利,采用短作业优先算法后,不论是平均周转时间还是平均带权周转时间,都有明显的改善,即说明短作业优先相比于先来先服务优先算法能有效地降低作业的平均等待时间,提高系统吞吐量, HRN算法克服了 FCFS算法效率低的问题,并且充分考虑了作业到达的先后次序,克服了 SJF算法不利于长作业的缺点, 实现了前两种算法的折中。通过实验和老师的交流,学到了很多有用的知识,感谢老师的指导。教师评价优良中及格不及格教师签名日期名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 28 页,共 28 页 - - - - - - - - -