操作系统 | 实验六 设备管理

一、实验目的

①理解设备管理的概念和任务。
②掌握独占设备的分配、回收等主要算法的原理并编程实现。

二、实验内容

在Windows系统中,编写程序实现对独占设备的分配与回收的模拟,该程序中包括:建立设备类表和设备表、分配设备和回收设备的函数。

三、数据结构

3.1 数据结构

struct EquipType
{
	char type[10];//设备类名
	int count;//拥有设备数量
	int remain;//现存的可用设备数量
	int address;//该类设备在设备表中的起始地址
}equip_type[N]; //设备类表定义,假设系统有n个设备类型

struct Equipment
{
	int number;//设备绝对号
	bool status;//设备状态可否使用
	bool isRemain;//设备是否已分配
	char jobName[10];//占有设备的作业名称
	int lnumber;//设备相对号
}equipment[M]; //设备表定义,假设系统有m个设备

3.2 函数以及功能

函数名称功能描述
bool Allocate(char* job,char* type,int mm)设备分配函数
bool Reclaim(char* job,char* type)设备回收函数
void DisplayInfo()信息作者展示
int main()main函数

四、程序流程图

在这里插入图片描述

五、实验代码

#include <stdio.h>
#include <string.h>
#define N 3//假设系统有3类设备
#define M 5//假设系统有5个设备
#define SYSINFO "设备管理演示" // 系统信息 
#define AUTHOR "Yrani - 依然
" //作者 

/**
* 	@Author: Yrani - 依然
* 	@Date: 2022-05-09 20:20:17
* 	@LastEditTime: 2022-05-10 15:20:00
* 	@keywords: 设备管理
**/

struct EquipType
{
	char type[10];//设备类名
	int count;//拥有设备数量
	int remain;//现存的可用设备数量
	int address;//该类设备在设备表中的起始地址
}equip_type[N]; //设备类表定义,假设系统有n个设备类型

struct Equipment
{
	int number;//设备绝对号
	bool status;//设备状态可否使用
	bool isRemain;//设备是否已分配
	char jobName[10];//占有设备的作业名称
	int lnumber;//设备相对号
}equipment[M]; //设备表定义,假设系统有m个设备


//信息展示
void DisplayInfo()
{
	printf("★★★★★★★★★★★★★★★★★★\n");
	printf("★☆☆☆ |  %s  | ☆☆☆★\n",SYSINFO);
	printf("★☆☆☆ | @Author:%s | ☆☆☆★\n",AUTHOR);
	printf("★☆☆☆ ------------------ ☆☆☆★\n");
	printf("★☆☆☆ |    1、分配	 |  ☆☆☆★\n");
	printf("★☆☆☆ |    2、回收	 |  ☆☆☆★\n");
	printf("★☆☆☆ |    3、显示 	 |  ☆☆☆★\n");
	printf("★☆☆☆ |    0、退出	 |  ☆☆☆★\n");
	printf("★☆☆☆ ------------------ ☆☆☆★\n");
	printf("★★★★★★★★★★★★★★★★★★\n");

}

//设备分配函数
bool Allocate(char* job,char* type,int mm)
{
	int i = 0, t;
	//查询该类设备
	while(i < N && strcmp(equip_type[i].type,type)!=0) i++;
	//没有找到该类设备
	if(i >= N)
	{
		printf("无该类设备,设备分配请求失败\n");
		return false;
	}
	//所需设备现存的可用数量不足
	if(equip_type[i].remain < 1)
	{
		printf("该类设备数量不足,设备分配请求失败\n");
		return false;
	}
	//得到该类设备在设备表中的起始地址
	t = equip_type[i].address;
	while(!(equipment[t].status == true&&equipment[t].isRemain == false))
	{
		t++;
	}
	//填写作业名、设备相对号,状态
	equip_type[i].remain--;
	equipment[t].isRemain = true;
	strcpy(equipment[t].jobName,job);
	equipment[t].lnumber = mm;
	return true;
}


//设备回收函数
bool Reclaim(char* job,char* type)
{
	int i = 0,t,j,k=0,nn;
	while(i < N && strcmp(equip_type[i].type,type) != 0)i++;
	//没有找到该类设备
	if(i >= N)
	{
		printf("无该类设备,设备分配请求失败");
		return false;
	}
	//得到该类设备在设备表中的起始地址
	t = equip_type[i].address;
	//得到该设备的数量
	j = equip_type[i].count;
	nn = t+j;
	//修改设备为可使用状态和该类型设备可用数量
	for(; t < nn; t++)
	{
		if(strcmp(equipment[t].jobName,job)==0 && equipment[t].isRemain == true)
		{
			equipment[t].isRemain = false;
			k ++;
		}
	}
	
	equip_type[i].remain = equip_type[i].remain + k;
	
	if(k == 0)
	{
		printf("作业没有使用该类设备");
		return true;
	}

}

int main()
{
	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 < M; i++)
	{
		equipment[i].number = i;
		equipment[i].status = true;
		equipment[i].isRemain = false;
	}
	
	while(1)
	{
		DisplayInfo();
		printf("请选择功能项:\n");
		scanf("%d", &choose);
		switch(choose)
		{
			case 0:
				return 0;
			case 1:
				printf("请输入作业名、作业所需设备类和设备相对号\n");
				scanf("%s%s%d",job,type,&mm);
				Allocate(job,type,mm);//分配设备
				break;
			case 2:
				printf("请输入作业名和作业要归还的设备类型\n");
				scanf("%s%s",job,type);
				Reclaim(job,type);//回收设备
				break;
			case 3:
				printf("\n输出设备类表:\n");
				printf("设备类型\t设备数量\t空闲设备数量\n");
				for(i=0; i < N; i++)
				{
					printf("%8s%10d%18d\n",equip_type[i].type,equip_type[i].count,equip_type[i].remain);
				}
				
				printf("---------------------------------------------------------------------------\n");
				printf("输出设备表:\n");
				printf("绝对号\t状态 是否分配\t占用作业名\t相对号\n");
				for(i = 0; i < M; i++)
				{
					printf("%3d%8d%7d%14s%11d\n",equipment[i].number,equipment[i].status,equipment[i].isRemain,equipment[i].jobName,equipment[i].lnumber);
				}
				
				break;
			default:
				return 0;
		}
	}

	return 0;
}

六、实验结果

1. 设备分配及回收主界面
在这里插入图片描述

2. 显示设备类、拥有的设备数量、及空闲设备数量
在这里插入图片描述
3. 设备分配(作业名:键盘 设备类:input,相对号:101)
在这里插入图片描述

4. 显示设备查看是否分配成功(input设备类型空闲设备量剩余1)
在这里插入图片描述

5. 回收设备(作业名:键盘 设备类:input,相对号:101)
在这里插入图片描述
6. 显示设备信息查看是否回收成功(input设备类型空闲设备量已变回2)
在这里插入图片描述
7. 进行设备的分配(作业名:打印机,设备类:printer,相对号:102)并显示设备信息
在这里插入图片描述

8. 退出
在这里插入图片描述

七、实验体会总结

总结与体会:

  • 此次实验思路较为容易理解,也很好调试,相较于前一次实验,难度降低很多。
  • 此次实验的目的是实现设备管理,设备管理包概括设备管理的概念和任务,以及独占设备的分配,和回收算法的实现。
  • 通过此次实验拓展了我对设备管理的认识,加深了对独占设备的分配,以及回收算法的理解与掌握。
  • 其中设备管理实现了设备的分配、回收、显示。
  • 分配设备就会使得设备类型被分配掉一个,设备类型为input的空闲设备数量减少1。
  • 回收设备以后相应的资源数量就会被归还回来,从而使得数量+1
  • 显示就是需要把变量的信息打印出来,进行展示,更为直观。
  • 代码的规范程度越来越高了!一定要坚持下去,写出更漂亮的代码!
  • 14
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值