1222632徐晓阳实训.doc
《1222632徐晓阳实训.doc》由会员分享,可在线阅读,更多相关《1222632徐晓阳实训.doc(12页珍藏版)》请在冰点文库上搜索。
《操作系统》课程设计报告
成
绩
上海建桥学院
信息技术学院
《操作系统》
课程设计报告
任务名称:
死锁观察与避免
指导教师:
赵正德,巢爱棠,蒋中云
专业:
网络工程
班级:
B12
学生姓名:
徐晓阳
学号:
1222632
完成日期:
2014/6/25
一、《操作系统》课程设计的目的与要求
1、目的
死锁会引起进程僵死,严重的话会造成整个系统瘫痪。
因此,死锁现象是操作系统特别是大型系统中必须设法防止的。
学生应独立的使用C语言(或其它程序设计语言)编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效的防止死锁的发生。
从而更直观地了解死锁的起因,初步掌握防止死锁的简单方法,加深理解课堂上讲授过的知识。
2、要求
(1)设计一个由n个并发进程共享m个系统资源的系统。
系统中进程可动态地申请资源和释放资源。
系统按各进程的申请动态地分配各资源。
(2)系统应能显示各进程申请和释放资源以及系统动态分配资源的过程,便于用户观察和分析。
(3)系统应能选择是否采用防止死锁算法或选用何种防止算法(如有多种算法)。
在不采用防止算法时观察死锁现象的发生过程。
在使用防止死锁算法时,了解在同样申请条件下,防止死锁的过程。
二、简述课程设计内容、主要功能和实现环境
本示例采用银行家算法防止死锁的发生。
假设有三个并发进程共享十个系统。
在三个进程申请的系统资源之和不超过10时,当然不可能发生死锁,因为各个进程申请的资源都能满足。
在有一个进程申请的系统资源数超过10时,必然会发生死锁。
应该排除这二种情况。
程序采用人工输入各进程的申请资源序列。
如果随机给各进程分配资源,就可能发生死锁,这就是不采用防止死锁算法的情况。
假如,按照一定的规则,为各进程分配资源,就可以防止死锁的发生。
示例中采用了银行算法。
1编制和调试示例给出的死锁观察与避免程序,并用进程的各种资源请求序列测试死锁的形成和避免死锁的过程,强调过程显示。
2修改并调试一个使用有序资源使用法来预防死锁的模拟程序,并用进程的各种资源请求序列测试死锁的形成和预防死锁的过程。
实现环境C++
三、任务的分析、设计、实现和讨论
1、任务的分析
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。
若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配
2、任务的设计与实现(分别给出系统总控和本人负责实现的算法流程图与说明)
3操作过程和结果分析
序中使用的数据结构和变量名说明如下:
OPTION选择标志0选用“防止死锁”算法1不用“防止死锁”算法输入a[i]122代表现有资源数。
然后输入b[I]299代表最大需求资源。
然后输入opnion的值。
程序自动判断其是否为死锁,并处理显示答案。
四、《操作系统》课程设计小结(收获、不足与建议)
有些难度,在队长的帮助下完成了,希望能在操作系统方面多下功夫
五、附录(主要源程序和运行结果的清单)
#include"stdio.h"
#include"stdlib.h"
#include"iostream.h"
structpcb
{
charname;//进程号
charstatue;//状态r就绪f完成
intMax;//资源最大需求量
intallocation;//已占用资源量
intNeed;//尚需资源数
structpcb*next;
};
inte=13;
pcb*create(structpcb*a,intn)//初始化进程链表a表示队列n表示进程个数
{
structpcb*q,*s;
s=q=NULL;
s=a;
for(inti=1;i<=n;i++)
{
q=(structpcb*)malloc(sizeof(structpcb));
printf("PROCESSVPMAXCLAIMVALLOCATION:
\n");
while
(1)
{
cin>>q->name>>q->Max>>q->allocation;
if(((q->Max)<=10)&&((q->allocation)<=10))
break;
else
printf("输入的有误,请重新输入:
\n");
}
q->statue='r';
e=e-(q->allocation);
q->next=NULL;
if(a==NULL)
{
a=s=q;
}
else
{
s->next=q;
s=s->next;
}
}
returna;
}
voidshow(structpcb*a)//打印进程情况
{
structpcb*p;
p=a;
printf("资源占用情况为:
\n");
printf("PROCESSVPMAXCLAIMVALLOCATIONNEEDSSTATUS:
\n");
while(p!
=NULL)
{
printf("%c\t%d\t%d\t%d\t%c\t\n",
p->name,p->Max,p->allocation,p->Max-p->allocation,p->statue);
p=p->next;
}
}
voidyinhang(structpcb*a,intn)//执行银行家算法a表示进程链表,n表示进程的个数
{
intRequest,l,flag;//l是输出安全序列的下标,Request是进程申请的资源个数
flag=0;
l=0;
structpcb*q,*x;//x用来申请资源的进程
chart;//记录要申请进程的资源名字
charm[20];//安全序列
q=x=NULL;
q=x=a;
while
(1)
{
printf("请输入进程名和申请的资源数:
\n");
cin>>t>>Request;
if(Request<=e&&(x->allocation)+Request<=x->Max)
break;
else
printf("输入的有误,请重新输入:
\n");
}
printf("试分配后的结果为:
\n");
printf("PROCESSVPMAXCLAIMVALLOCATIONSTATUSAVAILABLE:
\n");
while(x!
=NULL)
{//把当前申请量付给进程
if(x->name!
=t)
x=x->next;
else
{
(x->allocation)=(x->allocation)+Request;
e=e-Request;//系统所剩资源
while(q!
=NULL)
{
printf("%c\t%d\t%d\t%c\t%d\t\n",
q->name,q->Max,q->allocation,q->statue,e-3);
q=q->next;
}
printf("-------------------------\n");
break;
}
}
printf("进行安全性算法\n");
for(inti=0;i {
q=a;
while(q!
=NULL)
{
if((q->statue)!
='f')
{
if((q->allocation)==(q->Max))
{
q->statue='f';
printf("%c\t%d\t%d\t%c\t%d\t\n",
q->name,q->Max,q->allocation,q->statue,e-3);
m[l]=q->name;
l=l+1;
q=q->next;
continue;
}
if(((q->Max)-(q->allocation))<=e)
{
q->statue='f';
m[l]=q->name;
l=l+1;
printf("%c\t%d\t%d\t%c\t%d\t\n",
q->name,q->Max,q->allocation,q->statue,e-3);
}
q=q->next;
}
else
q=q->next;
}
}
q=a;
while(q!
=NULL)//判断状态
{
if(q->statue!
='f')
{ flag=1;
printf("安全序列查找失败,资源分配错误\n");
x=a;
while(x!
=NULL)
{//把当前申请量付给进程
if(x->name!
=t)
x=x->next;
else
{
(x->allocation)=(x->allocation)-Request;
e=e+Request;
break;
}
}
show(a);
return;
}
else
{
q=q->next;
}
}
printf("安全序列为:
\n");//输出安全序列
for(i=0;i {
printf("%c",m[i]);
}
if(flag==0)
{
x=a;
while(x!
=NULL)
{//把当前申请量付给进程
if(x->name!
=t)
x=x->next;
else
{
if((x->allocation)==(x->Max))
{
e=x->allocation;
}
break;
}
}
printf("试分配成功!
\n");
x=a;
while(x!
=NULL)
{
if((x->allocation)!
=(x->Max))
{
x->statue='r';
}
x=x->next;
}
show(a);
return;
}
}
voidrandom(structpcb*a,intr)
{inty,flag;
flag=1;
structpcb*q,*x;
chart;
q=x=NULL;
q=x=a;
while
(1)
{printf("请输入要申请资源的进程的进程名和要申请的资源个数:
\n");
cin>>t>>y;
if(y<=e)break;
else
printf("输入的有误,请重新输入:
\n");}while(x!
=NULL)
{if(x->name!
=t)
x=x->next;
else
{(x->allocation)=(x->allocation)+y;
e=e-y;
if((e<=3)&&((x->allocation)!
=(x->Max)))
{printf("出现死锁,系统现在已无可以利用的资源\n");
show(a);
break;
}
if((x->allocation)==(x->Max))
{e=e+(x->allocation);
x->statue='f';
printf("现在系统可以利用的资源个数为:
%d\n",e-3);
show(a);
}
else
{
printf("现在系统可以利用的资源个数为:
%d\n",e-3);
show(a);
}
break;
}
}
q=a;
while(q!
=NULL)
{if(q->statue!
='f')
{flag=0;}
q=q->next;}
if(flag==1)
{printf("所有进程都获得了资源,资源分配完毕!
\n");}}
voidmain()
{
intn;
structpcb*a;
a=NULL;
intr=3;//进程数为3
a=create(a,r);//创建进程数为3的进程队列,并将进程队列的值赋值给a
show(a);
printf("----------------------\n");
printf("OPTION=");
scanf("%d",&n);
printf("CLAIMOFPROCESS1IS:
123-1-10\n");
printf("CLAIMOFPROCESS2IS:
2311-20\n");
printf("CLAIMOFPROCESS3IS:
125-1-20\n");
while
(1){
switch(n)
{
case0:
yinhang(a,r);//进程指针为a,进程数r为3
printf("----------------------\n");
break;
case1:
random(a,r);//进程指针为a,进程数r为3
printf("----------------------\n");
break;
default:
return;
}
}
}
OPTION=0
OPTION=1
第11页共12页