经典进程的同步问题
-
哲学家就餐问题
避免死锁的解决方法:
(1)、5位哲学家就餐只允许4位同时去拿左边的筷子,剩一个堵塞
问题:为什么不让3个或者2个同时去拿左边的筷子?
回答:为了充分利用资源,不让CPU空闲
(2)、利用AND信号量,如果同时拿到两边的筷子就执行,否则就堵塞
(3)、奇数号哲学家拿左边的筷子,偶数号哲学家拿右边的筷子,这样可能会出现1 ,2号哲学家同时争抢筷子 -
生产者-消费者问题
需考虑:
(1)两个生产者同时向一个盘子放入产品
(2)两个消费者同时取同一个盘子的产品
(3)盘子都空的情况下消费者去取
(4)盘子都满的情况下生产者去放。
解决方法:代码:
empty=n;full=0;mutex=1;
producer:
repeat
produce an item in nexp;
//empty和full两个信号量的设置解决(3)(4)问题
//两个wait顺序不能颠倒,先有盘子多个消费者才能去争抢资源
wait(empty);//是否有空的盘子
wait(mutex);//互斥信号量,解决上述(1)(2)问题
buffer[in]:=nexp;
in:=(in+1) mod n;//进入临界区代码执行in+1后
signal(mutex);//释放信号量mutex
signal(full);//释放一个产品,产品数+1,生产者可取
until false;
consumer:
repeat
wait(full);//盘子中是否有产品
wait(mutex);
nextc:=buffer(out);
out:=(out+1) mod n;
signal(mutex);
signal(empty);//释放盘子,消费者可放
- 读者-写者问题
(1)读者优先的方式(读者优先体现在一旦读者争抢到读资源,要等待所有读者都读完才释放资源)
Reader:
repeat
//rmutex的作用是防止多个读者同时去争抢wmutex资源,或者多个读者可以同时释放资源
wait(rmutex);//读者之间的互斥
if Readcount=0 then wait(wmutex);//第零个读者去和写者争抢资源
Readcount:=Readcount+1;
signal(rmutex);//+1之后释放资源
...
perform read opration;
...
wait(rmutex)//不释放wmutex,多个读者
Readcount:=Readcount-1;
if Readcount=0 then signal(wmutex);//没有读者,即释放资源
signal(rmutex);//释放rmutex,回到初值
until false;
Writer:
do{
wait(wmutex);//与读者争抢资源
perform write operation;
signal(wmutex);//写完释放资源
}while(True);
(2)、使用AND型信号量(写者优先)
L=RN,mx=1;
//若读者先来,L-1,(L,RN,0)控制写者获取不了资源
//若写着先来,mx-1,(mx,1,0)控制读者获取不了资源
Reader:
repeat
Swait(L,1,1);
Swait(mx,1,0);//起到一个开关的作用
...读操作...
Ssignal(L,1);
until false;
Writer:
repeat
Swait(mx,1,1;L,RN,0);//后面的0为开关作用
写操作;
Ssignal(mx,1);
until false;