www.pudn.com > 批处理系统的作业调度.rar > os1.cpp


//os1.cpp--采用响应比高者优先的作业调度算法,进行批处理系统中的作业调度, 
//编译IDE:C++ Builder 命令行下编译 
//注:本实验中用了三个队列 
//外存就绪队列(后备队列)head;内存就绪队列read;运行队列run 
//处理机处理每一个作业的时间统一为3秒 
 
#include  
#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;          				//作业控制块类型定义 
 
//存放作业控制块的区域 
JCB jobtable[10];			//作业表 
 
//三个队列的首指针 
int  head;	//指向后备队列的首指针,即外存就绪就绪首指针 
struct  
{ 
	int head; 
	int tail; 
}ready;		//指向内存就绪队列的头指针和尾指针 
int run;	//指向CPU正在运行的作业 
 
int  jobcount=0;	//系统内现有作业数量 
int  runcount=0;	//已运行的作业数量 
 
int s, p, kp;	//p指向当前正在操作计算的作业,s标识p的前一位置 
int t, q, kq;	//q指向满足条件的作业,t标识q的前一位置 
 
//设置系统所拥有的资源 
int sysmemory=64*1024, sysprinter=4, systape=2; 
 
void initialize(int);	//初始化某个时刻系统中各个作业的情况 
void selectHRjob(); 
void loadin();	//装入程序 
void batrun();	//批处理运行程序 
 
int main() 
{ 
		 
	initialize(10);	//手工初始化10个作业,且全部作业进入外存就绪队列中 
 
	system("PAUSE"); 
 
	for(;runcount<=9;){	//一共要处理10个作业 
		ready.head=ready.tail=-1;	// 
		bool tag=1;	//tag为真时表示还有作业可以调入内存 
		while(tag){	//在运行前将外存中所有符合两个条件的所有作业调入内存 
			selectHRjob();	//从后备队列中选择满足资源满足且响应比最高的作业 
			if(q!=-1)	//找到了q满足两个条件:系统资源满足且响应比最高 
				loadin();	//装入内存,并修改系统资源 
			else 
				tag=0;	//没有作业可以调入内存了,跳出 
		} 
 
		cout<<"将所有满足条件的作业调入内存之后的系统信息:"<>jobtable[i].name; 
	 
	//输入作业长度,所需主存大小 
	cout<<"enter the job's LENGTH(1~65536)"<>jobtable[i].length; 
	while(jobtable[i].length<=0||jobtable[i].length>sysmemory){	//输入正确性判断 
		cout<<"Enter error!"<<"\n请重新输入作业大小(1~65536):"; 
		cin>>jobtable[i].length; 
	} 
	 
	//输入作业执行行所需打印机的数量 
	cout<<"enter how many PRINTERS the job need(<=4)"<>jobtable[i].printer; 
	while(jobtable[i].printer>4){	//输入正确性判断 
		cout<<"Enter error!"<<"\n请重新输入作业需要的打印机数量(0~4台):"; 
		cin>>jobtable[i].printer; 
	} 
 
	//输入作业执行所需磁带机的数量 
	cout<<"enter how many TAPES the job need(<=2)"<>jobtable[i].tape; 
	while(jobtable[i].tape>2){		//输入正确性判断 
		cout<<"Enter error!"<<"\n请重新输入作业需要的磁盘带数量(0~2台):"; 
		cin>>jobtable[i].tape; 
	} 
 
	//输入作业估计执行时间 
	cout<<"enter the RUNTIME of the job"<>jobtable[i].runtime; 
 
	//输入作业在系统中的等待时间 
	cout<<"enter the WAITIME of the job during systems"<>jobtable[i].waittime; 
} 
 
//选择外存就绪队列中响应比最高的作业调入内存 
void selectHRjob() 
{ 
 
	p=head; 
	q=s=-1; 
	//循环一轮:从队列头找到队列尾 
	while(p!=-1){	 
			bool condition=jobtable[p].length<=sysmemory&&jobtable[p].printer<=sysprinter&& 
							jobtable[p].tape<=systape; 
			if(condition){	//系统可用资源满足作业要求 
				kp=jobtable[p].waittime/jobtable[p].runtime; 
				if(0==p||kp>kq){	//p是第一个满足条件的作业或作业p的响应比比作业q的响应比高 
					q=p; t=s; kq=kp; 
				} 
			} 
			 
			//指针p后移(1,condition为假; 2condition为真&&0==p||kp>kq) 
			s=p; 
			p=jobtable[p].next;	 
	} 
 
	cout<<"一轮循环之后选择的是作业"<