操作系统教程第三版南通大学_第1页
操作系统教程第三版南通大学_第2页
操作系统教程第三版南通大学_第3页
操作系统教程第三版南通大学_第4页
操作系统教程第三版南通大学_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、3.4 管程 为什么要引入管程v把分散在各进程中的临界区集中起来进行管理 ;v防止进程有意或无意的违法同步操作, v便于用高级语言来书写程序,也便于程序正确性验证。 管程定义和属性v管程的定义 管程是由局部于自己的若干公共变量及其说明和所有访问这些公共变量的过程所组成的软件模块。 v管程的属性 共享性: 安全性: 互斥性:管程的形式vtype 管程名=monitor v 局部变量说明;v 条件变量说明;v 初始化语句;vdefine 管程内定义的,管程外可调用的过程或函数名列表;vuse 管程外定义的,管程内将调用的过程或函数名列表;v过程名/函数名(形式参数表) v;v v . v过程名/函

2、数名(形式参数表) v;v v管程的结构condition c1wait(c1)condition cn wait(cn) 局部数据 条件变量 过程/函数1 过程/函数k出口 初始化代码入口管程等待调用过程的进程队列管程等待区管程的条件变量v条件变量-是出现在管程内的一种数据结构,且只有在管程中才能被访问,它对管程内的所有过程是全局的,只能通过两个原语操作来控制它。vwait( )-挂起调用进程并释放管程,直到另一个进程在该条件变量上执行signal( )。vsignal( )-如果存在其他进程由于对条件变量执行wait( )而被挂起,便释放之;如果没有进程在等待,那么,信号不被保存。v条件变

3、量与P、V操作中信号量的区别?管程问题讨论 使用signal释放等待进程时,可能出现两个进程同时停留在管程内。解决方法:执行signal的进程等待,直到被释放进程退出管程或等待另一个条件被释放进程等待,直到执行signal的进程退出管程或等待另一个条件v霍尔采用第一种办法,v汉森选择两者的折衷,规定管程中的过程所执行的signal操作是过程体的最后一个操作。 管程与进程作比较管程定义的是公用数据结构,而进程定义的是私有数据结构;管程把共享变量上的同步操作集中起来,而临界区却分散在每个进程中;管程是为管理共享资源而建立的,进程主要是为占有系统资源和实现系统并发性而引入的;管程是被欲使用共享资源的

4、进程所调用的,管程和调用它的进程不能并行工作,而进程之间能并行工作,并发性是其固有特性;管程是语言或操作系统的成分,不必创建或撤销,而进程有生命周期,由创建而产生至撤销便消亡。v霍尔方法使用P和V操作原语来实现对管程中过程的互斥调用,及实现对共享资源互斥使用的管理。v不要求signal操作是过程体的最后一个操作,且wait和signal操作可被设计成可以中断的过程。 Hoare管程数据结构(1) 1. mutexv对每个管程,使用用于管程中过程互斥调用的信号量mutex(初值为1)。v进程调用管程中的任何过程时,应执行P(mutex);进程退出管程时应执行V(mutex)开放管程,以便让其他调

5、用者进入。v为了使进程在等待资源期间,其他进程能进入管程,故在wait操作中也必须执行V(mutex),否则会妨碍其他进程进入管程,导致无法释放资源。Hoare管程数据结构(2) 2. next和next-countv对每个管程,引入信号量next(初值为0),凡发出signal操作的进程应该用P(next)挂起自己,直到被释放进程退出管程或产生其他等待条件。v进程在退出管程的过程前,须检查是否有别的进程在信号量next上等待,若有,则用V(next)唤醒它。next-count(初值为0),用来记录在next上等待的进程个数。 Hoare管程数据结构(3) 3.x-sem和 x-countv

6、引入信号量x-sem(初值为0),申请资源得不到满足时,执行P(x-sem)挂起。由于释放资源时,需要知道是否有别的进程在等待资源,用计数器x-count(初值为0)记录等待资源的进程数。v执行signal操作时,应让等待资源的诸进程中的某个进程立即恢复运行,而不让其他进程抢先进入管程,这可以用V(x-sem)来实现。 Hoare管程数据结构(4) 每个管程定义如下数据结构 :vtypedef struct InterfaceModulev /InterfaceModule是结构体的名字vsemaphore mutex; v /进程调用管程过程前使用的互斥信号量vsemaphore next;

7、 /发出signal的进程挂起自己的信号量vint next_count; /在next上等待的进程数v;vmutex=1;next=0;next_count=0;/初始化语句Hoare管程的enter( )操作vvoid enter(InterfaceModule &IM) v P(IM.mutex); /互斥进入管程vHoare管程的leave( )操作vvoid leave(InterfaceModule &IM) v /判有否发出过signal的进程? vif(IM.next_count0) v V(IM.next); v/有就释放一个发出过signal的进程v elsev V(IM.

8、mutex); /否则开放管程vHoare管程的wait( )操作vvoid wait(semaphore &x_sem,int &x_count,InterfaceModule &IM) v x_count+;/等资源进程个数加1,x_count初始化为0vif(IM.next_count0)/判有否发出过signal的进程v V(IM.next); /有就释放一个velse v V(IM.mutex); /否则开放管程vP(x_sem); /等资源进程阻塞自己,x_sem初始化为0vx_count-; /等资源进程个数减1 vHoare管程的signal( )操作vvoid signal(

9、semaphore &x_sem,int &x_count,InterfaceModule &IM) v if(x_count0) /有等资源进程吗?vIM.next_count+; /发出signal进程个数加1v V(x_sem); /释放一个等资源的进程v P(IM.next); /发出signal进程阻塞自己v IM.next_count-; /发出signal进程个数减1v vHoare管程的wait( )操作vvoid wait(semaphore &x_sem,int &x_count,InterfaceModule &IM) v x_count+; v if(IM.next_c

10、ount0) v V(IM.next); v else v V(IM.mutex); v P(x_sem); v x_count-; vHoare管程的signal( )操作vvoid signal(semaphore &x_sem,int &x_count,InterfaceModule &IM) v if(x_count0) v IM.next_count+; v V(x_sem); v P(IM.next); v IM.next_count-;v v1霍尔管程解决五个哲学家吃通心面问题(1)vtype dining_philosophers=monitorv enum thinking,

11、hungry,eating state5;v semaphore self5;v int self_count5;v InterfaceModule IM;v for (int i=0;i5;i+)/初始化,i为进程号v statei=thinking;v define pickup,putdown;v use enter,leave,wait,signal;霍尔管程解决五个哲学家吃通心面问题(2)vvoid pickup(int i) /i=0,1,.,4v enter(IM);vstatei=hungry;vtest(i);vif(statei!=eating)v wait(selfi,s

12、elf_counti,IM);v leave(IM);vvvoid putdown(int i) /i=0,1,2,.,4v enter(IM);v statei=thinking;v test(i-1)%5);v test(i+1)%5);v leave(IM);v霍尔管程实现五个哲学家吃通心面问题(3)vvoid test(int k) /k=0,1,.,4vif(state(k-1)%5!=eating)&(statek=hungry)v&(state(k+1)%5!=eating) vstatek=eating;vsignal(selfk,self_countk,IM);v v v2管

13、程解决生产者-消费者问题(1)vtype producer_consumer=monitorvitem Bk; /缓冲区个数vint in,out; /存取指针vint count; /缓冲中产品数vsemaphore notfull,notempty; /条件变量vint notfull_count,notempty_count;vInterfaceModule IM;vdefine append,take;vuse enter,leave,wait,signal;管程解决生产者-消费者问题(2)vvoid append(item x) v enter(IM);vif(count=k) /缓冲已满v wait(notfull,notfull_count,IM);vBin=x;vin=(in+1)%k;vcount+; /增加一个产品vsignal(notempty,notempty_count,IM); v /唤醒等待消费者

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论