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<<"一轮循环之后选择的是作业"<