§4.6 管程的概念

28
§4.6 管管管管管 管管管管管管 一、: 前前前前前前前 前前前前前 Lock, unloc k, P, V 前前 前前前前前前前前前前前前前前前 前前前前前前 ,, 前前前 ( 前前 )

Upload: yanni

Post on 25-Feb-2016

82 views

Category:

Documents


9 download

DESCRIPTION

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

TRANSCRIPT

Page 1: §4.6   管程的概念

§4.6 管程的概念一、管理的引出:

前述的各种互斥、同步手段如 Lock, unlo

ck, P, V 操作,虽然都有效地实现了互斥与同步,但都存在下列一些通病 ( 缺点 ) :

Page 2: §4.6   管程的概念

(1) Lock, unlock, P, V 操作代码均由用户编写,计算机系统无法有效地控制和管理这些 P , V 操作;

(2) 分散在各进程中的临界段没有集中加以管理;(3) 用户编程时难免会发生不正确地使用 P , V 操作,

这样可能导致死锁;而编绎程序或 O.S 都无法发现和纠正此类错误。

总之说明:信号量 (P,V) 不是最安全的进程通讯手段。引出较高级的进程通信原语即管程 (monitor) 可解决这一问题。

Page 3: §4.6   管程的概念

二、管程定义:Dijkstra 提出为每个共享资源设立一个“秘

书”来管理对它的访问。一切来访者都要通过秘书,而秘书每次仅允许一个来访者 ( 进程 ) 访问共享资源。这样既便于系统管理共享资源,又能保证互斥访问和进程间同步。

以后 Hansen 在并行 PASCAL 语言中,把“秘书”概念改为管程 (monitor) 。

Page 4: §4.6   管程的概念

1. “ 一个管程是由若干过程、变量和其它数据结构形成的集合。它是管理进程间同步的机制,它保证进程互斥地访问共享变量,并且提供了一个方便的阻塞和唤醒进程的机构。”

2. 其表现形式为一个特殊种类的模块或软件包。

Page 5: §4.6   管程的概念

管程由两部分构成:(1) 局部于该管程的数据结构 ––– 共享变量。该共享

变量表示其相应的共享资源的状态 ( 通常系统为每个共享资源设置一个管程 ) ;

(2) 局部于该管程对上述数据结构进行规定的操作的若干个过程。

Page 6: §4.6   管程的概念

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

才能进入,管程每次只允许一个进程进入管程内,即互斥地访问共享资源。

Page 7: §4.6   管程的概念

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

作为没有满缓冲区的条件变量, notempty 作为没有空缓冲区的条件变量。用 Count 作为当前满缓冲区数量。下面是用管程方法的同步实现。

Page 8: §4.6   管程的概念

Program producer/consumermoniter boundedbuffer buffer: array [0..N] of Record; In, Out: integer; notempty, notfull: Condition;

Procedure append (x: Record); begin if Count=N then WaitC (notempty); /. 缓冲区满,等待 ./ buffer[In]:= x; In = In+1 modN; Count = Count+1 SignalC (notfull); end

Page 9: §4.6   管程的概念

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

以上为管程。

Page 10: §4.6   管程的概念

Program producer;var x: record; begin repeat 生产 x ; append (x); forever end Procedure consumer var x:record; begin repeat take(x); 消费或处理 x; forever end

begin ( main program ) parbegin producer;

consumer; parendend

...

Page 11: §4.6   管程的概念

§4.1 顺序程序和并行程序§4.2 进程同步与互斥一、概念二、临界段问题

1. 临界段,临界资源。2. 怎样解决互斥问题。3. 软件方法 ––– 测试与设置 flay 。4. 硬件技术 ––– 临界区原语操作 Lock, unlock 。

三、信号量 ––– 解决同步问题 (P , V 操作 )

§4.7 作业讲评及复习

Page 12: §4.6   管程的概念

同步 ––– 进程有着时序上关系。互斥 ––– 排它使用的资源,是同步的一种特

殊情况,一种特殊的同步。指 CS 上有特殊时序,每次仅有一个进程进入 CS 。

Page 13: §4.6   管程的概念

并发执行实例 ––– 誊抄 (复写 )

用卡片输入机,尽快地把一个文本复写到行式打印机上。

卡片输入机 行式打印机

Page 14: §4.6   管程的概念

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

Page 15: §4.6   管程的概念

该程序功能:每次从读卡机输入一个纪录,并把它输出到行打机上,直到布尔量 flay 变真为止。

这一方案的特点是简单、正确,然而这一解法是低效的。假定读卡机速度为: 1000卡 / 分钟,打印机速度为: 600 行 / 分钟,那么,最高的传输速度仅为 375 行 / 分。原因:没有充分利用读卡机和行打机的并行操作能力,

系统的设备利用率不高。

Page 16: §4.6   管程的概念

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

卡片输入机 行打机 缓冲区输入程序 输出程序

Page 17: §4.6   管程的概念

program transcribe2begin 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 coendend

P1输入程序

P2输出程序

Page 18: §4.6   管程的概念

[注 ] :输入程序不断地从读卡机读入信息送 buffer ,而输出程序不断地从 buffer 中取出信息送行打机。但由于两者速度不一样,若对这两个程序的执行不加任何限制,则会出现下列问题。 ( 这两个程序是并发执行的 ) 。(1) 若打印速度高于输入速度,导致要打印的内容还没有送入 buffer ,打印的并不是所需的

( 有可能是前次的 ) 。(2) 反之,则打印机还未打印的内容可能被新输入的覆盖,这样,打印结果,一部分正确,一部分为以后的信息,还有一些应打印的信息却丢失了。

Page 19: §4.6   管程的概念

总之,在这种方案下,打印的结果是不正确的,虽然提高了设备的利用率,但不能保证正确的誊抄。这是不可取的。

原因:共用一个 buffer ,两设备的速度不相匹配。

Page 20: §4.6   管程的概念

三、 三个并发程序的誊抄方案

卡片输入机 行打机 B1

输入 输出 B2

复制f (输入序列 )

输入 buffer

输出 buffer g (输出序列 )

输入 Input : Get (B1, f) ;从输入序列 f 得到一个记录 B1 ;

输出 output : put (B2, g) ;将记录从 B2放到输出序列 g 上。

复制 copy : B2 = B1 ;把记录从 B1复制到 B2 ;

Page 21: §4.6   管程的概念

program transcribe3;var B1, B2: T; flag: booleanbegin 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

Page 22: §4.6   管程的概念

上述程序中的 repeat含有三个分语句,改写为: 复制语句 copy “ B2: = B1” ;

输入语句 get “ if empty (f) then flag: = true else get (B1, f)” 。

输出语句 put “ put (B2, g)” ;

Page 23: §4.6   管程的概念

程序改写成: repeat copy; {复制 } cobegin put; {输入、输出 get; 并行运行 } coend until flag;

对比顺序处理时,工作模式为:G1

C1

G2 P1

C2

G3 P2

C3

P3

使得输入、输出的两设备可并行工作,提高了设备利用率。

Page 24: §4.6   管程的概念

若程序员把“ repeat ––– until”重复语句写成 Get repeatbegin copy put Getenduntil

三个并发进程

Page 25: §4.6   管程的概念

假定运行第一次为: B1=R2, B2=R1, f=(R3, R4, … Rm) g=(R

1) ,则运行第二次后, copy, put, get穿插执行六种方案:

copy, put, get

put, copy, get

copy, get, put导致 G=(R1, R2) 正确复制在输入、出前完成

put, get, copy

get, copy, put 导致 G=(R1, R3) 错,把 R2 冲了。

导致 G=(R1, R1) 错, put 在 copy 前前一个记录再度输出 get, put, copy

Page 26: §4.6   管程的概念

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

主要原因:由于并行程序的共享性和并行性。

Page 27: §4.6   管程的概念

解:共享资源为 S , T

设 4 个信号量 SA , SB , TA , TB 分别表示:SA : buffer1 中是否有信息;SB : buffer1 中信息是否取走;

TB : buffer2 中信息是否取走;TA : buffer1 中是否有信息;

用信号量实现同步

Page 28: §4.6   管程的概念

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