实验六 设备管理
【实验目的】
①理解设备管理的概念和任务。
②掌握独占设备的分配、回收等主要算法的原理并编程实现。
【实验内容】
在Windows系统中,编写程序实现对独占设备的分配与回收的模拟,该程序中包括:建立设备类表和设备表、分配设备和回收设备的函数。
【实验步骤】
1.1数据结构
#define NXT 3//假设系统有3类设备
#define MSB 7//假设系统有5个设备
struct {
char type[10];//设备类名
int count;//拥有设备数量
int remain;//现存的可用设备数量
int address;//该类设备在设备表中的起始地址
} equip_type[NXT]; //设备类表定义,假设系统有n个设备类型
struct {
int number;//设备绝对号
bool status;//设备状态可否使用
bool IsRemain;//设备是否已分配
char jobname[10];//占有设备的作业名称
int lnumber;//设备相对号
} equipment[MSB]; //设备表定义,假设系统有m个设备
1.2程序流程
1.3试验代码
#include<stdio.h>
#include<string.h>
#define NXT 3//假设系统有3类设备
#define MSB 7//假设系统有5个设备
struct {
char type[10];//设备类名
int count;//拥有设备数量
int remain;//现存的可用设备数量
int address;//该类设备在设备表中的起始地址
} equip_type[NXT]; //设备类表定义,假设系统有n个设备类型
struct {
int number;//设备绝对号
bool status;//设备状态可否使用
bool IsRemain;//设备是否已分配
char jobname[10];//占有设备的作业名称
int lnumber;//设备相对号
} equipment[MSB]; //设备表定义,假设系统有m个设备
void zyy()
{
printf("\n***********|______________________________|***********");
printf("\n***********| 实验六 设备管理 |***********");
printf("\n***********| 创建人:夕草 |***********");
printf("\n***********| 学号:210344444444 |***********");
printf("\n***********| 时间:2021.12.4 |***********");
printf("\n***********|______________________________|***********\n");
}
//*********************************函数说明************************************
//设备分配函数
//*****************************************************************************
int allocate(char l[],char type[],int mm)//设备分配函数
{
int i=0,t; /* 查询该类设备 */
while(i<NXT&&strcmp(equip_type[i].type,type)!=0) i++;
if(i>=NXT) /* 没有找到该类设备 */
{
printf(" 无该类设备 ,设备分配失败 !");
return(false);
}
else {
printf(" 存在该类设备! ");
}
if(equip_type[i].remain<1) /* 所需设备现存可用台数不足 */
{
printf(" 该类设备不足,分配失败 !");
return(false);
}
else {
printf(" 该类设备充足! ");
}
t=equip_type[i].address; /* 取出该类设备在设备表中的起始地址 */
while(!(equipment[t].status==1 && equipment[t].IsRemain==0))
t++; /* 填写作业名、 相对号, 状态改为已分配*/
equip_type[i].remain--;
equipment[t].IsRemain = 1;
strcpy(equipment[t].jobname,l);
equipment[t].lnumber = mm;
printf(" 分配成功! ");
}
//*****************函数说明************************************
//设备回收函数
//*****************************************************************************
int reclaim(char l[],char type[])//设备回收函数
{
int i=0,t,j,k,z;
while(i<NXT&&strcmp(equip_type[i].type,type)!=0) i++;
if(i>=NXT) /* 没有找到该类设备*/
{
printf(" 无该类设备 ,设备回收失败 !");
return(false);
}
else printf(" 存在该类设备! ");
t = equip_type[i].address; /* 取出该类设备在设备表中的起始地址 */
j = equip_type[i].count; /* 取出该类设备的数量 */
k = 0;
z = t+j;
for(; t<z; t++)
if(strcmp(equipment[t].jobname,l)==0&&equipment[t].IsRemain == true)
{
equipment[t].IsRemain = false;
k++;
}
equip_type[i].remain = equip_type[i].remain+k;
if(k==0)
{
printf(" 工作台尚未使用这种设备类别! \n");
}
printf(" 回收成功! \n");
}
int main() {
zyy();
char job[10];
int i, mm, choose;
char type[10];
strcpy(equip_type[0].type, "input"); //设备类型:输入设备
equip_type[0].count = 2;
equip_type[0].remain = 2;
equip_type[0].address = 0;
strcpy(equip_type[1].type, "printer");
equip_type[1].count = 3;
equip_type[1].remain = 3;
equip_type[1].address = 2;
strcpy(equip_type[2].type, "camera");
equip_type[2].count = 4;
equip_type[2].remain = 4;
equip_type[2].address = 5;
for (i = 0; i < 7; i++)
{
equipment[i].number = i;
equipment[i].status = 1;
equipment[i].IsRemain = false;
}
while (1){
printf("\n0---退出,1---分配,2---回收,3---显示");
printf("\n请选择功能项:");
scanf("%d", &choose);
switch (choose) {
case 0:
return 0;
case 1:
printf("请输入作业名、作业所需设备类和设备相对号");
scanf("%s%s%d", job, type, &mm);
allocate(job, type, mm); //分配设备
break;
case 2:
printf("请输入作业名和作业要归还的设备类型");
scanf("%s%s", job, type);
reclaim(job, type); //回收设备
break;
case 3:
printf("输出设备类表:\n");
printf("-----------------------------------------------------------------\n");
printf("***** 设备类型\t 拥有设备数量\t可分配设备数量\t起始地址 *****\n");
for (i = 0; i < NXT; i++)
{
printf("*****%10s\t%10d\t%10d %10d\t *****\n", equip_type[i].type, equip_type[i].count,equip_type[i].remain,equip_type[i].address);
}
printf("----------------------------------------------------------------- \n");
printf("输出设备表:\n");
printf("-------------------------------------------------------------------------------------\n");
printf("***** 绝对号\t 设备状态\t 是否分配\t 占用作业名\t\t相对号 *****\n");
for (i = 0; i < MSB; i++) {
printf("*****%3d\t%7d\t \t%8d\t%10s\t\t %d\t*****\n", equipment[i].number, equipment[i].status,
equipment[i].IsRemain, equipment[i].jobname, equipment[i].lnumber);//
}
printf("-------------------------------------------------------------------------------------\n");
break;
default:
return 0;
}
}
}
1.4试验结果
分配功能与查询
回收功能
【实验体会总结】
本次实验拟在模仿设备管理,各i/o设备在操作系统中如何实现调用与分配,此次实验让我更深层测的明白的此操作的过程。关于代码方面这次使用的数据结构都是使用的数组,也算是加强了对数组的认识。