管程 管程的基本概念 管程的汉森方法 ●管程的霍尔方法
管程 ⚫ 管程的基本概念 ⚫ 管程的汉森方法 ⚫ 管程的霍尔方法
管程:基本概念 ●管程是由若公共变量及其说明和 所有访问这些变量的过程所组成 ●管程把分散在各个进程中互斥地访 问公共变量的那些临界区梟中起来 管理。程的局部变量只能由该管 程的过程存取 ●进程只能互斥地调用管程中的过程
管程:基本概念 ⚫管程是由若干公共变量及其说明和 所有访问这些变量的过程所组成 ⚫管程把分散在各个进程中互斥地访 问公共变量的那些临界区集中起来 管理,管程的局部变量只能由该管 程的过程存取 ⚫进程只能互斥地调用管程中的过程
管程有以下属性 ●●共享性:管程中的移出过程可被所有要调 用管程的进程所共享。 安全性:管程的局部变量只能由该管程的 过程存取,不允许进程或其它管程来直接存取 个管程的过程也不应该存取任何非局部于它 的变量 互斥性:在任一时刻,共享资源的进程可 访问管理该资源的过程,最多只有一个调用者 能真正地进入管程,而任何其它调用者必须等 待。直到访问者退出
管程有以下属性: ⚫ ⚫ 共享性:管程中的移出过程可被所有要调 用管程的进程所共享。 ⚫ ⚫ 安全性:管程的局部变量只能由该管程的 过程存取,不允许进程或其它管程来直接存取, 一个管程的过程也不应该存取任何非局部于它 的变量。 ⚫ ⚫ 互斥性:在任一时刻,共享资源的进程可 访问管理该资源的过程,最多只有一个调用者 能真正地进入管程,而任何其它调用者必须等 待。直到访问者退出
管程:基本形式 TYPE= MONITOR 〈管程变量说明 define use; procedure〈过程名〉(形式参数表>); begin 过程体>; end: ●●●●● procedure; en d begin 〈管程的局部数据初始化语旬〉 end
管程:基本形式 TYPE = MONITOR ; define ; use ; procedure (); begin ; end; …… procedure (); begin ; end; begin ; end;
管程:条件变量 ●条件变量( condition variables) 当调用管程过程的进程无法运行时, 用于阻蜜选程的傖号量 ●同步原语Wait:当一个管程过程发现 无法继续时(如发现没有可用资源 时),它在棊些条件变量上执行Wait, 这个动作引起调用进程阻塞 同步原语 signal
管程:条件变量 ⚫条件变量(condition variables): 当调用管程过程的进程无法运行时, 用于阻塞进程的信号量 ⚫同步原语wait:当一个管程过程发现 无法继续时(如发现没有可用资源 时),它在某些条件变量上执行wait, 这个动作引起调用进程阻塞 ⚫同步原语signal
管程:结构 等待调用 进程队列 管程等待区域 入口 管程 condition c1 局部数据 wait(c1) 条件变量 过程1 condition cn wait(cn 过程n TF gent queue signal(c 变量初始化代码 出口
管程:结构 condition c1 wait(c1) … condition cn wait(cn) Urgent queue signal(ci) 局部数据 条件变量 过程1 过程n 出口 变量初始化代码 入口 管程 等待调用 进程队列 管程等待区域
管程:示例 TYPE SSU E MONITOR var busy boolean; nobusy semaphore: define require, return; use wait, signal procedure requi re beg in if busy then wait( nobusy);/*调用进程加入等待队列*/ busy := ture; end procedure return b egIn busy false; signal (nobusy) /*从等待队列中释放进程* end begin /*管程变量初始化*/ busy false end
TYPE SSU = MONITOR 管程:示例 var busy : boolean; nobusy : semaphore; define require, return; use wait, signal; procedure require; begin if busy then wait(nobusy); /*调用进程加入等待队列*/ busy := ture; end; procedure return; begin busy := false; signal(nobusy); /*从等待队列中释放进程*/ end; begin /*管程变量初始化*/ busy := false; end;
管程:问题 ●当使用 signa1释放一个等待进程时,可能 出现两个进程同时停留在管程内。解决方 法 执行 signa的进程等待,直到被释放选 程退出管程或等待另一个条件 被释放进程等待,直到执行 signal的进 程退出管程或等待另一个亲件 尔采用了第一种办法 ●汉森选择了两者的折裏,他规定管程中的 过程所执行的 signal操作是过程体的最后 一个操作
管程:问题 ⚫ 当使用signal释放一个等待进程时,可能 出现两个进程同时停留在管程内。解决方 法: • 执行signal的进程等待,直到被释放进 程退出管程或等待另一个条件 • 被释放进程等待,直到执行signal的进 程退出管程或等待另一个条件 ⚫ 霍尔采用了第一种办法 ⚫ 汉森选择了两者的折衷,他规定管程中的 过程所执行的signal操作是过程体的最后 一个操作
管程的实现:汉森方法 ●每个管程均使用的一个数据类型 TYPE interf record intem: semaphore;/*开放管程的信号量* count1: integer;/等待调用的进程个数*/ count2: integer;/*调用了管程中的过程且不 END 处于等待状态的进程个数*
管程的实现:汉森方法 ⚫每个管程均使用的一个数据类型: TYPE interf = RECORD intsem : semaphore; /* 开放管程的信号量 */ count1 : integer; /* 等待调用的进程个数 */ count2 : integer; /* 调用了管程中的过程且不 END; 处于等待状态的进程个数 */
管程的现:汉森方法 ●调用查看原语 check:如果管程是开放的, 则执行这条原语后关闭管程相应进程继 续执行:如果管程是关闭的,则执行这条 原语后相应进程被置成等待调用状态 procedure check(var IM interf) beg in if M count 2=0 then M, count2:=M count2 1 ese beg in W(IM intem.M count1+ 1 IM. count 1 end end
管程的实现:汉森方法 ⚫ 调用查看原语check:如果管程是开放的, 则执行这条原语后关闭管程,相应进程继 续执行;如果管程是关闭的,则执行这条 原语后相应进程被置成等待调用状态 procedure check(var IM interf); begin if IM.count2 = 0 then IM.count2 := IM.count2 + 1; else begin IM.count1 := IM.count1 + 1; W(IM.intsem); end; end;