1 / 28

§4.6 管程的概念

§4.6 管程的概念. 一、管理的引出:. 前述的各种互斥、同步手段如 Lock, unlock, P, V 操作,虽然都有效地实现了互斥与同步,但都存在下列一些通病(缺点):. 总之说明:信号量 (P,V) 不是最安全的进程通讯手段。. 引出较高级的进程通信原语即管程 (monitor) 可解决这一问题。. (1) Lock, unlock, P, V 操作代码均由用户编写,计算机系统无法有效地控制和管理这些 P , V 操作;. (2) 分散在各进程中的临界段没有集中加以管理;. (3) 用户编程时难免会发生不正确地使用 P , V 操作,这样可能导致死锁;.

yanni
Download Presentation

§4.6 管程的概念

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. §4.6 管程的概念 一、管理的引出: 前述的各种互斥、同步手段如Lock, unlock, P, V操作,虽然都有效地实现了互斥与同步,但都存在下列一些通病(缺点):

  2. 总之说明:信号量(P,V)不是最安全的进程通讯手段。总之说明:信号量(P,V)不是最安全的进程通讯手段。 引出较高级的进程通信原语即管程(monitor)可解决这一问题。 (1) Lock, unlock, P, V操作代码均由用户编写,计算机系统无法有效地控制和管理这些P,V操作; (2) 分散在各进程中的临界段没有集中加以管理; (3) 用户编程时难免会发生不正确地使用P,V操作,这样可能导致死锁; 而编绎程序或O.S都无法发现和纠正此类错误。

  3. 二、管程定义: Dijkstra提出为每个共享资源设立一个“秘书”来管理对它的访问。一切来访者都要通过秘书,而秘书每次仅允许一个来访者(进程)访问共享资源。这样既便于系统管理共享资源,又能保证互斥访问和进程间同步。 以后Hansen在并行PASCAL语言中,把“秘书”概念改为管程(monitor)。

  4. 1. “ 一个管程是由若干过程、变量和其它数据结构形成的集合。它是管理进程间同步的机制,它保证进程互斥地访问共享变量,并且提供了一个方便的阻塞和唤醒进程的机构。” 2. 其表现形式为一个特殊种类的模块或软件包。

  5. 管程由两部分构成: (1) 局部于该管程的数据结构 ––– 共享变量。该共享变量表示其相应的共享资源的状态 (通常系统为每个共享资源设置一个管程); (2) 局部于该管程对上述数据结构进行规定的操作的若干个过程。

  6. 局部于管程内的数据结构只能被局部于管程内的过程所访问,不能被管程外的过程对其进行操作。反之,局部于管程内的过程只能访问管程内的数据结构。因此管程相当于围墙一样把共享变量(数据结构)和对它进行的若干操作过程围了起来。进程要共享资源(进入围墙使用某操作过程)就必须经过管程(围墙的门)才能进入,管程每次只允许一个进程进入管程内,即互斥地访问共享资源。局部于管程内的数据结构只能被局部于管程内的过程所访问,不能被管程外的过程对其进行操作。反之,局部于管程内的过程只能访问管程内的数据结构。因此管程相当于围墙一样把共享变量(数据结构)和对它进行的若干操作过程围了起来。进程要共享资源(进入围墙使用某操作过程)就必须经过管程(围墙的门)才能进入,管程每次只允许一个进程进入管程内,即互斥地访问共享资源。

  7. 我们仍然以生产者和消费者问题为例,看看管程方法如何实现进程之间同步。仍使用有N个缓冲区的环形缓冲区,每个缓冲区可容纳一个数据记录。In是空缓冲区头指针,Out是满缓冲区头指针。用notfull作为没有满缓冲区的条件变量,notempty作为没有空缓冲区的条件变量。用Count作为当前满缓冲区数量。下面是用管程方法的同步实现。我们仍然以生产者和消费者问题为例,看看管程方法如何实现进程之间同步。仍使用有N个缓冲区的环形缓冲区,每个缓冲区可容纳一个数据记录。In是空缓冲区头指针,Out是满缓冲区头指针。用notfull作为没有满缓冲区的条件变量,notempty作为没有空缓冲区的条件变量。用Count作为当前满缓冲区数量。下面是用管程方法的同步实现。

  8. Program producer/consumermoniter boundedbuffer buffer: array [0..N] of Record; In, Out: integer; notempty, notfull: Condition; Procedure append (x: Record);beginif Count=N then WaitC (notempty); /.缓冲区满,等待./ buffer[In]:= x; In = In+1 modN;Count = Count+1 SignalC (notfull);end

  9. procedure take (x: Record);begin if Count = 0 then WaitC (notfull); /.缓冲区空,等待./ x: = buffer [Out]; Out: = Out+1 mod N Count: = Count–1 SignalC (notempty);end begin /.管程体./ In: = Out: = Count: = 0 /.初始化./end 以上为管程。

  10. begin ( main program )parbeginproducer; consumer;parendend ... Program producer;var x: record;beginrepeat生产x;append (x);foreverend Procedure consumervar x:record;begin repeat take(x);消费或处理 x;forever end

  11. §4.7 作业讲评及复习 §4.1 顺序程序和并行程序 §4.2 进程同步与互斥 一、概念 二、临界段问题 1. 临界段,临界资源。 2. 怎样解决互斥问题。 3. 软件方法 ––– 测试与设置flay。 4. 硬件技术 ––– 临界区原语操作 Lock, unlock。 三、信号量 ––– 解决同步问题 (P,V操作)

  12. 同步 ––– 进程有着时序上关系。 互斥 ––– 排它使用的资源,是同步的一种特殊情况,一种特殊的同步。指CS上有特殊时序,每次仅有一个进程进入CS。

  13. 行式打印机 卡片输入机 并发执行实例 ––– 誊抄 (复写) 用卡片输入机,尽快地把一个文本复写到行式打印机上。

  14. 一、一个循环顺序程序的誊抄方案 program transcribel begin flag: = False; while flag = false do begin input; 从读卡机输入记录 output; 输出到行打机上 end end

  15. 该程序功能:每次从读卡机输入一个纪录,并把它输出到行打机上,直到布尔量flay变真为止。该程序功能:每次从读卡机输入一个纪录,并把它输出到行打机上,直到布尔量flay变真为止。 这一方案的特点是简单、正确,然而这一解法是低效的。假定读卡机速度为:1000卡/分钟,打印机速度为:600行/分钟,那么,最高的传输速度仅为375行/分。 原因:没有充分利用读卡机和行打机的并行操作能力,系统的设备利用率不高。

  16. 二、两个并发程序的誊抄方案 这一方案需设置一个缓冲区(假设大小为一个记录信息),另外,将方案分成两部分:一部分负责将读卡机的信息送buffer;另一部分负责从buffer取出信息并打印,这样可使誊抄速度提高到600行/分钟,即达到最慢的那个设备的传输速率。 输入程序 输出程序 行打机 缓冲区 卡片输入机

  17. program transcribe2 begin flag-in: = false; flag-out: = false; cogegin while flag-in = false do begin Input; 从读卡机输入纪录 send; 发送到缓冲区 end while flag-out = false do begin Receive; 从缓冲区接收信息 output; 输出到行打机 end coend end P1输入程序 P2输出程序

  18. [注]:输入程序不断地从读卡机读入信息送buffer,而输出程序不断地从buffer中取出信息送行打机。但由于两者速度不一样,若对这两个程序的执行不加任何限制,则会出现下列问题。(这两个程序是并发执行的)。[注]:输入程序不断地从读卡机读入信息送buffer,而输出程序不断地从buffer中取出信息送行打机。但由于两者速度不一样,若对这两个程序的执行不加任何限制,则会出现下列问题。(这两个程序是并发执行的)。 (1) 若打印速度高于输入速度,导致要打印的内容还没有送入buffer,打印的并不是所需的(有可能是前次的)。 (2) 反之,则打印机还未打印的内容可能被新输入的覆盖,这样,打印结果,一部分正确,一部分为以后的信息,还有一些应打印的信息却丢失了。

  19. 总之,在这种方案下,打印的结果是不正确的,虽然提高了设备的利用率,但不能保证正确的誊抄。这是不可取的。总之,在这种方案下,打印的结果是不正确的,虽然提高了设备的利用率,但不能保证正确的誊抄。这是不可取的。 原因:共用一个buffer,两设备的速度不相匹配。

  20. 三、 三个并发程序的誊抄方案 输入buffer 输出buffer g (输出序列) f (输入序列) 输出 输入 复制 行打机 B2 B1 卡片输入机  输入Input:Get (B1, f);从输入序列 f 得到一个记录B1;  复制 copy: B2 = B1;把记录从B1复制到B2;  输出 output:put (B2, g);将记录从B2放到输出序列g上。

  21. program transcribe3; var B1, B2: T; flag: boolean begin if not Empty (f) then begin flag: = false; get (B1, f) repeat B2 = B1; cobegin put (B1, g); if empty (f) then flag: = true else get (B1, f ); coend until flag; end

  22. 上述程序中的repeat含有三个分语句,改写为:  复制语句 copy  “ B2: = B1”;  输出语句 put  “ put (B2, g)”;  输入语句 get  “ if empty (f) then flag: = true else get (B1, f)”。

  23. 程序改写成:repeat copy; {复制} cobegin put; {输入、输出 get; 并行运行} coend until flag; 对比顺序处理时,工作模式为: G1 C1 G2 P1 C2 使得输入、输出的两设备可并行工作,提高了设备利用率。 G3 P2 C3 P3

  24. 若程序员把“ repeat ––– until”重复语句写成 Get repeat begin copy put Get end until 三个并发进程

  25. 假定运行第一次为:B1=R2, B2=R1, f=(R3, R4, … Rm) g=(R1),则运行第二次后,copy, put, get穿插执行六种方案:  copy, put, get 导致 G=(R1, R2) 正确复制在输入、出前完成  copy, get, put  put, copy, get 导致 G=(R1, R1) 错,put在copy前前一个记录再度输出  put, get, copy  get, put, copy  get, copy, put 导致 G=(R1, R3)错,把R2冲了。

  26. 由上可知:结果不确定,出现了三种可能的结果。由上可知:结果不确定,出现了三种可能的结果。 如果我们要复制一个具有1000个记录的序列,那么将会有31000个结果,即可再现现场几乎不可能,只有1/31000这个就叫做结果的不确定性(也可称为与执行时间和速度有关),使我们难以找到错误的所在。 主要原因:由于并行程序的共享性和并行性。

  27. 用信号量实现同步 解:共享资源为S,T 设4个信号量SA,SB,TA,TB分别表示: SA:buffer1中是否有信息; SB:buffer1中信息是否取走; TA:buffer1中是否有信息; TB:buffer2中信息是否取走;

  28. begin SA: = SB = TA = TB = 0; repeat cobegin P1: begin get; V(SA); P(SB); end P2: begin P(SA); copy V(SB); V(TA) P(TB) end P3: begin P(TA); put; V(TB); end coend forever; end

More Related