1 发送进程和接收进程的同步问题 ...

22
BUF1 BUFn BUF2 .…. Pb Pa 1 发发发发发发发发发发发发发发 发发发发发发发发发发发发发发发发发发发发发 Pa,Pb 发发发发发发发 发发发 发发发发发发发发发

Upload: lionel

Post on 19-Mar-2016

138 views

Category:

Documents


3 download

DESCRIPTION

1 发送进程和接收进程的同步问题 利用信号量可以解决合作进程之间的同步。 例:设进程 Pa,Pb 通过缓冲区队列传送数据. Pa. Pb. BUF1. BUF2. BUFn. .…. 经典的进程同步问题. Pa. Pb. BUF1. BUF2. BUFn. .…. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

BUF1 BUFnBUF2 .…. Pb

Pa

1 发送进程和接收进程的同步问题 利用信号量可以解决合作进程之间的同步。 例:设进程 Pa,Pb 通过缓冲区队列传送数据

经典的进程同步问题

Page 2: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

发送和接送过程满足的条件是: 1) 在 Pa 至少送一块数据入一个缓冲区之前 ,Pb 不可能从缓冲区中取出数据 2)Pa 往缓冲队列发送数据时 ,至少有一个缓冲区是空的 ; 3) 由 Pa 发送的数据块在缓冲队列中按先进先出 (FIFO) 方式排列 . 描述发送过程 deposit (data) 和接受过程 remove (data) .BUF1 BUFnBUF2 .…. Pb

Pa

Page 3: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

1)Bufempty————进程 Pa的私用信号量 , Buffull ————进程Pb的私用信号量 ; 2)Bufempty 的初始值为 n(n 为缓冲队列的缓冲区个数 ),Buffull 的初始值为 0; 发送过程 Deposit(data), 接送过程 Remove(data),这两个过程必须同步,因为 ,因为过程 deposit(data) 的执行结果是过程 remove(data) 的执行条件 ,而当缓冲队列全部装满数据时 ,remove(data) 的执行结果又是 deposit(data) 的执行条件。

BUF1 BUFnBUF2 .…. Pb

Pa

Page 4: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

Pa:deposit(data) Pb:remove(data) begin local x begin local x P(Bufempty) P(Buffull) 按 FIFO 方式选择一个 按 FIFO 方式选择一个 空缓冲 Buf(x); 装满数据的缓冲 Buf(x) Buf(x)<--data data<--Buf(x) Buf(x) 置满标记 Buf(x) 置空标记 V(Buffull) V(Bufempty) end end

发送过程 deposit (data) 和接受过程 remove (data)

Page 5: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

1 2 3 … …. … … n

P1

P2

P3

.

Pn.

C1

C2

C3

.

Cn

Dijkstra 把同步问题抽象成一种生产者和消费者关系,计算机系统中的许多问题都可以被归结为生产者和消费者关系,例如,生产者可以是计算进程,消费者是打印进程,输入时输入进程是生产者,计算进程是消费者。我们可以通过一个缓冲区把生产者和消费者联系起来

Page 6: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

2 生产者-消费者的同步问题 (The Proceducer-Consumer Problem)举例: 生产者把产品生产出来,送入仓库。给消费者发信号,消费者得到信号后,到仓库取产品,取走产品后给生产者发信号……

产品仓 库

一个生产者 一个消费者

经典的进程同步问题

Page 7: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

生产者-消费者问题是相互合作进程关系的一种抽象 输入——计算——打印 生产者 消费者 生产者 消费者系统中使用资源的进程——消费者系统中释放资源同类资源的进程——生产者

产品仓 库

一个生产者 一个消费者

Page 8: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

1 想接收数据时,有界缓冲区中至少有一个单元是满的 2 生产者想发送数据时,有界缓冲区中至少有一个单元是空的

同步问题由于缓冲区是临界资源,所以生产者和消费者之间必须互斥的访问临界资源 用信号量解题的关键步骤: 信号量的设置; 给信号量赋初值(常用的互斥和同步信号量值的大小); P 、 V 操作安排的位置(其中, P 的顺序不能颠倒, V 的顺序任意)

要解决进程的同步问题要满足的条件

Page 9: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

设:公用信号量 mutex 表示缓冲区的个数 初值为 1(消费者)私用信号量 full 表示有界缓冲区中非空单元数 初值为 0 (生产者)私用信号量 avail 表示有界缓冲区中空的单元数 初值为 ndeposit ( data ): begin P(avail) 检查缓冲区中是否有空单元 执行后 n-1 P(mutex) 检查缓冲区是否可用 执行后 mutex = 0 送数据入缓冲区 V(full) 执行后,非空单元数加 1 0+1 = 1 V(mutex) 释放缓冲区中的资源 endRemove ( data ): begin P(full) 检查缓冲区是否有数据 P(mutex) 访问缓冲区 取缓冲区中某单元数据 V(avail) 取走数据以后,有界缓冲区的空单元个数加 1 V(mutex) 释放缓冲区 end

Page 10: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

deposit ( data ): begin P(avail) P(mutex) 送数据入缓冲区 V(full) V(mutex) endRemove ( data ): begin P(full) P(mutex) 取缓冲区中某单元数据 V(avail) V(mutex) end

公用信号量 ,互斥时使用的信号量(二元信号量):它仅允许取值为“0”与“1”,用作互斥。它联系着一组共行进程,初值为1,每个进程均可对之施加P、V操作。 私用信号量:一般信号量(资源信号量):它联系着一组共行进程,但其初值为0,或为某个正整数n,表示资源的数目,主要用于进程同步。只允许拥有它的进程对之施加P操作,对 V 操作没有限制

次序

次序

(消费者)私用信号量 full 表示有界缓冲区中非空单元数 初值为 0 (生产者)私用信号量 avail 表示有界缓冲区中空的单元数 初值为 n

Page 11: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

几个经典的进程同步问题 生产者—消费者问题 哲学家进餐问题 读者—写者问题 图书馆阅览室问题 理发师问题 吃水果问题 司机—售票员问题 过河问题

Page 12: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

生产者—消费者问题 一个最著名的进程同步问题 问题描述:一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者存入消息,消费者从中取得消息。

Page 13: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

哲学家进餐问题 哲学家进餐问题是典型的同步问题,是由 Dijkstra 提出并解决的。 问题描述 5 个哲学家,他们的生活方式是交替的思考和进餐。哲学家们公用一张圆桌,分别坐在周围的 5 张椅子上,圆桌上有 5 个碗和 5 支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左、右最靠近他的筷子,只有他拿到两只筷子时才能进餐,放下筷子又继续思考。

Page 14: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

例:利用信号量解决读者和写者问题 一个文件可能被多个进程共享,为了保证读写的正确性和文件的一致性,系统要求,当有读者进程读文件时,不允许任何写者进程写,但允许多读者同时读;当有写者进程写时,不允许任何其它写者进程写,也不允许任何读者进行读。

Page 15: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

为了解决读者和写者问题,需设置两个信号量: ( 1 )读互斥信号量 rmutex, 用于使读者互斥地访问共享变量 readcount, 这里readcount 是记录有多少读者正在读 ; ( 2 )写互斥信号量 wmutex, 用于实现读写互斥。读者—者问题进行如下描述:struct semapore rmutex,wmutex=1,1;int readcount:=0;

Page 16: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

cobeginvord readeri(vord)(i=1,2,…k) { while(true){ p(rmutex) ; if readcount=0 then p(wmutex); readcount:=readcount+1; v(rmutex); 读文件; … p(rmutex) ; readcount:=readcount-1;if readcount=0 thenv(wmutex);v(rmutex); } }

Page 17: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

vord writerj(vord)(j=1,2,…,m) { while(true){ p (wmutex); 写文件; v(wmutex) ; } } Coend

Page 18: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

课后练习 图书馆阅览室问题 问题描述:假定阅览室最多可同时容纳 100 个人阅读,读者进入时,必须在阅览室门口的一个登记表上登记,内容包括姓名、座号等,离开时要撤掉登记内容。用 P 、 V 操作描述读者进程的同步算法。

Page 19: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

理发师问题 问题描述:一个理发店由一个有几张椅子的等候室和一个放有一张理发椅的理发室组成。若没有要理发的顾客,则理发师就去睡觉;若一顾客走进理发店且所有的椅子都被占用了,则该顾客就离开理发店;若理发师正在为人理发,则该顾客就找一张空椅子坐下等待;若理发师在睡觉,则顾客就唤醒他,设计一个协调理发师和顾客的程序。

Page 20: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

吃水果问题 问题描述:桌上有一只盘子,每次只能放一个水果,爸爸专向盘中放苹果,妈妈专向盘中放桔子,儿子专等吃盘里的桔子,女儿专等吃盘里的苹果。只要盘子空,则爸爸或妈妈可向盘中放水果,仅当盘中有自己需要的水果时,儿子或女儿可从中取出,请给出四人之间的同步关系,并用 P 、 V操作实现四人正确活动的程序。

Page 21: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

四人之间的关系 爸爸,妈妈要互斥使用盘子,所以两者之间是互斥关系; 爸爸放的苹果,女儿吃,所以两者是同步关系; 妈妈放的桔子,儿子吃,所以两者也是同步关系。

Page 22: 1   发送进程和接收进程的同步问题     利用信号量可以解决合作进程之间的同步。     例:设进程 Pa,Pb 通过缓冲区队列传送数据

司机—售票员问题 设公共汽车上,司机和售票员的活动分别是: 司机: 售票员: 启动车辆 上下乘客 正常行车 关车门 到站停车 售票 开车门 上下乘客 在汽车不断到站,停车,行驶过程中,这两个活动的同步关系。