OS---经典同步问题

哲学家进餐问题

五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在桌子上有五只碗和五只筷子。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。

由描述可知:五只筷子最多只有两个人可以同时进餐,而且不能是相邻的两个人。

1)记录型信号量解决哲学家进餐问题

筷子是临界资源,在一段时间内只允许一个哲学家使用。为实现对筷子的互斥使用,用一个信号量表示一只筷子,五个信号量构成信号量数组。

    Var chopstick: array [0, …, 4] of semaphore;

    所有信号量均被初始化为1

i 位哲学家的活动可描述为:

repeat

        //拿左筷子
          wait(chopstick[ i ]);
        //拿右筷子
          wait(chopstick[ ( i +1) mod 5] );

     …
        //进餐
     eat;

     …
        //放左筷子
          signal(chopstick[ i ]);
        //放右筷子
          signal(chopstick[ ( i +1) mod 5] );

     …

     think;

until  false;

2)就餐死锁问题

假如五位哲学家同时拿起左边的筷子时,就会使五个信号量chopstick均为0,他们再试图去拿右边的筷子时,都将因无筷子可拿而无限等待。

解决方法:

1,至多只允许有四位哲学家同时去拿左边的筷子,最终能保证至少有一位哲学家能够进餐,并在用毕后释放出他用过的两只筷子,从而使更多的哲学家能够进餐。---限制并发执行的进程数

2,仅当哲学家的左右两只筷子均可用时,才允许他拿起筷子进餐。---采用AND信号量

     在哲学家进餐问题中,要求每个哲学家先获得两个临界资源(筷子)后方能进餐。

Var chopstick: array [0, …, 4] of semaphore:=(1, 1, 1, 1, 1);
Process i
     repeat
         think;
         Swait(chopstick[ ( i +1) mod 5] , chopstick[ i ] );
         eat;
         Ssignal(chopstick[ ( i +1) mod 5] , chopstick[ i ] );     
     until  false;

3,使一位哲学家先拿右边的筷子再拿左边的筷子,这样总能保证,至少有一位哲学家可以同时获得两只筷子。

 

读者——写者问题

○一个数据文件被多个进程共享。Reader进程只要求读文件,Writer进程要求写入内容。

○合理的同步关系是:

  • 多个读进程可同时读
  • Writer进程与任何其他进程(包括Reader进程或其他Writer进程)不允许同时访问文件。

解决思路

  • 如何设置互斥信号量?
    • 所有进程都对一个互斥信号量m进行操作?
      • 不符合读者之间不需要互斥的要求。

 

写者操作要和其他的都互斥,所以必要判断互斥信号量,

没有变化:

只有第一个读进程进行互斥判断;

只要有一个读进程在读就不释放,写进程就不能写。(一种读者优先的方式)

读者Reader : 

//除第一个读者外,其他读者不申请互斥信号量,防止读者之间产生互斥
begin
repeat
   wait(rmutex);
   if Readcount=0 then wait(wmutex);
   Readcount :=Readcount +1;
    signal(rmutex);
   …
   perform read operation;
   …
   wait(rmutex);
   Readcount :=Readcount -1;
   if Readcount=0 then signal(wmutex);
    signal(rmutex);

until  false;
end

 

 利用信号量集机制解决读者——写者问题

  • 引入信号量L控制读者的数目,初值为RN
  • 互斥信号量mx,初值为1
  • 利用信号量集的一种特殊情况——开关。

读者:判断L,判断是否有写者;

写者:判断是否有读者;

读者:

reader : 
repeat
   Swait(L, 1, 1);
   Swait(mx,1, 0);
   …
   读操作;
   …
   Ssignal(L, 1);
until  false;

 

写者:

writer : 
repeat
   Swait(mx, 1, 1; L, RN, 0);
   写操作;
   Ssignal(mx, 1);
until  false;

数量变化在对方身上,所以说开关由对方掌握

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值