操作系统(设备管理)
设备管理
- 一、实验目的
- 二、实验内容
- 三、实验准备
- 四、实验要求
- 1、数据结构
- 2、流程图
- 代码运行结果
- 总结
一、实验目的
1、理解设备管理的概念和任务。
2、掌握独占设备的分配、回收等主要算法的原理并编程实现。
二、实验内容
在Windows系统中,编写程序实现对独占设备的分配与回收的模拟,该程序中包括:建立设备类表和设备表、分配设备和回收设备的函数。
三、实验准备
在多道程序环境下,对于独占设备,应采用独享分配策略,即将一个设备分配给某进程后,便由该进程独占,直至该进程完成或释放该设备,然后系统才能再将该设备分配给其他进程使用。在实验中,通过模拟方法实现对独占设备的分配和回收。
在操作系统中,通常要通过表格记录相应设备状态等,以便进行设备分配。在进行设备分配时所需的数据结构(表格)有设备类表和设备控制表等。
设备类表记录系统中全部设备的情况,每个设备类占一个表目,包括:设备类型、设备标识符、设备驱动程序人口、拥有设备数量、可分配设备数量、设备表起始地址等,如表5-1所示。(SDT DCT COCT CHCT)
系统为每一个设备都配置了一张设备控制表,用于记录本设备的情况。每一设备占一个表目,包括:设备状态、是否分配、占有作业名等,如表5-2所示。
作业申请某设备时,先查“设备类表”,如果该类设备的拥有设备数量满足申请要求,则从设备类表中得到该类设备的设备表起始地址,然后找到“设备控制表”中该类设备的起始地址,依次查询该类设备的表项,找到设备状态是“好”且没有被分配的设备分配给作业。分配设备的过程中要修改“设备类表”中可分配设备数量,并且把“设备控制表”中设备“是否分配”项更改为“是”,并填写占有作业名和相对号。
| 设备类 | 拥有设备数量 | 可分配设备数量 | 设备表起始地址 |
|---|---|---|---|
| Input | 5 | 2 | 2 |
| printer | 4 | 3 | 5 |
| … | … | … | … |
| 绝对号 | 设备状态 | 是否分配 | 占有作业名 | 相对号 |
|---|---|---|---|---|
| 11 | 好/坏 | 是/否 | job | 1 |
| … | … | … | … |
设备回收时,系统首先查看“设备控制表”,找到需要释放的设备,将该设备“是否分配”项更改为“否”,然后在“设备类表”中将“可使用数量”增加1。
四、实验要求
1、分析程序所定义使用的数据结构;
2、分析程序的结构,并画出程序流程图;
3、撰写实验报告;
1、数据结构
struct deviceType
{char type[10];//设备类名int count;//拥有设备数量int remain;//现存的可用设备数量int address;//该类设备在设备表中的起始地址
}equipmentType[N];//设备类表定义,假设系统有n个设备类型struct deviceState
{int number;//设备绝对号bool status;//设备状态可否使用bool isRemain;//设备是否已分配char jobName[10];//占有设备的作业名称int lnumber;//设备相对号
}device[M];//设备表定义,假设系统有m个设备
2、流程图

设备分配函数代码
bool Allocate(char *job,char *type,int opposite)//设备分配函数
{int i = 0;int t = 0;while(i < N && strcmp(equipmentType[i].type,type) != 0)//查询该类设备i++;if(i >= N)//没有找到该类设备{printf("无该类设备,设备分配请求失败\n");return false;}if(equipmentType[i].remain < 1)//所需设备现存的可用数量不足{printf("该类设备数量不足,设备分配请求失败\n");return false;}t = equipmentType[i].address;while(! (device[t].status == true && device[t].isRemain == false))//得到该类设备在设备表中的起始地址t++;//填写作业名、设备相对号,状态equipmentType[i].remain--;device[t].isRemain = true;strcpy(device[t].jobName,job);device[t].lnumber = opposite;return true;
}
设备回收函数代码
bool Reclaim(char *job,char *type)//设备回收函数
{int i = 0,t = 0,j,k = 0,m;while(i < N && strcmp(equipmentType[i].type, type) != 0)i++;//没有找到该类设备if(i >= N){printf("无该类设备,设备回收请求失败");return 0;}//得到该类设备在设备表中的起始地址t = equipmentType[i].address;//得到该设备的数量j = equipmentType[i].count;m = t + j;//修改设备为可使用状态和该类型设备可用数量for(t = 0;t < m;t++){if(strcmp(device[t].jobName, job) == 0 && device[t].isRemain == 1){device[t].isRemain = 0;k++;}}equipmentType[i].remain = equipmentType[i].remain + k;if(k == 0)printf("作业没有使用该类设备");return true;}
展示自己时间代码
void Time()
{time_t ti;//将t声明为时间变量struct tm *p;//struct tm是一个结构体,声明一个结构体指针time(&ti);p=localtime(&ti);//获得当地的时间int s = 7;int k = 7;int sum;sum = s * k;printf("********************************\n");printf("****** 学号 ******\n",sum);printf("****** 姓名 ******\n");printf("********************************\n");printf("操作系统实验展示于%d年%d月%d日 %d时%d分%d秒\n",1900 + p -> tm_year, 1 + p -> tm_mon, p -> tm_mday, p -> tm_hour, p -> tm_min, p -> tm_sec);printf("---------------------------------------------\n");
}
主函数代码
int main()
{Time();char job[10];int i = 0;int opposite = 0;int choose = 0;char type[10];strcpy(equipmentType[0].type,"input");//设备类型:输入设备equipmentType[0].count = 2;equipmentType[0].remain = 2;equipmentType[0].address = 0;strcpy(equipmentType[1].type,"printer");equipmentType[1].count = 3;equipmentType[1].remain = 3;equipmentType[1].address = 2;strcpy(equipmentType[2].type,"camera");equipmentType[2].count = 5;equipmentType[2].remain = 5;equipmentType[2].address = 5;for(i = 0; i < 10; i++){device[i].number = i;device[i].status = 1;device[i].isRemain = false;}while(1){printf("0---退出系统,1---分配设备,2---回收设备,3---显示设备信息\n");printf("请选择功能项:\n");scanf("%d",&choose);switch(choose){case 0:return 0;case 1:printf("----------------------------------------------------------\n");printf("请输入作业名、作业所需设备类和设备相对号\n");scanf("%s %s %d",job,type,&opposite);Allocate(job,type,opposite);//分配设备break;case 2:printf("----------------------------------------------------------\n");printf("请输入作业名和作业要归还的设备类型\n");scanf("%s %s",job,type);Reclaim(job,type);//回收设备break; case 3:printf("----------------------------------------------------------\n"); printf("系统设备表 (SDT):\n");printf("设备类型\t拥有设备数量\t可分配设备数量\t 起始地址\n");for(i = 0; i < N; i++)printf("%8s %10d %18d%18d\n",equipmentType[i].type,equipmentType[i].count,equipmentType[i].remain,equipmentType[i].address);printf("--------------------------------------------------------------\n");printf("设备控制表(DCT):\n");printf("绝对号\t设备状态\t是否分配\t占用作业名\t相对号\n");printf("--------------------------------------------------------------\n");for(i = 0; i < M; i++){printf("%3d\t%5d\t%11d\t%15s\t%11d\n",device[i].number,device[i].status,device[i].isRemain,device[i].jobName,device[i].lnumber);}printf("--------------------------------------------------------------\n"); break;default:return 0;}}
}
代码运行结果
选择设备分配功能1,输入作业名,需要的设备及相对号。并查看设备是否分配成功选择功能3查看设备信息
设备回收成功正常退出模拟系统。

总结
欢迎指正错误,留言交流。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
