PV(wait/singal)在考操作系统的时候经常被问到,这篇小文就整理一下几个常见的PV问题。
1. 生产者-消费者问题
假定在生产者和消费者之间的公用缓冲池中,具有n个缓冲区,这时可利用互斥信号量mutex实现诸进程对缓冲池的互斥使用。利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量。
又假定这些生产者和消费者相互等效,只要缓冲池未满,生产者便可以将消息送入缓冲池;只要缓冲池未空,消费者便可以从缓冲池取走一个信息。
对生产者和消费者问题可以描述如下:
mutex, empty, full : semaphore := 1, n, 0;
buffer : array[0, ..., n-1] of item;
in, out : integer := 0, 0;
producer() {
while(true) {
...
produce an item nextp;
...
wait(empty);
wait(mutex);
buffer[in]=nextp;
in=(in+1)%n;
single(mutex);
signal(full);
}
}
consumer() {
while(true) {
wait(full);
wait(mutex);
p=buffer[out];
out=(out+1)%n;
single(mutex);
signal(empty);
...
consume product p
...
}
}
2. 哲学家进餐问题
该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五只筷子和五个碗,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有他拿到两只筷子的时候才能进行进餐。进餐完毕,放下筷子继续思考。
process(i) {//第i个哲学家
while(true) {
think;
sswait(chopstick[(i+1)%5],chopstick[i]);
eat;
ssignal(chopstick[(i+1)%5],chopstick[i]);
}
}
这是使用AND机制的信号量处理。
网友评论