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

  4.5 管程机制

  1.管程的引入

  信号量机制的引入解决了进程同步的描述问题,但信号量的大量同步操作分散在各个进程中不便于管理,还有可能导致系统死锁。如:生产者消费者问题中将P、V颠倒可能死锁。

  为此Dijkstra于1971年提出:把所有进程对某一种临界资源的同步操作都集中起来,构成一个所谓的秘书进程。凡要访问该临界资源的进程,都需先报告秘书,由秘书来实现诸进程对同一临界资源的互斥使用。

  2.管程概念

  Hansan为管程所下的定义是:管程定义了一个数据结构和能为并发进程所执行的一组操作,这组操作能同步进程和改变管程中的数据。

  管程的构成

  局部于管程的共享数据结构

  对共享数据结构进行操作的一组函数

  对局部于管程的数据设置初始值的语句

  管程的语法

  Monitor monitor _name;/*管程名*/

  variable declarations; /*共享变量说明*/

  void Entry P1(...) /*对数据结构操作的函数*/

  { … }

  void Entry P2(...)

  { … }

  ┆

  void Entry Pn(...)

  { … }

  {

  initialization code; /*设初值语句*/

  }

  管程的基本特性

  局部于管程的数据只能被局部于管程内的函数所访问。

  一个进程只有通过调用管程内的函数才能进入管程访问共享数据。

  每次仅允许一个进程在管程内执行某个函数。

  由于管程是一个语言成分,所以管程的互斥访问完全由编译程序在编译时自动添加上,无需程序员关心,而且保证正确。

  条件变量

  利用管程实现同步时,还应设置条件变量和在条件变量上进行操作的两个同步原语。

  条件变量用于区别各种不同的等待原因。其说明形式为: condition : x,y;

  同步原语wait和signal。wait使调用进程等待,并将它排在相应的等待队列上;signal唤醒等待队列的队首进程。使用方式为:x.wait,x.signal。

  3.用管程解决生产者-消费者问题

  建立一个管程并命名为Producer-Consumer,简称为PC,其中包括两个函数:put将产品放入缓冲池中;get从缓冲池中取出产品。

  还设置了条件变量notfull、notempty及变量count,count表示缓冲池中的产品数目。

  管程PC描述.doc

  4.利用管程解决哲学家进餐问题

  用三种不同状态表示哲学家的活动:进餐、饥饿、思考。(thinking,hungry,eating)state[5];

  为每个哲学家设置一个条件变量self(i),当哲学家饥饿又不能获得筷子时,用self来阻塞自己:

  管程设置三个函数:pickup取筷子,putdown放筷子,test测试是否具备进餐条件。

  管程DP描述.doc

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