logo资料库

独占设备C语言代码.doc

第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
资料共11页,剩余部分请下载后查看
题 目: 独占设备的分配和回收模拟系统的设计(图形化界面) 初始条件: 1.预备内容:阅读操作系统的设备管理章节内容,了解有关设备的分类和设备分 配的概念。 2.实践准备:掌握一种计算机可视化语言的使用。 要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写 等具体要求) 1.此设计模拟满足设备独占性的独占设备的分配和回收。能够处理以下的情形: ⑴ 模拟设计的程序包括建立设备类表和设备表的程序段(在主函数中)、分配 设备和回收设备的函数; ⑵ 分配设备要求输入作业名、设备类名和相对号;回收设备要求输入作业名和 设备类名。 2.设计报告内容应说明: ⑴ 课程设计目的与功能; ⑵ 需求分析,数据结构或模块说明(功能与框图); ⑶ 源程序的主要部分; ⑷ 运行结果与运行情况分析; ⑸ 自我评价与总结: i)你认为你完成的设计哪些地方做得比较好或比较出色; ii)什么地方做得不太好,以后如何改正; iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训); iv)完成本题是否有其他的其他方法(如果有,简要说明该方法); 一、课程设计目的与功能; 问题描述:为了使系统有条不紊地工作,系统在分配设备是,应考虑这样几 个因素:①设备的固有属性;②设备分配算法;③设备分配时的安全性④设备独 立性;系统也要通过回收,实现设备的再分配。 要求:设备分配在计算机系统中,设备、控制器和通道等资源是有限的,并 不是每个进程随时都可以得到这些资源。进程首先要向设备管理程序提出申请, 然后由设备管理程序按照一定的分配算法给进程分配必要的资源。如果进程的申 请没有成功,就要在资源的等待队列中排队等待,直到获得所需的资源。考 虑 设 备 的 特 性 和 安 全 性 。设 备 的 特 性 是 设 备 本 身 固 有 的 属 性 ,一 般 分 为 独 占 、 共 享 和 虚 拟 设 备 等 。 二、 需求分析,数据结构或模块说明(功能与框图)1、 独占设备的分配与虚拟设备独占设备每次只能分配给一个进程使用,这种使 用特性隐含着死锁的必要条件,所以在考虑独占设备的分配时,一定要结合有关
防止和避免死锁的安全算法。 2、设计方案论证: 为了提高 OS 的可适应性和可扩展性,在 OS 中毫无例外地实现了设备的独立 性,即使应用程序独立于具体使用的物理设备。在实现了设备独立性的功能后, 可以带来两方面的好处: (1)设备分配时的灵活性; (2)易于实现 I/O 重定向。 3、详细设计 通过此系统可以实现如下功能:分配,回收,显示,退出。选择独占设备, 通 过 执 行 功 能 项 , 输 出 设 备 表 , 实 现 设 备 的 分 配 与 回 收 。
三、源程序的主要部分 #define false 0 #define true 1 #define n 4 #define m 10 struct { char type[10]; /*设备类名*/ int count; /*拥有设备台数*/ int remain; /*现存的可用设备台数*/ int address; /*该类设备在设备表中的起始地址*/ }equiptype[n]; /*设备类表定义,假定系统有 n 个设备类型*/ struct { int number; /*设备绝对号*/ int status; /*设备好坏状态*/ int remain; /*设备是否已分配*/ char jobname[4];/*占有设备的作业名*/
int lnumber; /*设备相对号*/ }equipment[m]; /*设备表定义,假定系统有 m 个设备*/ allocate(J,type,mm) char *J,*type; int mm; { int i,t,j; /*查询该类设备*/ i=0; while(i=n)/*没有找到该类设备*/ { printf("无该类设备,设备分配失败"); return(false); } if(equiptype[i].remain<1)/*所需设备现存可用台数不足*/ { printf("该类设备不足,分配失败"); return(false); } 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,J); equipment[t].lnumber=mm; }/*设备分配函数结束*/ reclaim (J,type) char J,type; { int i,t,j,k,nn; i=0; while(i
i++; if(i>=n)/*没有找到该类设备*/ { printf("无该类设备,设备回收失败"); return(false); } t=equiptype[i].address; /*取出该类设备在设备表中的起始地址*/ j=equiptype[i].count; /*取出该类设备的数量*/ k=0; nn=t+j; for(;t
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; } while(1) { printf("\n0-退出,1-分配,2-回收,3-显示"); printf("\n 选择功能项(0~3):"); scanf("%d",&a); switch(a) { case 0 : /*a=0 程序结束*/ exit(0); case 1 : /*a=1 分配设备*/ printf("输入作业名、作业所需设备类和设备相对号"); scanf("%s%s%d",J,type,&mm); allocate(J,type,mm);/*分配设备*/ break; case 2: /*a=2 回收设备*/ printf("输入作业名和作业归还的设备类"); scanf("%s%s",J,type); reclaim(J,type);/*回收设备*/ break; case 3: /*a=3 输出设备类表和设备表的内容*/ printf("\n 输出设备类表\n"); printf(" 设备类型 设备总量 空闲好设备\n"); for(i=0;i
printf("绝对号 好/坏 已/未分配 占用作业名 相对号\n"); for(i=0;i
程序运行后可以看到如下要求: 0-退出,1-分配,2-回收,3-显示 选择功能项(0~3): 此时要求输入相应的功能选项,此处我使用 disk(磁盘机)分配和回收做演示: (以下为程序调试结果页面) 0-退出,1-分配,2-回收,3-显示 选择功能项(0~3):1 输入作业名,作业所需设备类和设备相对号 xyz Disk 2 (注:设备类只能是程序所提供的四种独占设备,当输入不合法或不存在的设备 类后,会提示“无该类设备,设备分配失败”。 输入时使用回车分隔,设备相对号只是一种逻辑上的划分,可以重复,前 提是该类独占设备还有空闲资源) 0-退出,1-分配,2-回收,3-显示 选择功能项(0~3):3 输出设备类表: 设备类型 设备总量 空闲好设备 Input Printer Disk tape 输出设备表: 绝对号 0 1 2 3 4 5 6 2 3 4 1 2 3 0 1 好/坏 1 1 1 1 1 1 1 已/未分配 0 0 0 0 0 1 0 占用作业名 相对号 0 0 0 0 0 Ccy Tt 0 0 0 0 0 2 1
分享到:
收藏