操作系统 批处理系统作业调度实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统批处理系统作业调度实验报告批处理系统的作业调度实验报告
年级 2009级学号 2009443004 姓名郭占强成绩专业生物信息学实验地点生科楼409 指导教师王硕实验项目批处理系统的作业调度实验日期 2011年11月18日
一、实验目的
加深对作业概念的理解;
深入了解批处理系统如何组织作业、管理作业和调度作业。二、实验要求编写程序完成批处理系统中的作业调度,要求采用响应比高者优先的作业调度算法。实验具
体包括:首先确定作业控制块的内容,作业控制块的组成方式;然后完成作业调度;最后编写
主函数对所作工作进程测试。
三、实验原理:
操作系统根据允许并行工作的道数和一定的算法从系统中选取若干作业把它们装入主存储器,使它们有机会获得处理器运行。
四、实验程序设计
#include "string.h"
#include
#include
#define n 10 /*假定系统中可容纳的作业数量为n*/
typedef struct jcb
{char name[4]; /*作业名*/
int length; /*作业长度,所需主存大小*/
int printer; /*作业执行所需打印机的数量*/
int tape; /*作业执行所需磁带机的数量*/
int runtime; /*作业估计执行时间*/
int waittime; /*作业在系统中的等待时间*/
int next; /*指向下一个作业控制块的指针*/
}JCB; /*作业控制块类型定义*/
int head; /*作业队列头指针定义*/
int tape,printer;
long memory;
JCB jobtable[n]; /*作业表*/
int jobcount=0; /*系统内现有作业数量*/
shedule( )
- 1 -
/*作业调度函数*/
{float xk,k;
int p,q,s,t;
do
{p=head;
q=s=-1;
k=0;
while(p!=-1)
{ if(jobtable[p].length<=memory&&jobtable[p].tape<=tape&&jobtable[p] .printer<=printer)
{ /*系统可用资源是否满足作业需求*/
xk=(float)(jobtable[p].waittime)/jobtable[p].runtime;
if(q==0||xk>k) /*满足条件的第一个作业或者作业q的响应比小于作业p的响应比*/
{k=xk; /*记录响应比*/
q=p;
t=s;
}/*if*/
}/*if*/
s=p;
p=jobtable[p].next; /*指针p后移*/
}/*while*/
if(q!=-1)
{ if(t==-1) /*是作业队列的第一个*/
head=jobtable[head].next;
else
jobtable[t].next=jobtable[q].next;
/*为作业q分配资源:分配主存空间;分配磁带机;分配打印机*/
memory=memory-jobtable[q].length;
tape=tape-jobtable[q].tape;
printer=printer-jobtable[q].printer;
printf("选中作业的作业名:%s\n",jobtable[q].name);
}
}while(q!=-1);
}/*作业调度函数结束*/
main( )
{char name[4];
int size,tcount,pcount,wtime,rtime;
int p;
/*系统数据初始化*/
memory=65536;
tape=4;
printer=2;
head=-1;
printf("输入作业相关数据(以作业大小为负数停止输入):\n");
/*输入数据,建立作业队列*/
- 2 -
printf("输入作业名、作业大小、磁带机数、打印机数、等待时间、估计执行时间\n");
scanf("%s%d%d %d %d %d",name,&size,&tcount,&pcount,&wtime,&rtime);
while(size!=-1)
{/*创建JCB*/
if(jobcount else { printf("无法再创建作业\n"); break; } jobcount++; /*填写该作业相关内容*/ strcpy(jobtable[p].name,name); jobtable[p].length=size; jobtable[p].printer=pcount; jobtable[p].tape=tcount; jobtable[p].runtime=rtime; jobtable[p].waittime=wtime; /*挂入作业队列队首*/ jobtable[p].next=head; head=p; /* 输入一个作业数据*/ printf("输入作业名、作业大小、磁带机数、打印机数、等待时间、估计执行时间\n"); scanf("%s%d%d%d%d%d",name,&size,&tcount,&pcount,&wtime,&rtime); }/*while*/ shedule( ); /*进行作业调度*/ }/*main( )函数结束*/ 五、实验结果与分析 1. 本程序采用响应比高者优先算法进行作业调度。常用的作业调度算法还有先来先服务算 法、计算时间短的作业优先算法、优先数调度算法和均衡调度算法。 响应比高者优先算法可以同时考虑到每个作业的等待时间长短和估计需要执行时间长 短,从而选出响应比高的作业进行执行,但由于每次调度前要计算响应比,系统开销也随之