第二章 进程的描述与控制

经典进程的同步问题

  1. 哲学家就餐问题
    避免死锁的解决方法:
    (1)、5位哲学家就餐只允许4位同时去拿左边的筷子,剩一个堵塞
    问题:为什么不让3个或者2个同时去拿左边的筷子?
    回答:为了充分利用资源,不让CPU空闲
    (2)、利用AND信号量,如果同时拿到两边的筷子就执行,否则就堵塞
    (3)、奇数号哲学家拿左边的筷子,偶数号哲学家拿右边的筷子,这样可能会出现1 ,2号哲学家同时争抢筷子

  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. 读者-写者问题
    (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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值