作业调度实验报告,DOC.pdf

上传人:tbuqq 文档编号:5057253 上传时间:2020-01-30 格式:PDF 页数:19 大小:1.24MB
返回 下载 相关 举报
作业调度实验报告,DOC.pdf_第1页
第1页 / 共19页
作业调度实验报告,DOC.pdf_第2页
第2页 / 共19页
作业调度实验报告,DOC.pdf_第3页
第3页 / 共19页
作业调度实验报告,DOC.pdf_第4页
第4页 / 共19页
作业调度实验报告,DOC.pdf_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《作业调度实验报告,DOC.pdf》由会员分享,可在线阅读,更多相关《作业调度实验报告,DOC.pdf(19页珍藏版)》请在三一文库上搜索。

1、实验二作业调度 一. 实验题目 1、编写并调试一个单道处理系统的作业等待模拟程序。 作业调度算法:分别采用先来先服务(FCFS ) ,最短作业优先(SJF) 、响应比高者优先 (HRN )的调度算法。 (1) 先来先服务算法: 按照作业提交给系统的先后顺序来挑选作业,先提交的先被挑选。 (2)最短作业优先算法:是以进入系统的作业所提出的“ 执行时间 ” 为标准,总是优先选 取执行时间最短的作业。 ( 3)响应比高者优先算法:是在每次调度前都要计算所有被选作业(在后备队列中)的 响应比,然后选择响应比最高的作业执行。 2、编写并调度一个多道程序系统的作业调度模拟程序。 作业调度算法:采用基于先来

2、先服务的调度算法。可以参考课本中的方法进行设计。 对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个 作业的资源要求。 二. 实验目的: 本实验要求用高级语言(C 语言实验环境) 编写和调试一个或多个作业调度的模拟程 序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解 三 .实验过程 单道处理系统作业调度 1)单道处理程序作业调度实验的源程序: zuoye.c 执行程序 : zuoye.exe 2)实验分析: 1、由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业 完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的

3、 CPU 时限等因素。 2、每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、 提交时间、 所需的运行时间、所需的资源、作业状态、链指针等等。作业的状态可以是等待 W(Wait) 、运行 R(Run)和完成 F(Finish)三种状态之一。 每个作业的最初状态总是等 待 W 。 3、对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、 带权周 转时间,以及这组作业的平均周转时间及带权平均周转时间。 3) 流程图 : 二. 最短作业优先算法 三. 高响应比算法 图一 . 先来先服务流程图 4) 源程序 : #include #include #include #d

4、efine getpch(type) (type*)malloc(sizeof(type) #define NULL 0 int 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 cltime; /作业带权

5、周转时间 char state; /作业状态 struct jcb *next; /结构体指针 *ready=NULL,*p,*q; typedef struct jcb JCB; void inize() /初始化界面 printf(“nntt*ttn“); printf(“tttt实验二作业调度 n“); printf(“tt*ttn“); printf(“nnnttttt计算机学院软件四班n“); printf(“ttttt蓝小花 n“); printf(“ttttt3204007102n“); printf(“ttttt完成日期: 2006 年 11 月 17 号“); printf(

6、“nnntt请输入任意键进入演示过程n“); getch(); void inital() /建立作业控制块队列, 先将其排成先来先服务的模式队列 int i; printf(“n输入作业数 :“); scanf(“%d“, for(i=0;iname); getch(); p-reachtime=i; printf(“作业默认到达时间:%d“,i); printf(“n输入作业要运行的时间:“); scanf(“%d“, p-state=W; p-next=NULL; if(ready=NULL) ready=q=p; else q-next=p; q=p; void disp(JCB* q

7、,int m) /显示作业运行后的周转时间及带权周转时间等 if(m=3) /显示高响应比算法调度作业后的运行情况 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(); else / 显示先来先服务, 最短作业优先算法调度后作业的运行情况

8、 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,int m) /运行作业 if(p=ready) /先将要运行的作业从队列中分离出来 ready=p-next; p-next=NULL; else q=ready; while(q-next!=p

9、) 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; disp(p,m); /调用 disp()函数 , 显示作业运行情况 times+=p-needtime; p-state=F;

10、 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 while(padv!=NULL); void final() /最后打印作业的平均周转时间, 平均带权周转时间 float s,t; t=T1/n; s=T2/n; getch(); printf(“nn作业已经全部完成!“); printf(“n%d个作业的平均

11、周转时间是:%f“,n,t); printf(“n%d个作业的平均带权周转时间是%f:nnn“,n,s); void hrn(int m) /高响应比算法 JCB *min; int i,iden; system(“cls“); inital(); for(i=0;istate=W p=p-next; while(p!=NULL); if(iden) i-;times+; /printf(“ntime=%d:tno JCB submib.wait.“,time); if(times1000) printf(“nruntime is too long.error.“);getch(); else

12、 running(min,m); /调用 running()函数 /for final(); /调用 running()函数 void sjf(int m) / 最短作业优先算法 JCB *min; int i,iden; system(“cls“); inital(); for(i=0;istate=W p=p-next; while(p!=NULL) ; if(iden) i-; /printf(“ntime=%d:tno JCB submib.wait.“,time); times+; if(times100)printf(“nruntime is too long.error“);ge

13、tch(); else running(min,m); /调用 running()函数 /for final(); /调用 running()函数 void fcfs(int m) /先来先服务算法 int i,iden; system(“cls“); inital(); for(i=0;istate=W while(p!=NULL if(iden) i-; printf(“n没有满足要求的进程, 需等待 “); times+; if(times100)printf(“n时间过长 “);getch(); else running(p,m); /调用 running()函数 final(); /

14、调用 running()函数 void mune() int m; system(“cls“); printf(“nntt*ttn“); printf(“tttt作业调度演示n“); printf(“tt*ttn“); printf(“nnnttt1.先来先服务算法.“); printf(“nttt2.最短作业优先算法.“); printf(“nttt3.响应比高者优先算法“); printf(“nttt0.退出程序 .“); printf(“nntttt选择所要操作:“); scanf(“%d“, switch(m) case 1: fcfs(m); getch(); system(“cls

15、“); mune(); break; case 2: sjf(m); getch(); system(“cls“); mune(); break; case 3: hrn(m); getch(); system(“cls“); mune(); break; case 0: system(“cls“); break; default: printf(“选择错误 , 重新选择 .“); getch(); system(“cls“); mune(); main() /主函数 inize(); mune(); 5) 调试结果 : 1. 选择操作的界面 2. 输入操作初始信息: 3. 先来先服务算法作业

16、调度结果: ( 调度顺序 :a-b-c-d-e) 4. 最短作业优先算法作业调度结果( 调度顺序 : a-d-b-e-c) 5. 高响应比算法作业调度结果: ( 调度顺序 a-b-d-c-e) 多道处理系统作业调度 1)多道处理程序作业调度实验的源程序: duodao.c 执行程序 : duodao.exe 2)实验分析 : 采用多道程序设计方法的操作系统,在系统中要经常保留多个运行的作业,以提高系统效 率。作业调度从系统已接纳的暂存在输入井中的一批作业中挑选出若干个可运行的作业,并为 这些被选中的作业分配所需的系统资源。对被选中运行的作业必须按照它们各自的作业说明书 规定的步骤进行控制。 采

17、用先来先服务算法算法模拟设计作业调度程序。 (1) 、作业调度程序负责从输入井选择若干个作业进入主存,为它们分配必要的资源,当它们 能够被进程调度选中时,就可占用处理器运行。作业调度选择一个作业的必要条件是系统中现 有的尚未分配的资源可满足该作业的资源要求。但有时系统中现有的尚未分配的资源既可满足 某个作业的要求也可满足其它一些作业的要求,那么,作业调度必须按一定的算法在这些作业 中作出选择。先来先服务算法是按照作业进入输入井的先后次序来挑选作业,先进入输入井的 作业优先被挑选,当系统中现有的尚未分配的资源不能满足先进入输入井的作业时,那么顺序 挑选后面的作业。 (2) 假定某系统可供用户使用

18、的主存空间共100k,并有 5 台磁带机。 3) 流程图 : 4) 源程序 : #include #include #include #define getpch(type) (type*)malloc(sizeof(type) #define NULL 0 int j=0; int n,i; /n为需要输入的作业数量 float T1=0,T2=0; /初始化周转时间 , 带权周转时间 . int times=0; /初始化开始运行时间 int freesa=100,disksa=5; /预定内存的大小为100k, 磁带数量为 5 个. struct jcb /作业控制块 char user

19、name10; /用户名 char name10; /作业名 int reachtime; /作业到达时间 int starttime; /作业开始时间 int runtime; /已经运行了的时间 int needtime; /作业需要运行的时间 int frees; /作业要占用的内存 int disks; /作业所需磁带 int finishtime; /作业完成时间 float cycletime; /作业周转时间 float cltime; /作业带权周转时间 char state; /作业状态 struct jcb *next; /结构体指针 *ready=NULL,*start=

20、NULL,*p,*q,*r,*s,*t; typedef struct jcb JCB; void inital() /建立作业控制块队列 , 先将其排成先来先服务的模式队列 int i; printf(“n输入作业数 :“); scanf(“%d“, for(i=0;iusername); printf(“输入作业名 :“); scanf(“%s“,p-name); getch(); p-reachtime=i; printf(“作业默认到达时间 :%d“,i); printf(“n输入作业要运行的时间 :“); scanf(“%d“, printf(“输入作业运行要占用的内存:“); sc

21、anf(“%d“, printf(“输入作业运行所需磁带 :“); scanf(“%d“, p-runtime=0; p-state=W; p-next=NULL; if(ready=NULL) ready=q=p;/先将其按到达的先后顺序排成后备序列 else q-next=p; q=p; int space() /计算内存中作业的个数 int l=0; JCB* pr=start; while(pr!=NULL) l+; pr=pr-next; return(l); void apply() /把符合条件的作业调用内存, 并给他们分配资源 , int len; p=ready; while

22、(p!=NULL) if(p-freesdisksfrees; disksa-=p-disks; r=p; p=p-next; if(r=ready) /先将符合条件的作业从队列中分离出来 ready=r-next; r-next=NULL; else q=ready; while(q-next!=r) q=q-next; q-next=r-next; if(start=NULL) start=s=r; / 将其插到 start队列, else s-next=r; s=r; else p=p-next; len=space(); printf(“nt此时有 %d道作业在内存 nn“,len);

23、 void disp(JCB * pr) /* 建立作业显示函数 */ printf(“|%st“,pr-username); printf(“|%st“,pr-name); printf(“|%ct“,pr-state); printf(“|%dt“,pr-reachtime); printf(“|%dt“,pr-needtime); printf(“|%dt“,pr-runtime); printf(“|%dt“,pr-frees); printf(“|%dt“,pr-disks); printf(“n“); void check() /显示作业状况 printf(“n作 业 %s 于 完

24、 成 %d 个 作 业 后 运 行 完 毕 , 其 完 成 后 的 情 况:“,q-name,j); j+; printf(“n用户名 * 作业名 * 状态* 到达时间 * 需运行时间 * 已运行时 间*需占用内存 *需磁带数量 n“); disp(q); s=start; printf(“ntt*当前进入内存的作业状态 *“); printf(“n用户名 * 作业名 * 状态* 到达时间 * 需运行时间 * 已运行时 间*需占用内存 *需磁带数量 n“); while(s!=NULL) disp(s); s=s-next; r=ready; printf(“*nntt*当前后备作业表中作业的

25、状态*“); printf(“n用户名 * 作业名 * 状态* 到达时间 * 需运行时间 * 已运行时 间*需占用内存 *需磁带数量 n“); while(r!=NULL) disp(r); r=r-next; void running() /运行作业 for(t=start;t!=NULL;) start=t-next; q=t; q-next=NULL; q-state=R; q-runtime+; t=start; times+; if(q-runtime=q-needtime) q-finishtime=times; q-starttime=q-finishtime-q-needtim

26、e; q-cycletime=q-finishtime-q-reachtime; q-cltime=(q-cycletime)/(q-needtime); T1+=q-cycletime; T2+=q-cltime; freesa+=q-frees; disksa+=q-disks; check();/调用 check() 显示正在运行的 , 就绪的以及后备的作业信息 free(q); /释放作业 apply(); /分配作业 getch(); else for(s=start;s-next!=NULL;) s=s-next; s-next=q; main() /主函数 int m; prin

27、tf(“nntt*ttn“); printf(“tttt实验三 (2) 多道作业调度 n“); printf(“tt*ttn“); printf(“ntt1.多道作业调度演示 .“); printf(“ntt0.退出程序 “); printf(“nttt选择所要的操作 :“); printf(“nnnttttt计算机学院软件四班 n“); printf(“ttttt蓝小花 n“); printf(“ttttt3204007102n“); printf(“ttttt完成日期: 2006 年 12 月“); scanf(“%d“, switch(m) case 1: system(“cls“);

28、inital(); apply(); running(); getch(); system(“cls“); main(); break; case 0: system(“cls“); break; default: system(“cls“); main(); 5) 调试结果 : 1) 界面跟前面的其他几个实验的界面大同小异, 这里就不在重复出现界面. 下面输出的 是作业的初始信息 : 2) 调度作业 , 此时的作业情况如下 : 3) 按回车键 , 相当于作业继续调度 , 如下: 4) 重复 3,直至作业运行结束 ; 四. 思考题: 1. 写出每种算法的调度策略,最后比较各种算法的优缺点。 答

29、: FCFS算法总是把处理机分配给最先进入就绪队列的进程,一个进程一旦分得处理机, 便执行下去,直到该进程完成或阻塞时,才释放处理机。 优点 : 实现简单 . 缺点 : 没考虑进程的优先级 SJF算法从就绪队列中选出“下一个CPU执行期”最短的进程,为之分配处理机。 该算法虽可获得较好的调度性能,但难以准确地知道下一个CPU执行期,而只能根 据每一个进行的执行历史来预测。 HRN算法既照顾了短作业, 又照顾了作业顺序, 不会使长作业长期得不到运行, 但调度 前 , 必须计算响应比, 增加了系统的开销. 2. 选择调度算法的依据是什么? 答: 面向用户的准则:周转时间短;响应时间快;截止时间的保证;优先权准则 面向系统的准则:系统吞吐量高;处理机利用率好;各类资源的平衡利用 五. 心得体会 每个人对作业调度的算法都存在着一定的理解, 这也就是很多同学的算法实现不同的原因. 可能是自己理解的不够透彻, 我总觉得自己的实验不够完善, 还有 , 可能是自己掌握c 语言还不 够深 , 总觉得自己的想法与实现的算法存在着很大差距. 希望通过更多的实验, 让自己有更大的 提高 .

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1