一、实验内容
在windows系统中,编写扯程序实现对独占设备的分配与回收的模拟,该程序中包括;建立设备类表和设备表、分配设备和回收设备的函数。
二、实验准备
在多道程序环境下, 对于独占设备, 应采用独享分配策略, 即将一个设备分配给进程后, 便由该进程独占, 直至该进程完成或释放该设备, 然后系统才能再将该设备分配给其他进程使用 。在实验中, 通过模拟方法实现对独占设备的分配和回收。
在操作系统中, 通常要通过表格记录相应设备状态等, 以便进行设备分配。 进行设备分配时所需的数据结构(表格)有设备类表和设备控制表等。设备类表记录系统中全部设备的情况,每个设备类占一个表目,包括:设备类.想、设各标识符、设备驱动程序人口、拥有设备数量、可分配设备数量、设备表起始地城等,如表5 -1 所示 。
系统为每一个设备都配置了一张设备控制表, 用手记录本设备的情况 。 每一设备类占一个表目,包括:设备状态、是否分配、 占有作业名等,如表5 - 2所示。
作业申请某设备时, 先查 “设备类表”, 如果该类设备的拥有设备数量满足申请要求 则从设备类表中得到该类设备的设备表起始地址, 然后找到 “设备控制表” 中该类设备的起始地址,依次査询该类设备的表项,找到设备状态是“好”且没有被分配的设备分配给作业.分配设备的过程中要修改“设备类表”中可分配设备数量,并且把“设备控制表”中设备“是否分配”项更改为“是”,并填写占有作业名和相对号。
设备回收时,系统首先査看“设备控制表”,找到需要释放的设备,将该设备“是否分配”项更改为“否”,然后在“设备类表”中将“可使用数量”增加1。
表5 - 1 设备类表
设备类 拥有设备数量 可分配设备数量 起始地址
input 5 2 2
printer 4 3 5
表5-2 设备控制表
起始地址 设备状态 是否分配 占有作业名 相对号
11 好/坏 是/否 job 1
三、实验截图
- 死程序,数据初始化已经固定。
- 分配设备
- 回收设备
四、实验代码
#include <iostream>
#include <string.h>
#include <windows.h>
using namespace std;
//设备管理实验 设备类别3 最大拥有量4
class equip { //设备控制
public:
int id; //起始地址
int state; //状态
int isUse; //是否使用
string nameUs; //占用者
int idIn; //相对号
};
class equiptype{ //设备类别
public:
string name; //设备类型
int num; //设备数量
int canUse; //可用数量
int startNo; //起始地址
equip B[4];
};
equiptype A[3];
void init(){
A[0].name="input";
A[0].num=2;
A[0].canUse=2;
A[0].startNo=0;
A[1].name="print";
A[1].num=3;
A[1].canUse=3;
A[1].startNo=2;
A[2].name="disk";
A[2].num=4;
A[2].canUse=4;
A[2].startNo=5;
for(int i=0;i<3;i++){
for(int j=0;j<A[i].num;j++){
A[i].B[j].id=A[i].startNo;
A[i].B[j].state=1;
A[i].B[j].isUse=0;
A[i].B[j].nameUs="";
A[i].B[j].idIn=0;
}
}
}
void disp(){
cout<<"设备类别\t设备数量\t可分配数量\t设备起始地址"<<endl;
for(int i=0;i<3;i++){
cout<<"------------------------------------------------------------"<<endl;
cout<<A[i].name<<"\t\t"<<
A[i].num<<"\t\t"<<
A[i].canUse<<"\t\t"<<
A[i].startNo<<endl;
}
cout<<endl;
cout<<"绝对号\t状态\t分配态\t占有者\t相对号"<<endl;
int sum=0;
for(int i=0;i<3;i++){
for(int j=0;j<A[i].num;j++){
cout<<"--------------------------------------"<<endl;
cout<<sum<<"\t"<<
A[i].B[j].state<<"\t"<<
A[i].B[j].isUse<<"\t"<<
A[i].B[j].nameUs<<"\t"<<
A[i].B[j].idIn<<endl;
sum++;
}
}
}
void disbribute(){//建议作业名不超过8位字符
cout<<"作业名\t需设备\t相对号"<<endl;
string work;string machine;int number;
cin>>work>>machine>>number;
for(int i=0;i<3;i++){
if(machine==A[i].name){
for(int j=0;j<A[i].num;j++){
if(A[i].B[j].isUse==0&&number==j+1){
A[i].B[j].isUse=1;
A[i].canUse--;
A[i].B[j].nameUs=work;
A[i].B[j].idIn=number;
cout<<"..."<<work<<"已分配"<<A[i].name<<
"_"<<A[i].B[j].idIn<<endl;
return;
}
}
}
}
cout<<"分配失败!"<<endl;
}
void recovery(){
cout<<"绝对号\t"<<endl;
int number;
cin>>number;
int sum=0;
for(int i=0;i<3;i++){
for(int j=0;j<A[i].num;j++){
if(number==sum){
A[i].B[j].isUse=0;
A[i].canUse++;
A[i].B[j].nameUs="";
A[i].B[j].idIn=0;
cout<<"..."<<"["<<sum<<"]"<<A[i].name<<"已回收"<<endl;
return;
}else{
sum++;
}
}
}
cout<<"回收失败!"<<endl;
}
int main()
{
init();
while(1){
cout<<"**********************************************"<<endl;
cout<<"0.退出系统 1.分配设备 2.回收设备 3.显示信息"<<endl;
cout<<"**********************************************"<<endl;
cout<<"输入操作编号";
int a;
cin>>a;
switch(a){
case 0:
return 0;
break;
case 1:
disbribute();
break;
case 2:
recovery();
break;
case 3:
disp();
break;
default:
cout<<"输入错误!重新输入!\n"<<endl;
break;
}
}
return 0;
}