实验三 银行家算法
(1)死锁产生的原因和必要条件是什么? 原因:
a) 系统资源不足;
b) 进程运行推进的顺序不合适; c) 资源分配不当。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺战、有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。
必要条件:
a) 互斥条件:一个资源每次只能被一个进程使用;
b) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放; c) 不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺; d) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
(2)银行家算法中的安全性检查时,Work[j]+Allocation[i,j]的含义是什么?
work[j]表示当前系统可用的第j类资源,Allocation[i][j]表示当前已经分配给进程i使用的第j类资源数量。Work[j]= Work[j]+ Allocation[i,j]这句的意思是目前进程已经利用手上资源完成相关工作了,这些已分配的资源可以重新归还系统了,所以系统可用的第j类资源work[j]就增加了,增加量就是当前进程想要归还的资源量Allocation[i][j] 。
(3)为什么银行家算法能有效避免死锁的发生?算法的主要思想是什么?
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。
(4)补全Bank()和Safe()函数; void Bank() //银行家算法 { int q; bool flag = true; printf(\"请输入请求的进程向量\\n\"); scanf(\"%d\",&q); printf(\"请输入%d个资源的请求资源数\\n\",n); for(int i=0;ineed[q][j]){ flag=false; } } if(flag){ for(int j=0;i
int Safe() //安全性算法 { //返回1表示安全,返回0表示不安全 int tp=1; int i; int Work[20]; int tmp=0,t=0; for(i=0;i
for(i=0;iWork[j]){ flag = false; } } //所有资源小于需求,允许分配 if(flag){ for(int j=0;j
for(i=0;i
(5)给出程序运行截图。