批处理系统作业调度实验报告
批处理系统作业调度
一、实验目的
加深对作业概念的理解;
深入了解批处理系统如何组织作业、管理作业和调度作业;
二、实验要求
编写程序完成批处理系统中的作业调度,要求采用响应比高者优先的作业调度算法。实验具体包括:首先确定作业控制块的内容,作业控制块的组成方式;然后完成作业调度;最后编写主函数对所作工作进程测试。
三、实验原理:
操作系统根据允许并行工作的道数和一定的算法从系统中选取若干作业把它们装入主存储器,使它们有机会获得处理器运行,这项工作被称为“作业调度”。实现这部分功能的程序就是“作业调度程序”。
四、实验内容:编写程序完成批处理系统中的作业调度,要求采用响应比高
者优先的作业调度算法。实现具体包括:首先确定作业控制块的内容和组成方式;然后完成作业调度;最后编写主函数,对所做工作进行测试。
五、提示讲解: 作业调度的实现主要有两个问题:一个是如何将系统中的作
业组织起来;另一个是如何进行作业调度。为了将系统中的作业组织起来,需要为每个进入系统的作业建立档案以记录和作业相关的信息,例如,作业名、作业所需资源、作业执行时间、作业进入系统的时间、作业信息在存储器中的位置、指向下一个作业控制块的指针等信息。这个记录作业相关信息的数据块称为作业控制块(JCB ),并将系统中等待作业调度的作业控制块组织成一个队列,这个队列称为后备队列。当进行作业调度时,从后备队列中查找选择作业。由于实验中没有实际作业,作业控制块中的信息内容只使用了实验中需要的数据。作业控制块中首先应该包括作业名;其次是作业所需资源(内存大小、打印机的数量和磁带机的数量);采用响应比高者优先作业调度算法,为了计算响应比,还需要有作业的估计执行时间、作业在系统中的等待时间;另外,指向下一个作业控制块的指针必不可少。将作业控制块组织成一个队列,实验中采用静态链表的方式模拟作业的后备队列,作业队列头指针定义为:int *head;实验中,内存采用可移动的动态分区管理方法,即只要内存空闲区总和比作业大就可以满足作业对内存的需求;对打印机和磁带机这两种独占设备采用静态分配法,即作业执行前必须获得所需资源,并且执行完才归还。采用响应比高者优先调度算法进行调度时,必须计算出系统中所有满足必要条件作业的响应比,从中选择响应比最高的一个作业装入主存储器分配资源。由于是实验,所以就将作业控制块出队,并输出作业名代替装入处存储器,同时修改系统的资源数量。假设系统资源情况:主存64KB(Memory)(以KB为单位分配)、4台磁带
机(Tape)和2台打印机(Pinter)。
六、实验程序设计
#include "stdafx.h"
#include
using namespace std;
#include
#include "JCB.h"
class JCB
{
public:
private:
int name; int printer; int tape; int waittime; int runtime; int creat(int name, int length, int tape, int printer, int waittime, int runtime ); void shedule(JCB *head); JCB *next; JCB(); virtual ~JCB();
long length;
};
int JCB::creat(int name, int length, int tape, int printer, int waittime, int runtime) {
this->name=name;
this->tape=tape; this->waittime=waittime; this->runtime=runtime; this->length=length;
return 0;
}
void JCB::shedule(JCB *head)
{
JCB *p,*q; JCB *k1,*k2; long temp; int a; long memory=65536;
int tape=4;
int printer=2;
q=head; p=q->next; coutlength>memory||p->tape>tape||p->printer>printer) {
} k1=p; p=p->next ; delete k1; q->next=p; else { temp= (p->runtime+p->waittime )/p->runtime; if(anext; k2=p; } } if(k2!=NULL) { coutname
p=k2;
k2=k2->next ; delete p; k1->next=k2; } q=head; p=q->next; }
}
int main()
{
JCB *head; JCB *p; head=new JCB;
head->next=NULL;
p=head; int a=0; int name; int printer; int tape; int waittime; int runtime; int length; cout
cin >> name;
cin >> length;
cin >> tape;
cin >> printer;
cin >> waittime;
cin >> runtime;
while(length>0)
{ p->next=new JCB; p=p->next;
coutnext=NULL; cin >> name;
cin >> length; if(length> tape; cin >> printer; cin >> waittime; cin >> runtime; }
head->shedule(head);
} return 0;
七、运行结果