操作系统中多生产者多消费者问题中,关于生产者或消费者中的两个P操作是否可以互换问题

本文是对网上答复做的补充和修改,变动很大,对很多内容是持有相反观点的,并对一些内容进行了解释,这样使整个过更加清晰些,不为奖励,只为和我一样在理解很浅时的同学解惑。字可能很多,但我希望你读完,尤其是你一头雾水时。

生产者

While(true){ 

    ​生产一件产品;

    ​P(full);

    ​P(mutex);

    ​放入一件产品;

    ​V(mutex);

    ​V(empty);

}

消费者

While(true){ 

    ​P(empty);

    ​P(mutex);

    ​取出一件产品;

    ​消费一件产品;

    ​V(mutex);

    ​V(full);

}

假设一种情况(缓冲区满的情况),则:full=5,empty=0,mutex=1

在生产者—消费者问题中,如果将两个P操作,即P(full)和P(mutex)互换位置,或者P(empty)和P(mutex)互换位置,都可能引起死锁。

考虑系统中缓冲区全满,若一生产者进程先执行了P(mutex)操作并获得成功,当消费者执行完P(empty)操作接着执行P(mutex)时,它(消费者)将因失败而进入阻塞状态

虽然empty本身初值就为0,但是在缓冲区满时,empty就应该变为满但是对缓冲区的操作就是对临界资源的操作,是互斥的,这时生产者还在因为缓冲区满生产东西了东西而放不入缓冲区 ,阻塞在p(full)操作。导致无法V(mutex)这是一个消费者跟生产者互斥操作临界资源阶段,有些同学可能会理解错  “这里说的跟那位答题者不太一样,我认为他把缓冲区满的条件加上了,但没改消费客可同步消费的数量”)

,它(消费者)期待生产者执行V(mutex)来唤醒自己。但是在此之前,(生产者)它不可能执行V(mutex)操作,从而使企图通过P(mutex)进入自己的临界区的其他生产者和所有的消费者进程全部进入阻塞状态

消费者一直在等待V(mutex)的唤醒/释放,生产者因为缓冲区满而一直等待消费者取走物品),从而引起系统死锁。

 

通俗的话来讲:生产者卡在放不进去东西,消费者因为生产者放不进去东西,也就是对临界资源的操作一直无法完成而互斥,导致所有消费者,和其他生产者卡在P(mutex)无法对临界资源操作

类似地,消费者两个P操作互换。在缓冲区为空时,消费者进程先执行P(mutex),然后会卡在P(empty),生产者后执行P(mutex)时会因为对临界资源操作的互斥而卡住。也成了死锁。

V(full)和V(mutex)互换位置,或者V(empty)和V(mutcx)互换位置,则不会引起死锁,其影响只是使临界资源的释放略为推迟一些。

有关网上关于(在生产者和消费者问题中,如果将P操作位置互换,会产生什么结果)问题的答题者的答复网址如下(可以和本文对比来看)

https://zhidao.baidu.com/question/277301144.html?qbl=relate_question_1&word=%B2%D9%D7%F7%CF%B5%CD%B3%B6%E0%C9%FA%B2%FA%D5%DF%B6%E0%CF%FB%B7%D1%D5%DFP%28S1%29%2C%20P%28M%29%20%C4%DC%BB%A5%BB%BB%C2%F0%3F&hideOtherAnswer=true&newAnswer=1

(侵删)

你可能感兴趣的:(操作系统中多生产者多消费者问题中,关于生产者或消费者中的两个P操作是否可以互换问题)