logo资料库

操作系统实验六 设备管理 实验报告 附流程图 代码.doc

第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
资料共10页,剩余部分请下载后查看
计算机科学与工程学院学生实验报告 学号 专业 计 算 机 科 学与技术 班级 姓名 课程名称 操作系统 课程类型 专业必修 实验名称 设备管理 实验目的: 了解和掌握通道方式下,独占型设备分配的实现方式。 实验内容: 系统现有 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
分享到:
收藏