PV(wait/singal)在考操作系統(tǒng)的時(shí)候經(jīng)常被問到,這篇小文就整理一下幾個(gè)常見的PV問題。
1. 生產(chǎn)者-消費(fèi)者問題
假定在生產(chǎn)者和消費(fèi)者之間的公用緩沖池中,具有n個(gè)緩沖區(qū),這時(shí)可利用互斥信號(hào)量mutex實(shí)現(xiàn)諸進(jìn)程對(duì)緩沖池的互斥使用。利用信號(hào)量empty和full分別表示緩沖池中空緩沖區(qū)和滿緩沖區(qū)的數(shù)量。
又假定這些生產(chǎn)者和消費(fèi)者相互等效,只要緩沖池未滿,生產(chǎn)者便可以將消息送入緩沖池;只要緩沖池未空,消費(fèi)者便可以從緩沖池取走一個(gè)信息。
對(duì)生產(chǎn)者和消費(fèi)者問題可以描述如下:
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. 哲學(xué)家進(jìn)餐問題
該問題是描述有五個(gè)哲學(xué)家共用一張圓桌,分別坐在周圍的五張椅子上,在圓桌上有五只筷子和五個(gè)碗,他們的生活方式是交替地進(jìn)行思考和進(jìn)餐。平時(shí),一個(gè)哲學(xué)家進(jìn)行思考,饑餓時(shí)便試圖取用其左右最靠近他的筷子,只有他拿到兩只筷子的時(shí)候才能進(jìn)行進(jìn)餐。進(jìn)餐完畢,放下筷子繼續(xù)思考。
process(i) {//第i個(gè)哲學(xué)家
while(true) {
think;
sswait(chopstick[(i+1)%5],chopstick[i]);
eat;
ssignal(chopstick[(i+1)%5],chopstick[i]);
}
}
這是使用AND機(jī)制的信號(hào)量處理。