您现在的位置:学赛首页 > 研究生院 > 软件学院 > 正文
操作系统第四章-进程同步与通信[9]
http://www.educity.cn 作者:研究生院 来源:学赛网 2008年4月22日 发表评论 进入社区

  共享变量readcount,用于记录当前正在读数据集的读进程数目,初值为0。

  读者描述

  p(mutex);

  if (readcount==0) p(writer);

  readcount=readcount+1;

  v(mutex);

  读数据集;

  p(mutex) ;

  readcount=readcount-1 ;

  if (readcount==0) v(writer);

  v(mutex);

  写者描述

  p(writer);

  写数据集;

  v(writer);

  对读者写者问题的理解

  请注意对信号量mutex意义的理解。

  mutex是一个互斥信号量,用于使读进程互斥地访问共享变量readcount。该信号量并不表示读进程的数目,表示读进程数目的是共享变量readcount。

  3. 哲学家进餐问题

  哲学家进餐问题描述有五个哲学家,他们的生活方式是交替地进行思考和进餐,

  哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,

  平时哲学家进行思考,饥饿时便试图取其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐,

  进餐完毕,放下筷子又继续思考。

  用信号量解决哲学家进餐问题

  用五支筷子的信号量构成信号量数组:

  semaphore stick[5] ;

  所有信号量初值为1,

  笫i个哲学家的活动算法描述

  p(stick[i]);

  p(stick[(i+1) % 5]);

  进餐;

  v(stick[i]);

  v(stick[(i+1) % 5]);

  思考;

  算法描述存在的问题

  上述算法有可能引起死锁。对于这样的死锁问题有如下办法解决:

  至多允许四个哲学家同时进餐。

  仅当左、右两支筷子均可用时,才允许拿起筷子进餐。

  奇数号哲学家先拿左筷子再拿右筷子,偶数号哲学家相反。

[1]  [2]  [3]  [4]  [5]  [6]  [7]  [8]  [9]  [10]