计算机科学与工程学院学生实验报告
学号
专业 计 算 机 科
学与技术
班级
姓名
课程名称
操作系统
课程类型 专业必修
实验名称
设备管理
实验目的:
了解和掌握通道方式下,独占型设备分配的实现方式。
实验内容:
系统现有 2 个通道,3 个设备控制器,4 个设备,编写程序,模拟实现设备基
本管理算法。
实验要求:
1、设备的添加/删除
2、设备的分配/回收
3、解决瓶颈问题,实现设备无关性(选做)
实验分析:
为了提高操作系统的可适应性和可扩展性,现代操作系统中都毫无例外地实现
了设备独立性,又叫做设备无关性。设备独立性的含义是:应用程序独立于具体使
用的物理设备。
为了实现独占设备的分配,系统设置数据表格的方式也不相同,在实验中只要
设计合理即可。这里仅仅是一种方案,采用设备类表和设备表。
数据结构:
操作系统设置“设备分配表”,用来记录计算机系统所配置的独占设备类型、
台数以及分配情况。设备分配表可由“设备类表”和“设备表”两部分组成。如下:
struct
{
//设备类名
//拥有设备数量
char type[10];
int count;
int remain;
int address;
//现存的可用设备数量
//起始地址
//设备表类定义,假设系统有n个设备类型
}equip_type[n];
struct
{
//设备序号
int number;
int status; //设备状态可否使用
int remain;
char jobname[10];
//设备是否已分配
//占有设备的作业名
}equipment[m];
//设备表定义,假设系统有m个设备
实验步骤:
1、 独占设备分配
(1) 当进程申请某类设备时,系统先查“设备类表”。
(2) 如果该类设备的现存台数可以满足申请要求,则从该类设备的“设备表”
始址开始依次查该类设备在设备表中的登记项,找出“未分配”的设备分配给作业。
(3) 分配后要修改设备类表中的现存台数,把分配给进程的设备标志改为“已
分配”且填上占用设备的作业名。
2、独占设备回收
作业运行完成,释放设备时,系统首先要查看设备表,比较每一项,找到占用
作业名与运行作业的作业名相同的栏目,将这一栏的“已/未分配”设置为“未分
配”,然后将设备表中对应设备类的可使用数量增加 1。
2、 添加设备
系统提出添加设备的的请求,由用户输入设备类型,系统判断该设备是否存在,
若不存在,将该设备添加进设备表,输入该设备的数量,初始化该设备的起始地址。
实验流程图:
0、结束
开始
4、显示
1、分配设备
2、回收设备
3、添加设备
输入作业名
输入所需设备类型
否
该 设 备 是
否存在?
是
分配
占 用 设 备 的 作
业名、设备类型
添加的设备类型
该 设 备 是
否占用?
否
该设备未
被占用,
无需回收
是
解 除
占用
该 设 备 是
否存在?
是
否
该 设 备
已 存
在 , 无
需添加
添 加
该 设
备
实验结果:
实验总结:
通过本次实验,我对设备管理中的概念有了进一步的了解,同时也了解了设备
管理的 一些主要任务及其实现方法;刚开始不是很清楚,通过请教同学,对这部
分内容有了相对透彻的了解。
实验评语:
实验成绩
教师签名
附:
实验代码:
#include
#include
#include
#include
#include
#define false 0
#define true 1
#define n 3
#define m 4
//假设系统有3类设备
//假设系统有4个设备
struct
{
//设备类名
//拥有设备数量
char type[10];
int count;
int remain;
int address;
}equip_type[n];
//现存的可用设备数量
//起始地址
//设备表类定义,假设系统有n个设备类型
struct
{
//设备序号
int number;
int status; //设备状态可否使用
int remain;
char jobname[10];
//设备是否已分配
//占有设备的作业名
//设备表定义,假设系统有m个设备
}equipment[m];
//设备分配函数
allocate(char *job,char *type,int class)
{
int i,t,j;
//查询该类型设备
i=0;
while(i=class)
{
printf("无该类设备,设备分配请求失败");
return(false);
}
//所需设备现在可用数量不足
if(equip_type[i].remain<1)
{
printf("该类设备数量不足,设别分配请求失败");
return(false);
}
t=equip_type[i].address;
while(!(equipment[t].status==1&&equipment[t].remain==0))
//得到该类设备在设别表中的起始地址
t++;
//填写作业名,状态更改为"已分配"
equip_type[i].remain--;
equipment[t].remain=1;
strcpy(equipment[t].jobname,job);
}
//设备回收函数
reclaim(char *job,char *type,int class)
{
int i,t,j,k,nn;
i=0;
while(i=class)
{
printf("无该类设备,设备回收失败");
return(false);
}
t=equip_type[i].address;
j=equip_type[i].count;
k=0;
nn=t+j;
for(;t