华北科技学院计算机系综合性实验
实验报告
课程名称计算机操作系统
实验学期2006至2007学年第二学期
学生所在系部计算机系
年级2004级专业班级信息管理与信息系统B043
学生姓名周志勇学号200407034311
任课教师任占营
实验成绩
计算机系制
《计算机操作系统》课程综合性实验报告
开课实验室:软件开发实验室2007年5月17日
实验题目银行家算法一,实验目的
理解死锁基本概念,掌握产生死锁的原因和必要条件以及处理死锁的几种方法,体会银行家算法是避免死锁的一种行之有效的方法.通过编写程序实现银行家算法,进一步理解银行家算法的原理和避免死锁的过程,掌握银行家算法的描述和应用,进一步熟练掌握处理处理机死锁的方法.PC兼容机,Windows操作系统,编程语言等.(1)首先对银行家算法原理进行深刻的理解和掌握,
(2)选择一种熟悉的编程语言来实现对N个进程和M种系统资源进行银行家算法判定和资源分配,
(3)根据银行家算法的要求设计相应的数据结构,如:可利用资源向量,最大需求矩阵,分配矩阵和需求矩阵,其中进程的个数N和资源的种类数目用户可以任意交互输入,
(4)安全性判定要显示过程,要给出找到的安全序列.I,j]:等于Need[i,j]-requesti[j]
系统执行安全性算法,检查分配后是否安全.若安全,则正式分配资源,否则,Pi等待.
安全性算法
设置2个工作向量:work表示系统可供进程继续运行所需的各类资源数目,算法执行前令work:等于Available,Finish表示系统是否有足够的资源分配给进程,使之运行完成,开始时先令Finish[i]:等于False,当有足够资源时在做Finish[i]等于True.
找到满足finish[i]等于flase,need[I,j]<,等于work[j]的进程,找到则执行(3),否则转(4)
Pi获得资源,顺利执行直到完成,并释放资源
work[j]:等于work[j]+Allocation
finish[i]:等于true
gotostep2
(4)如所有进程的Finish[i]等于true都满足,则系统安全,否则为不安全.
算法的具体实现如下:
流程图:
主要代码:
/**************************申请资源函数**************************/
intapply()
{intv等于1,
for(i等于0,i<,等于2,i++)
{if(need[proc][i]<,request[i]){v等于0,break,}
if(ailable[i]<,request[i]){v等于0,break,}}
if(v等于等于1){for(i等于0,i<,等于2,i++)
{stay[0][i]等于allocation[proc][i],
stay[1][i]等于need[proc][i],
stay[2][i]等于ailable[i],
allocation[proc][i]+等于request[i],
need[proc][i]-等于request[i],
ailable[i]-等于request[i],}
}
return(v),
}
/**************************安全检查函数***************************/
inttest()
{intwork[3],finish[5]等于{0,0,0,0,0},v,k等于0,t等于0,
for(i等于0,i<,p,i++)
if(result[i]等于等于0){finish[i]等于1,k1--,}
for(i等于0,i<,等于2,i++)work[i]等于ailable[i],
while(1)
{for(i等于0,i<,等于4,i++)
{if(finish[i]等于等于0)
{v等于1,
for(j等于0,j<,等于2,j++)
if(need[i][j]>,work[j])
{v等于0,break,}
if(v等于等于1)
{finish[i]等于1,
for(j等于0,j<,等于2,j++)work[j]+等于allocation[i][j],
process[k]等于i,k++,
}
}
}
if(t等于等于k)break,
elset等于k,
if(k等于等于k1)break,
}
if(k等于等于k1)return(1),
elsereturn(0),
}
/**************************主函数***************************/
main()
{
while(1)
{Output(),
k1等于5,
printf("InputtheprocessID(0~4):P"),
scanf("%d",&,proc),
if(proc<,0||proc>,4)break,
printf("P%drequestSourcsare:",proc),
scanf("%d,%d,%d",&,request[0],&,request[1],&,request[2]),
if(apply()等于等于0)
{printf("TheP%drequestisoutofailable!\n",proc),
printf("Plaseputdownanykeytocontinue!"),}
elseif(test()等于等于0)
{printf("itisnotsafe,P%dshouldbewait!\n",proc),
for(i等于0,i<,等于2,i++)
{allocation[proc][i]等于stay[0][i],
need[proc][i]等于stay[1][i],
ailable[i]等于stay[2][i],}
printf("Plaseputdownanykeytocontinue!"),}
else
{Output(),
printf("Systemissafe!Thesafequeueis:"),
for(i等于0,i<,k1-1,i++)
printf("P%d->,",process[i]),
printf("P%d",process[k1-1]),
printf("\nPlaseputdownanykeytocontinue!"),}
if(need[proc][0]等于等于0&,&,need[proc][1]等于等于0&,&,need[proc][2]等于等于0)
for(i等于0,i<,等于2,i++)
{ailable[i]+等于max[proc][i],
result[proc]等于0,}
getch(),
}
}
(3)运行结果:
P1申请资源(1,0,2)
P4申请资源(3,3,0)
P3申请资源(0,2,0)
P3申请资源(0,1,0)
结果分析:
银行家算法又称Dijkstra算法,广泛应用于多个领域,主要是使系统处于安全状态,避免发生死锁,其基本思想是先试探分配资源,并进行检查,看系统是否安全,安全则实施分配,否则不分配.在本算法的实现使用C语言,采用数组进行资源的设置,不能动态的输入进程数目,资源种类以及进程的需求和资源的数目,还需改进.通过本次实验,对银行家算法有了更进一步的理解,对操作系统的进程预防死锁有了更新的认识,在以后的学习中会还需要更多的努力!
教师评价
评定项目
A
B
C
D
评定项目
A
B
C
D
算法正确
界面美观,布局合理
程序结构合理
操作熟练
语法,语义正确
解析完整
实验结果正确
文字流畅
报告规范
题解正确
其他:
评价教师签名:
年月日
结束
Y
Y
Getch()
修改Available和result值
资源分配成功,输出安全序列
N
Test()等于0
N
Apply()等于0
输入请求资源数shu
输入进程ID
K1等于5
While(1)
输入数据
开始