⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os1.cpp.bak

📁 这是上完操作系统课时
💻 BAK
字号:
//os1.cpp--采用响应比高者优先的作业调度算法,进行批处理系统中的作业调度,
//编译IDE:C++ Builder 命令行下编译
//注:本实验中用了三个队列
//外存就绪队列(后备队列)head;内存就绪队列read;运行队列run
//处理机处理每一个作业的时间统一为3秒

#include <iostream.h>
#include <time.h>
#include <dos.h>

//#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<<"将所有满足条件的作业调入内存之后的系统信息:"<<endl;
		cout<<"jobcount="<<jobcount<<endl;
		cout<<"sysmemory="<<sysmemory<<endl;
		cout<<" sysprinter="<<sysprinter<<endl;
		cout<<"systape="<<systape<<endl;

		system("PAUSE");

		//批处理内存中所有的作业
		batrun();
		cout<<"批处理完内存中的所有作业后的系统信息:"<<endl;
		cout<<"runcount="<<runcount<<endl;
		cout<<"jobcount="<<jobcount<<endl;
		cout<<"sysmemory="<<sysmemory<<endl;
		cout<<"sysprinter="<<sysprinter<<endl;
		cout<<"systape="<<systape<<endl;

		system("PAUSE");

	}//for

	cout<<"Congratulations! "<<runcount<<" jobs haved run off"<<endl;
	system("PAUSE");

	return 0;
}

//手工初始化10个作业
void initialize(int n)
{
	void entercontent(int);	

	cout<<"注意:若提示输入的是数字,而输入的是字母或其它字符,则可能会导致死循环"<<endl;
	cout<<"请按提示输入10个要处理的作业的信息:"<<endl;
	for(int i=0; i<=n-1; i++){	//系统中的n个作业组成一个静态链表
		entercontent(i);	//输入作业i的各项内容
		jobtable[i].next=i+1;	//作业指针指向下一个作业
	}
	jobtable[n-1].next=-1;	//表尾的指针域为空,即不指向任单元

	head=0;	//head指针指向第一个作业
}

void entercontent(int i)
{
	//输入作业名
	cout<<"enter the JOBNAME of NO."<<i<<endl;
	cin>>jobtable[i].name;
	
	//输入作业长度,所需主存大小
	cout<<"enter the job's LENGTH(1~65536)"<<endl;
	cin>>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)"<<endl;
	cin>>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)"<<endl;
	cin>>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"<<endl;
	cin>>jobtable[i].runtime;

	//输入作业在系统中的等待时间
	cout<<"enter the WAITIME of the job during systems"<<endl;
	cin>>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<<"一轮循环之后选择的是作业"<<jobtable[q].name<<" 此时q="<<q<<endl;

}

//装入,并修改系统资源
void loadin()
{
			//从作业队列中摘取q
			if(q==head)	//q是作业队列中的第一个
				head=jobtable[head].next;
			else	//一般情况
				jobtable[t].next=jobtable[q].next;

			//为作业q分配资源
			sysprinter-=jobtable[q].printer;
			systape-=jobtable[q].tape;
			
			//输出作业名
			cout<<"输出作业的作业名 \""<<jobtable[q].name<<"\" 代替装入主存储器"<<endl;
			sysmemory-=jobtable[q].length;
			//装入内存的作业挂入内存就绪队列中
			if((ready.head==ready.tail)&&-1==ready.head&&-1==ready.tail)//内存就绪队列为空,则插入队列头
				ready.head=ready.tail=q; 					
			else{	//一般情况
				jobtable[ready.tail].next=q;
				ready.tail=q;
			}

			++jobcount;	//内存中作业数增加1			
}

//批处理内存就绪队列中的作业
void batrun()
{
	
	while(jobcount!=0){	//内存中还有作业	
		//摘取内存就绪队列中的第一个作业
		if(1==jobcount){	//内存中只有一个作业
			run=ready.head;
			ready.head=ready.tail=-1;	//内存就绪队列清空
		}
		else{	//一般情况
				run=ready.head;
				ready.head=jobtable[ready.head].next;
		}

		//运行,批处理的作业统一运行3秒
		cout<<"现在批处理作业"<<jobtable[run].name<<" please wait 3 seconds……"<<endl;
		for(int tmp=1; tmp<=3; ++tmp){
			cout<<"1 second"<<endl;
			sleep(1);
		}

		++runcount;	//运行作业数加1
		--jobcount;	//内存就绪队列中的作业数减1
		cout<<"The job "<<jobtable[run].name<<"run OVER!"<<endl;
		cout<<"Now, you haved batrun "<<runcount<<" jobs"<<endl;

		//修改系统资源
		sysmemory+=jobtable[run].length;
		sysprinter+=jobtable[run].printer;
		systape+=jobtable[run].tape;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -