作业调度实验报告_第1页
作业调度实验报告_第2页
作业调度实验报告_第3页
作业调度实验报告_第4页
作业调度实验报告_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

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

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

4、h> #include <conio.h> #define getpch(type) (type*)malloc(sizeof(type) #define NULL 0int 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; /作业周

5、转时间 float cltime; /作业带权周转时间 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"); prin

6、tf("tttttn"); printf("ttttt完成日期:2006年11月17号"); printf("nnntt请输入任意键进入演示过程n"); getch();void inital() /建立作业控制块队列,先将其排成先来先服务的模式队列int i;printf("n输入作业数:");scanf("%d",&n);for(i=0;i<n;i+) p=getpch(JCB); printf("n输入作业名:"); scanf("%s"

7、;,p->name); getch(); p->reachtime=i; printf("作业默认到达时间:%d",i); printf("n输入作业要运行的时间:"); scanf("%d",&p->needtime); p->state='W' p->next=NULL; if(ready=NULL) ready=q=p; else q->next=p; q=p; void disp(JCB* q,int m) /显示作业运行后的周转时间及带权周转时间等 if(m=3)

8、/显示高响应比算法调度作业后的运行情况 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); g

9、etch(); else / 显示先来先服务,最短作业优先算法调度后作业的运行情况 printf("n作业%s正在运行,估计其运行情况:n",q->name); printf("开始运行时刻:%dn",q->starttime); printf("完成时刻:%dn",q->finishtime); printf("周转时间:%fn",q->cycletime); printf("带权周转时间:%fn",q->cltime); getch(); void runnin

10、g(JCB *p,int m) /运行作业 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+p->needtime; p->cycletime=(float)(

11、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' printf("n%s has been finished!npress any key to continue.n",p->name); free(p); /

12、释放运行后的作业 getch();void super() /计算队列中作业的高响应比 JCB *padv; padv=ready; do if(padv->state='W'&&padv->reachtime<=times) padv->super=(float)(times-padv->reachtime+padv->needtime)/padv->needtime padv=padv->next; while(padv!=NULL);void final() /最后打印作业的平均周转时间,平均带权周转时间 f

13、loat 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(int m) /高响应比算法 JCB *min; int i,iden; system("cls"); inital(); for(i=0;i<n;i+) p=min=ready;iden=1; super(); do if(p->

14、state='W'&&p->reachtime<=times) if(iden) min=p;iden=0; else if(p->super>min->super) min=p; p=p->next; while(p!=NULL); if(iden) i-;times+; /printf("ntime=%d:tno JCB submib.wait.",time); if(times>1000)printf("nruntime is too long.error.");getch(

15、); else running(min,m); /调用running()函数 /for final(); /调用running()函数void sjf(int m) / 最短作业优先算法 JCB *min; int i,iden; system("cls"); inital(); for(i=0;i<n;i+) p=min=ready;iden=1; do if(p->state='W'&&p->reachtime<=times) if(iden) min=p;iden=0; else if(p->needtim

16、e<min->needtime) min=p; p=p->next; while(p!=NULL) ; if(iden) i-; /printf("ntime=%d:tno JCB submib.wait.",time); times+; if(times>100)printf("nruntime is too long.error");getch(); else running(min,m); /调用running()函数 /for final(); /调用running()函数void fcfs(int m) /先来先服务算法

17、 int i,iden; system("cls"); inital(); for(i=0;i<n;i+) p=ready;iden=1; do if(p->state='W'&&p->reachtime<=times) iden=0; if(iden)p=p->next; while(p!=NULL&&iden) ; if(iden) i-; printf("n没有满足要求的进程,需等待"); times+; if(times>100)printf("n时间过

18、长");getch(); else running(p,m); /调用running()函数 final(); /调用running()函数void mune() int m; system("cls"); printf("nntt*ttn"); printf("tttt作业调度演示n"); printf("tt*ttn"); printf("nnnttt1.先来先服务算法."); printf("nttt2.最短作业优先算法."); printf("nt

19、tt3.响应比高者优先算法"); printf("nttt0.退出程序."); printf("nntttt选择所要操作:"); scanf("%d",&m);switch(m) case 1: fcfs(m); getch(); system("cls"); mune(); break; case 2: sjf(m); getch(); system("cls"); mune(); break; case 3: hrn(m); getch(); system("cl

20、s"); mune(); break; case 0: system("cls"); break; default: printf("选择错误,重新选择."); getch(); system("cls"); mune(); main() /主函数 inize(); mune();5)调试结果: 1.选择操作的界面 2.输入操作初始信息: 3.先来先服务算法作业调度结果: (调度顺序:a->b->c->d->e) 4.最短作业优先算法作业调度结果 (调度顺序: a->d->b->e-

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

22、干个作业进入主存,为它们分配必要的资源,当它们能够被进程调度选中时,就可占用处理器运行。作业调度选择一个作业的必要条件是系统中现有的尚未分配的资源可满足该作业的资源要求。但有时系统中现有的尚未分配的资源既可满足某个作业的要求也可满足其它一些作业的要求,那么,作业调度必须按一定的算法在这些作业中作出选择。先来先服务算法是按照作业进入输入井的先后次序来挑选作业,先进入输入井的作业优先被挑选,当系统中现有的尚未分配的资源不能满足先进入输入井的作业时,那么顺序挑选后面的作业。(2) 假定某系统可供用户使用的主存空间共100k,并有5台磁带机。3)流程图: 4)源程序: #include <std

23、io.h>#include <stdlib.h>#include <conio.h>#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 username10; /用户名 char name

24、10; /作业名 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=NULL,*p,*q,*r,*s,*t;typ

25、edef struct jcb JCB;void inital() /建立作业控制块队列,先将其排成先来先服务的模式队列int i;printf("n输入作业数:");scanf("%d",&n);for(i=0;i<n;i+) p=getpch(JCB); printf("n输入用户名:"); scanf("%s",p->username); printf("输入作业名:"); scanf("%s",p->name); getch(); p->

26、;reachtime=i; printf("作业默认到达时间:%d",i); printf("n输入作业要运行的时间:"); scanf("%d",&p->needtime); printf("输入作业运行要占用的内存:"); scanf("%d",&p->frees); printf("输入作业运行所需磁带:"); scanf("%d",&p->disks); p->runtime=0; p->sta

27、te='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(p!=NULL) if(p->frees<=freesa&&p->

28、disks<=disksa) freesa-=p->frees; 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;

29、 len=space(); printf("nt此时有%d道作业在内存nn",len);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("|

30、%dt",pr->runtime); printf("|%dt",pr->frees); printf("|%dt",pr->disks);printf("n");void check() /显示作业状况 printf("n作业%s于完成%d个作业后运行完毕,其完成后的情况:",q->name,j); j+; printf("n用户名*作业名*状态*到达时间*需运行时间*已运行时间*需占用内存*需磁带数量 n"); disp(q); s=start; print

31、f("ntt*当前进入内存的作业状态*"); printf("n用户名*作业名*状态*到达时间*需运行时间*已运行时间*需占用内存*需磁带数量 n"); while(s!=NULL) disp(s); s=s->next; r=ready; printf("*nntt*当前后备作业表中作业的状态*"); printf("n用户名*作业名*状态*到达时间*需运行时间*已运行时间*需占用内存*需磁带数量 n"); while(r!=NULL) disp(r); r=r->next; void running

32、() /运行作业 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->needtime; q->cycletime=q->finishtime-q->reachtime; q->cltime=(q-

33、>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; printf("nntt*ttn"); printf("tttt实验三(2) 多道作业调度n");

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论