课程设计题目独占设备的分配与回收.docx
《课程设计题目独占设备的分配与回收.docx》由会员分享,可在线阅读,更多相关《课程设计题目独占设备的分配与回收.docx(10页珍藏版)》请在冰豆网上搜索。
![课程设计题目独占设备的分配与回收.docx](https://file1.bdocx.com/fileroot1/2023-1/7/f9cdd41d-e913-4e7d-aeae-440bb4e94650/f9cdd41d-e913-4e7d-aeae-440bb4e946501.gif)
课程设计题目独占设备的分配与回收
一、课程设计目的和任务
课程设计题目:
独占设备的分配与回收
问题描述:
为了使系统有条不紊地工作,系统在分配设备是,应考虑这样几个因素:
①设备的固有属性;②设备分配算法;③设备分配时的安全性④设备独立性;系统也要通过回收,实现设备的再分配。
要求:
设备分配在计算机系统中,设备、控制器和通道等资源是有限的,并不是每个进程随时都可以得到这些资源。
进程首先要向设备管理程序提出申请,然后由设备管理程序按照一定的分配算法给进程分配必要的资源。
如果进程的申请没有成功,就要在资源的等待队列中排队等待,直到获得所需的资源。
考虑设备的特性和安全性。
设备的特性是设备本身固有的属性,一般分为独占、共享和虚拟设备等。
二、分析与设计
1、设计任务分析:
独占设备的分配与虚拟设备独占设备每次只能分配给一个进程使用,这种使用特性隐含着死锁的必要条件,所以在考虑独占设备的分配时,一定要结合有关防止和避免死锁的安全算法。
2、设计方案论证:
为了提高OS的可适应性和可扩展性,在OS中毫无例外地实现了设备的独立性,即使应用程序独立于具体使用的物理设备。
在实现了设备独立性的功能后,可以带来两方面的好处:
(1)设备分配时的灵活性;
(2)易于实现I/O重定向。
3、详细设计
通过此系统可以实现如下功能:
分配,回收,显示,退出。
选择独占设备,通过执行功能项,输出设备表,实现设备的分配与回收。
4、源代码清单:
#definefalse0
#definetrue1
#definen4
#definem10struct
{
chartype[10];/*设备类名*/intcount;/*拥有设备台数*/
intremain;/*现存的可用设备台数*/
intaddress;/*该类设备在设备表中的起始地址*/
}equiptype[n];/*设备类表定义,假定系统有n个设备类型*/struct
{
intnumber;/*设备绝对号*/intstatus;/*设备好坏状态*/
intremain;/*设备是否已分配*/
charjobname[4];/*占有设备的作业名*/intlnumber;/*设备相对号*/
}equipment[m];/*设备表定义,假定系统有m个设备*/
allocate(J,type,mm)char*J,*type;
intmm;
{
inti,t,j;
/*查询该类设备*/i=0;
while(i=0)i++;
if(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)charJ,type;
{
inti,t,j,k,nn;i=0;
while(i=0)i++;
if(i>=n)/*没有找到该类设备*/
{
printf("无该类设备,设备回收失败");return(false);
}
t=equiptype[i].address;/*取出该类设备在设备表中的起始地址*/j=equiptype[i].count;/*取出该类设备的数量*/
k=0;
nn=t+j;for(;tif(strcmp(equipment[t].jobname,J)==0&&equipment[t].remain==1)
{
equipment[t].remain=0;k++;
}
equiptype[i].remain=equiptype[i].remain+k;if(k==0)
printf("该作业没有使用该类设备\n");
}/*设备回收函数结束*/
main()
{
charJ[4];inti,mm,a;
chartype[10];
/*设备类表初始化:
*/
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;
}
while
(1)
{
printf("\n0-退出,1-分配,2-回收,3-显示");printf("\n选择功能项(0~3):
");
scanf("%d",&a);switch(a)
{
case0:
/*a=0程序结束*/exit(0);
case1:
/*a=1分配设备*/
printf("输入作业名、作业所需设备类和设备相对号");scanf("%s%s%d",J,type,&mm);
allocate(J,type,mm);/*分配设备*/break;
case2:
/*a=2回收设备*/
printf("输入作业名和作业归还的设备类");scanf("%s%s",J,type);
reclaim(J,type);/*回收设备*/break;
case3:
/*a=3输出设备类表和设备表的内容*/printf("\n输出设备类表\n");
printf("设备类型设备总量空闲好设备\n");for(i=0;iprintf("%9s%8d%9d\n",equiptype[i].type,equiptype[i].count,equiptype[i].remain);
printf("输出设备表:
\n");
printf("绝对号好/坏已/未分配占用作业名相对号\n");for(i=0;iprintf("%3d%8d%9d%12s%8d\n",equipment[i].number,equipment[i].status,equipment[i].remain,equipment[i].jobname,
equipment[i].lnumber);
}
}
}
三、系统实施
运行结果:
该程序模拟独占设备的分配和回收,其中,独占设备分别为input(输入机)、printer(打印机)、disk(磁盘机)、tape(磁带机)
输出设备类表:
设备类型
设备总量
空闲好设备
Input
2
2
Printer
3
3
Disk
4
4
tape
1
1
注:
设备总量为10
输出设备表:
绝对号
好/坏
已/未分配
占用作业名
相对号
0
1
0
0
0
1
1
0
0
0
2
1
0
0
0
3
1
0
0
0
4
1
0
0
0
5
1
0
0
0
6
1
0
0
0
7
1
0
0
0
8
1
0
0
0
9
1
0
0
0
注:
⑴绝对号为设备的标号,根据设备类型的不同与数量,其中,0~1为input,2~4为printer,5~8为disk,9为tape
⑵默认1为设备状态“好”0为该设备未分配
0为默认的作业名
0为设备的相对号
程序运行后可以看到如下要求:
0-退出,1-分配,2-回收,3-显示选择功能项(0~3):
此时要求输入相应的功能选项,此处我使用disk(磁盘机)分配和回收做演示:
(以下为程序调试结果页面)
0-退出,1-分配,2-回收,3-显示选择功能项(0~3):
1
输入作业名,作业所需设备类和设备相对号xyzDisk
2
(注:
设备类只能是程序所提供的四种独占设备,当输入不合法或不存在的设备类后,会提示“无该类设备,设备分配失败”。
输入时使用回车分隔,设备相对号只是一种逻辑上的划分,可以重复,前提是该类独占设备还有空闲资源)
0-退出,1-分配,2-回收,3-显示选择功能项(0~3):
3
输出设备类表:
设备类型
设备总量
空闲好设备
Input
2
2
Printer
3
3
Disk
4
0
tape
1
1
输出设备表:
绝对号
好/坏
已/未分配
占用作业名
相对号
0
1
0
0
0
1
1
0
0
0
2
1
0
0
0
3
1
0
0
0
4
1
0
0
0
5
1
1
Ccy
2
6
1
0
Tt
1
7
1
0
Hb
3
8
1
0
Jl
2
9
1
0
0
0
0-退出,1-分配,2-回收,3-显示选择功能项(0~3):
1
输入作业名,作业所需设备类和设备相对号xbDisk
2
该类设备不足,分配失败
0-退出,1-分配,2-回收,3-显示选择功能项(0~3):
2
输入作业名和作业归还的设备类jlDisk
0-退出,1-分配,2-回收,3-显示选择功能项(0~3):
3
输出设备类表:
设备类型
设备总量
空闲好设备
Input
2
2
Printer
3
3
Disk
4
1
tape
1
1
输出设备表:
绝对号
好/坏
已/未分配
占用作业名
相对号
0
1
0
0
0
1
1
0
0
0
2
1
0
0
0
3
1
0
0
0
4
1
0
0
0
5
1
1
Ccy
2
6
1
0
Tt
1
7
1
0
Hb
3
8
1
0
Jl
2
9
1
0
0
0
0-退出,1-分配,2-回收,3-显示选择功能项(0~3):
1
输入作业名,作业所需设备类和设备相对号xbDisk
2
0-退出,1-分配,2-回收,3-显示选择功能项(0~3):
3
输出设备类表:
设备类型
设备总量
空闲好设备
Input
2
2
Printer
3
3
Disk
4
0
tape
1
1
输出设备表:
绝对号
好/坏
已/未分配
占用作业名
相对号
0
1
0
0
0
1
1
0
0
0
2
1
0
0
0
3
1
0
0
0
4
1
0
0
0
5
1
1
Ccy
2
6
1
0
Tt
1
7
1
0
Hb
3
8
1
0
Xb
2
9
1
0
0
0
以上的演示实现了disk独占设备的分配,由于设备不足无法分配后,通过设备的回收,再实现设备的分配。
其余的独占设备也类似disk磁盘演示。
四、总结与体会
在本次设计中,要求重点掌握独占设备的分配与回收,这就要求掌握基本的设备分配程序,其中又包括分配设备,分配控制器,分配通道三个步骤,而且只有在设备,控制器,和通道三者都分配成功时,这次的设备分配才算成功。
同时通过对程序分配的改进,使独占设备的分配程序具有更强的灵活性,并提高分配的成功率。
在设计中也碰到多方面地问题,如何进行设备的分配回收这些关键问题都需要重点去解决。
毕竟掌握的知识有限,单凭个人很难完成,但通过小组成员的集体努力,查阅相关资料,相互讨论,所有问题最终都得到解决。
从起初的总体设计,进行可行性分析,再进行分工编程,最后进行调试,基本实现了课程设计所要求的目标。
该设计主要通过C语言进行编写,在运行过程中有些功能可能实现起来会有异常,因此需要在以后的时间更进一步熟练掌握这一语言,努力将其功能实现的更加完美。
五、参考书目
汤子瀛计算机操作系统西安电子科技大学出版社2001王鹏操作系统设计与实现北京电子工业出版社1998