📄 os1.cpp
字号:
//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<<"\nCongratulations! "<<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 + -