其他分享
首页 > 其他分享> > 操作系统之设备管理(独占设备的分配和回收模拟),实验这样手把手教你,不要再不会啦~【超全面代码&原理解释】!

操作系统之设备管理(独占设备的分配和回收模拟),实验这样手把手教你,不要再不会啦~【超全面代码&原理解释】!

作者:互联网


在这里插入图片描述


一、实验目的与要求

了解设备管理的基本原理、设备的分配与回收过程。


二、实验内容

1、复习设备管理的基本概念、基本原理、常用的数据结构、分配策略及算法
2、编制一个独占设备的分配和回收模拟程序


三、实验原理

首先利用结构体equiptype定义系统设备类型表,利用结构体equipment定义系统设备表。本实验假设系统共有4类设备,分别是输入机2台、打印机3台、磁盘机4台、磁带机1台,共10个设备。

实验共有3个函数,其中主函数main完成设备类表和和系统设备表的初始化工作并提供设备分配、设备回收、显示系统设备状态三种功能菜单输入,源代码见下。

allocate(char J[ ],char type[ ],int mm)函数完成具体设备分配工作,其中参数J[]用字符串表示作业名,type[]表示设备类型名,mm表示设备的逻辑名称。

工作流程如下:
首先根据type[ ]参数查找设备类型表,如无该类设备,则提示分配失败;如有该类设备,则进一步查找设备表,看有没有空闲的该类设备,如没有,则提示分配失败;如有空闲设备则实施分配,并将J[]、mm参数填到equipment结构体jobname、lnumber成员中,并将remain置为1,同时equiptype结构体中的remain自减1,表示分配成功。reclaim(char J[ ],char type[ ])函数完成具体设备回收工作,其中参数J[ ]用字符串表示作业名,type[ ]表示设备类型名。

工作流程如下:
首先根据type[ ]参数查找设备类型表,如无该类设备,则提示回收失败;如有该类设备,则进一步根据J[ ]参数查找设备表,看该作业是否占有该设备,如是equiptype结构体中的remain自加1,同时将equipment结构体中的jobname成员置为空、lnumber成员置为0,remain置为0,表示回收成功;如该作业没有分配该设备,则显示回收失败。

设备回收和设备分配函数,由学生根据实验原理自行编写。


四、程序代码

/*独占设备的分配和回收模拟*/
#include <bits/stdc++.h>
using namespace std; 
const int n=4,m=10; //4类设备 10个设备
struct node1 
{
	char type[10];	//设备类名
	int count ;		//拥有设备台数
	int remain;		//现存的可用设备台数
	int address;	//该类设备在设备表中的起始地址
}equiptype[n];		//设备类表定义,假定系统有n个设备类型
//相当于一个设备表
struct node2
{
	int number;		//设备绝对号(也就是设备的物理名)
	int status;		//设备好坏状态 1-好、0-坏
	int remain;		//设备是否已分配 1-已分配、0-空闲
	char jobname[4];//占有设备的作业名
	int lnumber;	//设备相对号
}equipment[m];		//设备表定义,假定系统有m个设备
int allocate(char l[],char type[],int mm)//设备分配函数
{
	int i=0,t,p; /* 查询该类设备 */ 
	while(i<n&&strcmp(equiptype[i].type,type)!=0) 	i++; 
	if(i>=n) /* 没有找到该类设备 */ 
	{ 
		printf(" 无该类设备 ,设备分配失败 !"); 
		return(false);
	} 
	else {
		printf(" 存在该类设备! "); 
	}
	if(equiptype[i].remain<1) /* 所需设备现存可用台数不足 */ 
	{ 
		printf(" 该类设备不足,分配失败 !"); 
		return(false); 
	}	 
	else {
		printf(" 该类设备充足! "); 
	} 
	t=equiptype[i].address; /* 取出该类设备在设备表中的起始地址 */ 
	while(!(equipment[t].status==1 && equipment[t].remain==0)) 
	t++; /* 填写作业名、 相对号, 状态改为已分配*/ 
	equiptype[i].remain--; 
	equipment[t].remain = 1; 
	strcpy(equipment[t].jobname,l); 
	equipment[t].lnumber = p; 
	printf(" 分配成功! "); 
}
int reclaim(char l[],char type[])//设备回收函数
{
	int i=0,t,j,k,z; 
	while(i<n&&strcmp(equiptype[i].type,type)!=0)	i++; 
	if(i>=n) /* 没有找到该类设备*/ 
	{ 
		printf(" 无该类设备 ,设备回收失败 !"); 
		return(false); 
	} 
	else	   printf(" 存在该类设备! "); 
	t = equiptype[i].address; /* 取出该类设备在设备表中的起始地址 */ 
	j = equiptype[i].count; /* 取出该类设备的数量 */ 
	k = 0; 
	z = t+j; 
	for(; t<z; t++) 
	if(strcmp(equipment[t].jobname,l)==0&&equipment[t].remain==1) 
	{ 
		equipment[t].remain=0; 
		k++; 
	} 
	equiptype[i].remain = equiptype[i].remain+k; 
	if(k==0) 
		printf(" 工作台尚未使用这种设备类别! \n");
	printf(" 回收成功! \n");
}
int main()
{
	char l[4],type[10];
	int i,mm,a;
	//设备类表初始化
	strcpy(equiptype[0].type,"input");//输入机
	equiptype[0].count=2;
	equiptype[0].remain=2;
	equiptype[0].address=0;
	strcpy(equiptype[1].type,"printer");//打印机
	equiptype[1].count=3;
	equiptype[1].remain=3;
	equiptype[1].address=2;
	strcpy(equiptype[2].type,"disk");//磁盘机
	equiptype[2].count=4;
	equiptype[2].remain=4;
	equiptype[2].address=5;
	strcpy(equiptype[3].type,"tape");//磁带机*/
	equiptype[3].count=1;
	equiptype[3].remain=1;
	equiptype[3].address=9;
	//设备表初始化
	for(i=0; i<10; i++) /*每个设备设一个唯一的名字,初始化时每个设备都是好的,并且没有分配出去*/
	{
		equipment[i].number = i;
		equipment[i].status = 1;
		equipment[i].remain = 0;
	}
	cout<<"******************************"<<endl;
	cout<<"************23夏旭************"<<endl;  
	cout<<"******************************"<<endl; 
	while(1) //输入界面进行设备的分配和回收
	{
		printf("\n0-退出,1-分配,2-回收,3-显示");
		printf("\n选择功能项(0-3):");
		scanf("%d",&a);
		switch(a)
		{
		case 0://程序结束*/
			return 0;
		case 1://a=1分配设备
			printf("输入作业名、作业所需设备类和设备相对号");
			scanf("%s%s%d",l,type,&mm);
			allocate(l,type,mm);
			break;
		case 2://a=2回收设备
			printf("输入作业名和作业归还的设备类");
			scanf("%s %s",l,type);
			reclaim(l,type);
			break;
		case 3://a=3输出设备类表和设备表的内容
			printf("\n输出设备类表\n");
			printf(" 设备类型 设备总量 空闲好设备\n");
			for(i=0; i<n; i++)
				printf("%9s%6d%9d\n",equiptype[i].type,equiptype[i].count,equiptype[i].remain);
			printf("输出设备表:\n");
			printf("绝对号 好/坏 已/未分配 占用作业名 相对号\n");
			for(i=0; i<m; i++)
				printf("%3d%8d%9d%12s%8d\n",equipment[i].number,
				equipment[i].status,equipment[i].remain,equipment[i].jobname,
				equipment[i].lnumber);
		}
	}
}

五、结果分析

在这里插入图片描述
在这里插入图片描述
1、输入3回车,显示设备原始信息。
输入3会打印输出设备类表和输出设备表的状态。如上图的初始状态。

2、输入1回车,然后再输入“aa input 99”回车,连续进行三次,然后显示设备信息,观察运行结果。
在输入的第一次进行设备分配之后,设备类型的现存可用设备台数会-1,即2-1=1.在输入的第二次进行设备分配之后,设备类型的现存可用设备台数也会减一,即1-1=0.但在输入的第三次进行设备分配之后,设备类型的现存可用设备台数也会减一,但现存设备数量为0,所有会分配失败。

3、输入2回车,然后再输入“aa input”回车,连续进行三次,进行设备回收,观察运行结果。
在输入的第一次进行设备回收之后,设备类型的现存可用设备台数会+1,即0+1=1.在输入的第二次进行设备回收之后,设备类型的现存可用设备台数也会+1,即1+1=2.但在输入的第三次进行设备回收之后,设备类型的现存可用设备台数也会+1,但现存设备数量为2,达到顶峰,所有会回收失败。

4、在前3步的基础上,输入1回车,然后再输入“aa cpu 1”回车,观察运行结果。
在备类表初始化没有cpu这个类型,所以会分配失败。


六、实验小结

通过这次实验,我了解了设备管理的基本概念、基本原理、常用的数据结构、分配策略及算法,能够编制一个独占设备的分配和回收模拟程序对已学的知识加以运用。


标签:操作系统,int,手把手,分配,remain,type,equiptype,设备
来源: https://blog.csdn.net/Luoxiaobaia/article/details/117856721