[25][30][单选]有 n 个生产者进程 P1、P2、...、Pn,其伪代码如下:
item buffer[n]; int mutex = 1; int empty = n; int full = 0; int i = 0; producer{ while(1 { produce_item(; wait(mutex; if (empty > 0 { buffer[i] = item; i = (i + 1 % n; signal(mutex; signal(empty; signal(full; } else { signal(mutex; } } consumer{ while(1 { wait(full; wait(mutex; if (full > 0 { item = buffer[i]; i = (i + 1 % n; signal(mutex; signal(empty; } else { signal(mutex; } consume_item(; } 这些生产者进程在执行过程中,可能会出现下列哪一种现象?
产生饥饿
正常运行
出现死锁
可能死锁
答案
可能死锁
解析
当进行 n 次生产后有 n 个生产者,每人都生产了一个产品后,缓冲区全部占满empty = 0生产者执行 P(mutex后此时 mutex = 0,又执行了 P(empty,由于 empty = -1,使生产者因无可用缓冲区而在 empty 上等待。若再有一个消费者进程到达,执行 P(full此时 full = 0,又执行了 P(mutex,由于 mutex = -1,使消费者因无可用缓冲区而在 mutex 上等待。此时,生产者、消费者都因此等待对方来唤醒自己处于循环等待状态。生产者等待消费者释放一个空缓冲区,而消费者等待生产者释放互斥信号量 mutex,这样便形成了死锁状态。所以选择 D 选项。
转载请注明出处。