2.前三种不会产生死锁,第四种进程推进顺序产生了死锁。
3.现在系统还剩资源2个。按照银行算法执行的话,不管是进程B还是进程C向系统提出1个资源的请求,系统都不能满足她们的要求,因为满足了她们的要求,系统中的进程没有一个能达到资源最大需求量,从而产生死锁。只有进程A对资源的请求可以满足。因为系统剩余资源数能够使A达到最大资源需求量,从而A可以运行结束,并释放他所占有的全部资源(4个),然后系统又可以满足B达到最大资源需求量而运行结束并释放他所占有的全部资源,最后进程C也可以达到最大资源需求量而运行结束。
银行家算法能保证在任何时刻至少有一个进程可以得到所需要的全部资源而执行结束,执行结束后,归还的资源加入到系统的剩余资源中,这些资源又至少可以满足另一个进程的最大需求 。于是保证了所有进程都能在有限时间内得到需要的全部资源,使系统一直出于安全状态。这样的资源分配当然避免了死锁。
6.(1)可能会发生死锁 (2分)
例如:进程P1,P2和P3分别获得资源S3,S1和S2后再继续申请资源时都要等
待(2分),这是循环等待。(或进程在等待新源时均不释放已占资源)
(2)可有几种答案:A.采用静态分配 (2分)由于执行前已获得所需的全部资源,故不会出现占有资源又等待别的资源的现象(或不会出现循环等待资源现象)。 (2分)
或B.采用按序分配 (2分)不会出现循环等待资源现象。(2分)
或C.采用银行家算法 (2分)因为在分配时,保证了系统处于安全状态。 (2分)
7.设置两个信号量来控制 A、B产品的存放数量,sa表示当前允许A产品比B产品多入库的数量,即在当前库存量和B产品不入库的情况下,还可以允许sa个A产品入库;sb表示当前允许B产品比A产品多入库的数量,即在当前库存量和A产品不入库的情况下,还可以允许sb个B产品入库。初始时,sa为M一1,sb为N一1,当往库中存放入一个A产品时,则允许存入B产品的数量也增加1;当往库中存放入一个B产品时,则允许存入A产品的数量也增加1。 产品A、B的入库过程描述如下:
int mutex=1; /*互斥信号量*/
int sa=M-1;
int sb=N-1;
main( )
{
while(1)
{
if(取的是A产品)
{
p(sa);
p(mutex); 将产品入库;
v(mutex);
v(sb):
}
else /*取的产品是B*/
{
p(sb);