经典的进程同步问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
P1
C1
P2
C2
P3
1 2 3 … …. … … n
C3
.
.
Pn.
Cn
经典的进程同步问题
2 生 产 者 - 消 费 者 的 同 步 问 题 (The ProceducerConsumer Problem)
举例: 一个生产者
产品 一个消费者
仓库
生产者把产品生产出来,送入仓库。给 消费者发信号,消费者得到信号后,到仓库 取产品,取走产品后给生产者发信号……
生产者-消费者问题是相互合作进程关 系的一种抽象
输入——计算——打印
生产者 消费者 生产者 消费者
系统中使用资源的进程——消费者 系统中释放资源同类资源的进程——生产者
一个生产者
产品
仓库
一个消费者
要解决进程的同步问题要满足的条件
1 想接收数据时,有界缓冲区中至少有一个单元是满的 2 生产者想发送数据时,有界缓冲区中至少有一个单元是空的
发送和接送过程满足的条件是: 1)在Pa至少送一块数据入一个缓冲区之
前,Pb不可能从缓冲区中取出数据 2)Pa往缓冲队列发送数据时,至少有一个
缓冲区是空的; 3)由Pa发送的数据块在缓冲队列中按先
进先出(FIFO)方式排列. 描述发送过程deposit (data)和接受过
程remove (data) .
几个经典的进程同步问题
❖ 生产者—消费者问题 ❖ 哲学家进餐问题 ❖ 读者—写者问题 ❖ 图书馆阅览室问题 ❖ 理发师问题 ❖ 吃水果问题 ❖ 司机—售票员问题 ❖ 过河问题
生产者—消费者问题
➢ 一个最著名的进程同步问题 ➢ 问题描述:一组生产者向一组消费者提
供消息,它们共享一个有界缓冲池,生 产者存入消息,消费者从中取得消息。
哲学家进餐问题
哲学家进餐问题是典型的同步问题,是由Dijkstra提出并解 决的。
问题描述5个哲学家,他们的生活方式是交替的思考和进餐。 哲学家们公用一张圆桌,分别坐在周围的5张椅子上,圆桌 上有5个碗和5支筷子,平时一个哲学家进行思考,饥饿时 便试图取用其左、右最靠近他的筷子,只有他拿到两只筷 子时才能进餐,放下筷子又继续思考。
Pa
BUF1
BUF2 .…. BUFn
Pb
1)Bufempty————进程Pa的私用信号量, Buffull ————进程Pb的私用信号量;
2)Bufempty的初始值为n(n 为缓冲队列的缓冲区 个数),Buffull的初始值为0;
发送过程Deposit(data),接送过程Remove(data),这 两个过程必须同步,因为,因为过程deposit(data)的 执行结果是过程remove(data)的执行条件,而当缓冲 队列全部装满数据时,remove(data)的执行结果又是 deposit(data)的执行条件。
(生产者)私用信号量 avail 表示有界缓冲区中空的单元数 初值为n deposit(data):
begin
P(avail)
检查缓冲区中是否有空单元 执行后n-1
P(mutex)
检查缓冲区是否可用 执行后 mutex=0
送数据入缓冲区
wenku.baidu.com
V(full)
执行后,非空单元数加1 0+1=1
V(mutex)
公用信号量,互斥时使用的信 号量(二元信号量):它仅允 许取值为“0”与“1”,用 作互斥。它联系着一组共行进 程,初值为1,每个进程均可 对之施加P、V操作。
私用信号量:一般信号量(资 源信号量):它联系着一组共 行进程,但其初值为0,或为 某个正整数n,表示资源的数 目,主要用于进程同步。只允 许拥有它的进程对之施加P操 作,对V操作没有限制
同步问题 由于缓冲区是临界资源,所以生产者和消费者之间必须互斥的
访问临界资源
用信号量解题的关键
步骤: 信号量的设置;❖ 给信号量赋初值(常用的 互斥和同步信号量值的大小); P、V操作安排的 位置(其中,P的顺序不能颠倒,V的顺序任意)
设:公用信号量 mutex 表示缓冲区的个数
初值为1
(消费者)私用信号量 full 表示有界缓冲区中非空单元数 初值为0
(1)读互斥信号量rmutex,用于使读者互 斥 地 访 问 共 享 变 量 readcount, 这 里 readcount是记录有多少读者正在读;
释放缓冲区中的资源
end
Remove(data):
begin
P(full)
检查缓冲区是否有数据
P(mutex)
访问缓冲区
取缓冲区中某单元数据
V(avail)
取走数据以后,有界缓冲区的空单元个数加1
V(mutex)
释放缓冲区
end
deposit(data):
begin
次序
P(avail)
P(mutex)
Pa
BUF1
BUF2 .…. BUFn
Pb
发送过程deposit (data)和接受过程remove (data)
Pa:deposit(data) begin local x
P(Bufempty) 按FIFO方式选择一个 空缓冲Buf(x); Buf(x)<--data Buf(x)置满标记 V(Buffull) end
送数据入缓冲区
V(full)
V(mutex)
end
Remove(data):
begin
次序
P(full) P(mutex) 取缓冲区中某单元数据
V(avail)
V(mutex)
end
(消费者)私用信号量 full 表示有界 缓冲区中非空单元数 初值为0
(生产者)私用信号量 avail 表示有界 缓冲区中空的单元数 初值为n
例:利用信号量解决读者和写者问题
一个文件可能被多个进程共享,为了 保证读写的正确性和文件的一致性,系统 要求,当有读者进程读文件时,不允许任 何写者进程写,但允许多读者同时读;当 有写者进程写时,不允许任何其它写者进 程写,也不允许任何读者进行读。
为了解决读者和写者问题,需设置两个信 号量:
Pb:remove(data) begin local x P(Buffull) 按FIFO方式选择一个 装满数据的缓冲Buf(x) data<--Buf(x) Buf(x)置空标记 V(Bufempty) end
Dijkstra把同步问题抽象成一种生产者和消 费者关系,计算机系统中的许多问题都可以被归 结为生产者和消费者关系,例如,生产者可以是 计算进程,消费者是打印进程,输入时输入进程 是生产者,计算进程是消费者。我们可以通过一 个缓冲区把生产者和消费者联系起来