PV操作经典问题

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机制的信号量处理。

你可能感兴趣的:(PV操作经典问题)