逄 第三章进程同步04
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.6 进程同步 3.6.1 同步的概念
进程Pc 合作完成计算和打印任务。 例:进程Pc 和 Pp 合作完成计算和打印任务。
Pc 计算 放入
缓冲区buf 缓冲区buf 取出结果
Pp 打印
(条件=buf空) 条件=buf空 =buf
(条件=buf非空) 条件=buf非空) =buf非空
3.6.1 同步的概念
进程间的制约关系
1)间接制约: 间接制约: 进行竞争,独占分配到的共享资源。 进行竞争,独占分配到的共享资源。 进程间要通过某种中介发生联系, 互斥 进程间要通过某种中介发生联系,是无意识 安排的,可发生在相关进程之间, 安排的,可发生在相关进程之间,也可发生在无关 进程之间。 进程之间。 直接制约: 2)直接制约: 进行协作,等待来自其他进程的信息。 进行协作,等待来自其他进程的信息。 进程间的相互联系是有意识的安排的, 同步 进程间的相互联系是有意识的安排的,直接 作用只发生在相关进程间 只发生在相关进程间。 作用只发生在相关进程间。
注意
信号量: 信号量: P操作的顺序至关重要,一个同步 操作与一个互斥 操 操作的顺序至关重要, 操作与一个互斥P操 操作的顺序至关重要 一个同步P操作与一个互斥 作在一起时,同步P操作应在互斥 操作前,而两个V 作在一起时,同步 操作应在互斥P操作前,而两个 操作应在互斥 操作前 操作无关紧要。 操作无关紧要。 互斥---PV操作在同一个进程中 互斥 操作在同一个进程中 同步---PV操作在不同的进程中 同步 操作在不同的进程中
Buf’ Until Buf =空 计算 得到计算结果 Buf<Buf<-计算结果 Goto A
思考: 思考:如果 缓冲区不允 许两个进程 同时访问, 同时访问, 该采取什么 措施? 措施?
3.6.1 同步的概念
上述描述方法的缺点: 上述描述方法的缺点: 反复测试语句造成CPU时间的极大浪费,这是操作系统 反复测试语句造成CPU时间的极大浪费, CPU时间的极大浪费 设计要求不允许的。 设计要求不允许的。 引起问题的原因: 引起问题的原因: 进程Pc Pp的执行互相制约 Pc、 的执行互相制约。 进程Pc、Pp的执行互相制约。 问题的解决: 问题的解决: 直接制约的进程互相给对方进程发送信号, 直接制约的进程互相给对方进程发送信号,告之执行 条件已具备。 条件已具备。
3.6.2 私有信号量
可把各进程之间发送的消息作为信号量看待。 可把各进程之间发送的消息作为信号量看待。 -----同步中使用的信号量称为私用信号量,互斥中使用的信 同步中使用的信号量称为私用信号量, 同步中使用的信号量称为私用信号量 号量称为公用信号量。 号量称为公用信号量。 私用信号量:只与制约进程及被制约进程有关,用于同步。 私用信号量:只与制约进程及被制约进程有关,用于同步。 公用信号量:与整组并发进程有关,用于互斥。 公用信号量:与整组并发进程有关,用于互斥。
Pc:
不采取任何制约措施,两个进程的描述如下: 不采取任何制约措施,两个进程的描述如下:
Pp: A: Buf’ local Buf Repeat Buf’ Buf Buf B: local Pri Repeat Pri Buf ≠空 Until Pri ≠空 打印Buf中的内容 打印Buf中的内容 Buf 清除Buf中的内容 清除Buf中的内容 Buf Goto B
Pc: A: wait(Bufempty) 计算 Buf<-计算结果 计算结果 Bufempty<-false signal(Buffull) Goto A Pp: B: wait(Buffull) 打印Buf中的数据 中的数据 打印 清除Buf中的数据 中的数据 清除 Buffull<-false signal(Bufempty) Goto B
3.6.3 用P、V原语实现进程同步
如果做如下修改: 如果做如下修改: 设初始值close=0 stop=0,表示车正在运行。 close=0, 2)设初始值close=0,stop=0,表示车正在运行。 上述描述应该如何? 上述描述应该如何?
P1: A:启动 A:启动 行车 停车 V(stop) P(close) Goto A P2: B: P(stop) 开门 关门 V(close) 售票 Goto B
注:x是缓冲区号
3.6.3 用P、V原语实现进程同步
例:设公共汽车上,司机和售票员的活动如下。在汽车 设公共汽车上,司机和售票员的活动如下。 不断到站停车、行驶过程中, 不断到站停车、行驶过程中,这两个活动有什么同步关 原语实现他们的同步。 系?用P、V原语实现他们的同步。
司机 P1: : 启动 正常运行 到站停
售票员 P2: : 关门 售票 开门
3.6.3 用P、V原语实现进程同步
1)设close为进程P1的私有信号量,表示售票员是否 close为进程P1的私有信号量, 为进程P1的私有信号量 关门,stop为进程P2的私有信号量 为进程P2的私有信号量, 关门,stop为进程P2的私有信号量,表示车辆是否 停止到站。 停止到站。 设初始值close=1 stop=0,表示车正在运行。 close=1, 2)设初始值close=1,stop=0,表示车正在运行。 描述: 3)描述: P1: P2: A:P(close) 启动 行车 停车 V(stop) Goto A B:P(stop) 开门 关门 V(close) 售票 Goto B
3.6.1 同步的概念
解决办法一:合作进程互相发送信号(消息或事件)。 解决办法一:合作进程互相发送信号(消息或事件)。 wait(消息名) wait(消息名) signal(消息名) signal(消息名) Pc 计算
非空 缓冲区buf 缓冲区buf 空 Pp 打印
过程wait功能:等待到消息名为true继续执行。 过程wait功能:等待到消息名为true继续执行。 wait功能 true继续执行 过程signal功能:向合作进程发送所需要的消息名, 过程signal功能:向合作进程发送所需要的消息名,并将 signal功能 其值设置为true。 其值设置为true。 true
3.6.1 同步的概念
同步:在异步环境(执行起始时间随机,速度独立) 同步:在异步环境(执行起始时间随机,速度独立)下 的一组并发进程,因直接制约互相发送消息而进行合作、 的一组并发进程,因直接制约互相发送消息而进行合作、 互相等待,使得各进程按一定的速度执行的过程。 互相等待,使得各进程按一定的速度执行的过程。 合作进程: 合作进程:具有同步关系的一组并发进程 消息(事件): ):合作进程间互相发送的信号 消息(事件):合作进程间互相发送的信号 怎样理解进程同步? 怎样理解进程同步? 系统中一些进程需要相互合作, 系统中一些进程需要相互合作,共同完成一项任 务。一个进程运行到某一点时要求另一伙伴进程为它 提供消息,在未获得消息之前,该进程处于等待状态, 提供消息,在未获得消息之前,该进程处于等待状态, 获得消息后被唤醒进入就绪态
3.6.3 用P、V原语实现进程同步
用P、V原语和信号量来描述两个进程的同步关系。 原语和信号量来描述两个进程的同步关系。
Biblioteka Baidu
Pa
解:
Buf1
Buf2
Bufn
Pb
1)设Bufempty为进程Pa的私有信号量,表示空缓冲区的个 Bufempty为进程Pa的私有信号量, 为进程Pa的私有信号量 Buffull为进程Pb的私有信号量 表示满缓冲区个数。 为进程Pb的私有信号量, 数,Buffull为进程Pb的私有信号量,表示满缓冲区个数。 2)初始值Bufempty=n, Buffull=0 初始值Bufempty=n, Bufempty=n 3)描述: 描述:
3.6.3 用P、V原语实现进程同步
Pa:deposit(data): Pb:remove(data) begin local x begin local x P(Bufempty) P(Buffull); 选择一个空Buf(x) 按FIFO选择一个满 选择一个满Buf(x) 按FIFO选择一个空 选择一个空 选择一个满 Buf (x) data data Buf(x) Buf(x)置满标记 Buf(x)置空标记 置满标记 置空标记 V(Buffull) V(Bufempty); end end
3.6.1 同步的概念
利用wait和signal描述进程Pc 利用wait和signal描述进程Pc 和 Pp 的同步关系 wait 描述进程 解: 设消息名Bufempty表示Buf Bufempty表示Buf空 Buffull表示Buf满 表示Buf 1)设消息名Bufempty表示Buf空,Buffull表示Buf满, 初始化Bufempty=true Bufempty=true, Buffull=false, 2)初始化Bufempty=true, Buffull=false, 3)描述
3.6.3 用P、V原语实现进程同步
int s1=1; int s2=0; main() { cobegin driver(); busman(); coend } busman() driver() { { while(1) while(1) { { P(s2) P(s1); 开门 启动车辆; 启动车辆; 关门 正常行车; 正常行车; V(s1) 到站停车; 到站停车; 售票 V(s2); } } } }
3.6.4 生产者-消费者问题 生产者Producer 1 生产指针 Producer 2 ... Producer M 满 空 消费指针 Consumer 1 Consumer 2 ... Consumer K
共享缓冲区n 共享缓冲区n
指针移动方向
解: 设公用信号量mutex保证生产者消费者进程之间的互斥, mutex保证生产者消费者进程之间的互斥 1)设公用信号量mutex保证生产者消费者进程之间的互斥,设 信号量avail为生产者进程的私有信号量, avail为生产者进程的私有信号量 信号量avail为生产者进程的私有信号量,表示有界缓冲区 中空单元的数目,full为消费者进程的私有信号量 为消费者进程的私有信号量, 中空单元的数目,full为消费者进程的私有信号量,表示有 界缓冲区中非空单元的数目。 界缓冲区中非空单元的数目。 设初始值mutex=1 avail=n,full=0。 mutex=1, 2)设初始值mutex=1,avail=n,full=0。 描述: 3)描述: remove(data): deposit(data): begin begin P(full) P(avail) P(mutex) P(mutex) 取缓冲区中某单元数据 送数据入缓冲区某单元 V(avail) V(full) V(mutex) V(mutex) end end
进程Pc 合作完成计算和打印任务。 例:进程Pc 和 Pp 合作完成计算和打印任务。
Pc 计算 放入
缓冲区buf 缓冲区buf 取出结果
Pp 打印
(条件=buf空) 条件=buf空 =buf
(条件=buf非空) 条件=buf非空) =buf非空
3.6.1 同步的概念
进程间的制约关系
1)间接制约: 间接制约: 进行竞争,独占分配到的共享资源。 进行竞争,独占分配到的共享资源。 进程间要通过某种中介发生联系, 互斥 进程间要通过某种中介发生联系,是无意识 安排的,可发生在相关进程之间, 安排的,可发生在相关进程之间,也可发生在无关 进程之间。 进程之间。 直接制约: 2)直接制约: 进行协作,等待来自其他进程的信息。 进行协作,等待来自其他进程的信息。 进程间的相互联系是有意识的安排的, 同步 进程间的相互联系是有意识的安排的,直接 作用只发生在相关进程间 只发生在相关进程间。 作用只发生在相关进程间。
注意
信号量: 信号量: P操作的顺序至关重要,一个同步 操作与一个互斥 操 操作的顺序至关重要, 操作与一个互斥P操 操作的顺序至关重要 一个同步P操作与一个互斥 作在一起时,同步P操作应在互斥 操作前,而两个V 作在一起时,同步 操作应在互斥P操作前,而两个 操作应在互斥 操作前 操作无关紧要。 操作无关紧要。 互斥---PV操作在同一个进程中 互斥 操作在同一个进程中 同步---PV操作在不同的进程中 同步 操作在不同的进程中
Buf’ Until Buf =空 计算 得到计算结果 Buf<Buf<-计算结果 Goto A
思考: 思考:如果 缓冲区不允 许两个进程 同时访问, 同时访问, 该采取什么 措施? 措施?
3.6.1 同步的概念
上述描述方法的缺点: 上述描述方法的缺点: 反复测试语句造成CPU时间的极大浪费,这是操作系统 反复测试语句造成CPU时间的极大浪费, CPU时间的极大浪费 设计要求不允许的。 设计要求不允许的。 引起问题的原因: 引起问题的原因: 进程Pc Pp的执行互相制约 Pc、 的执行互相制约。 进程Pc、Pp的执行互相制约。 问题的解决: 问题的解决: 直接制约的进程互相给对方进程发送信号, 直接制约的进程互相给对方进程发送信号,告之执行 条件已具备。 条件已具备。
3.6.2 私有信号量
可把各进程之间发送的消息作为信号量看待。 可把各进程之间发送的消息作为信号量看待。 -----同步中使用的信号量称为私用信号量,互斥中使用的信 同步中使用的信号量称为私用信号量, 同步中使用的信号量称为私用信号量 号量称为公用信号量。 号量称为公用信号量。 私用信号量:只与制约进程及被制约进程有关,用于同步。 私用信号量:只与制约进程及被制约进程有关,用于同步。 公用信号量:与整组并发进程有关,用于互斥。 公用信号量:与整组并发进程有关,用于互斥。
Pc:
不采取任何制约措施,两个进程的描述如下: 不采取任何制约措施,两个进程的描述如下:
Pp: A: Buf’ local Buf Repeat Buf’ Buf Buf B: local Pri Repeat Pri Buf ≠空 Until Pri ≠空 打印Buf中的内容 打印Buf中的内容 Buf 清除Buf中的内容 清除Buf中的内容 Buf Goto B
Pc: A: wait(Bufempty) 计算 Buf<-计算结果 计算结果 Bufempty<-false signal(Buffull) Goto A Pp: B: wait(Buffull) 打印Buf中的数据 中的数据 打印 清除Buf中的数据 中的数据 清除 Buffull<-false signal(Bufempty) Goto B
3.6.3 用P、V原语实现进程同步
如果做如下修改: 如果做如下修改: 设初始值close=0 stop=0,表示车正在运行。 close=0, 2)设初始值close=0,stop=0,表示车正在运行。 上述描述应该如何? 上述描述应该如何?
P1: A:启动 A:启动 行车 停车 V(stop) P(close) Goto A P2: B: P(stop) 开门 关门 V(close) 售票 Goto B
注:x是缓冲区号
3.6.3 用P、V原语实现进程同步
例:设公共汽车上,司机和售票员的活动如下。在汽车 设公共汽车上,司机和售票员的活动如下。 不断到站停车、行驶过程中, 不断到站停车、行驶过程中,这两个活动有什么同步关 原语实现他们的同步。 系?用P、V原语实现他们的同步。
司机 P1: : 启动 正常运行 到站停
售票员 P2: : 关门 售票 开门
3.6.3 用P、V原语实现进程同步
1)设close为进程P1的私有信号量,表示售票员是否 close为进程P1的私有信号量, 为进程P1的私有信号量 关门,stop为进程P2的私有信号量 为进程P2的私有信号量, 关门,stop为进程P2的私有信号量,表示车辆是否 停止到站。 停止到站。 设初始值close=1 stop=0,表示车正在运行。 close=1, 2)设初始值close=1,stop=0,表示车正在运行。 描述: 3)描述: P1: P2: A:P(close) 启动 行车 停车 V(stop) Goto A B:P(stop) 开门 关门 V(close) 售票 Goto B
3.6.1 同步的概念
解决办法一:合作进程互相发送信号(消息或事件)。 解决办法一:合作进程互相发送信号(消息或事件)。 wait(消息名) wait(消息名) signal(消息名) signal(消息名) Pc 计算
非空 缓冲区buf 缓冲区buf 空 Pp 打印
过程wait功能:等待到消息名为true继续执行。 过程wait功能:等待到消息名为true继续执行。 wait功能 true继续执行 过程signal功能:向合作进程发送所需要的消息名, 过程signal功能:向合作进程发送所需要的消息名,并将 signal功能 其值设置为true。 其值设置为true。 true
3.6.1 同步的概念
同步:在异步环境(执行起始时间随机,速度独立) 同步:在异步环境(执行起始时间随机,速度独立)下 的一组并发进程,因直接制约互相发送消息而进行合作、 的一组并发进程,因直接制约互相发送消息而进行合作、 互相等待,使得各进程按一定的速度执行的过程。 互相等待,使得各进程按一定的速度执行的过程。 合作进程: 合作进程:具有同步关系的一组并发进程 消息(事件): ):合作进程间互相发送的信号 消息(事件):合作进程间互相发送的信号 怎样理解进程同步? 怎样理解进程同步? 系统中一些进程需要相互合作, 系统中一些进程需要相互合作,共同完成一项任 务。一个进程运行到某一点时要求另一伙伴进程为它 提供消息,在未获得消息之前,该进程处于等待状态, 提供消息,在未获得消息之前,该进程处于等待状态, 获得消息后被唤醒进入就绪态
3.6.3 用P、V原语实现进程同步
用P、V原语和信号量来描述两个进程的同步关系。 原语和信号量来描述两个进程的同步关系。
Biblioteka Baidu
Pa
解:
Buf1
Buf2
Bufn
Pb
1)设Bufempty为进程Pa的私有信号量,表示空缓冲区的个 Bufempty为进程Pa的私有信号量, 为进程Pa的私有信号量 Buffull为进程Pb的私有信号量 表示满缓冲区个数。 为进程Pb的私有信号量, 数,Buffull为进程Pb的私有信号量,表示满缓冲区个数。 2)初始值Bufempty=n, Buffull=0 初始值Bufempty=n, Bufempty=n 3)描述: 描述:
3.6.3 用P、V原语实现进程同步
Pa:deposit(data): Pb:remove(data) begin local x begin local x P(Bufempty) P(Buffull); 选择一个空Buf(x) 按FIFO选择一个满 选择一个满Buf(x) 按FIFO选择一个空 选择一个空 选择一个满 Buf (x) data data Buf(x) Buf(x)置满标记 Buf(x)置空标记 置满标记 置空标记 V(Buffull) V(Bufempty); end end
3.6.1 同步的概念
利用wait和signal描述进程Pc 利用wait和signal描述进程Pc 和 Pp 的同步关系 wait 描述进程 解: 设消息名Bufempty表示Buf Bufempty表示Buf空 Buffull表示Buf满 表示Buf 1)设消息名Bufempty表示Buf空,Buffull表示Buf满, 初始化Bufempty=true Bufempty=true, Buffull=false, 2)初始化Bufempty=true, Buffull=false, 3)描述
3.6.3 用P、V原语实现进程同步
int s1=1; int s2=0; main() { cobegin driver(); busman(); coend } busman() driver() { { while(1) while(1) { { P(s2) P(s1); 开门 启动车辆; 启动车辆; 关门 正常行车; 正常行车; V(s1) 到站停车; 到站停车; 售票 V(s2); } } } }
3.6.4 生产者-消费者问题 生产者Producer 1 生产指针 Producer 2 ... Producer M 满 空 消费指针 Consumer 1 Consumer 2 ... Consumer K
共享缓冲区n 共享缓冲区n
指针移动方向
解: 设公用信号量mutex保证生产者消费者进程之间的互斥, mutex保证生产者消费者进程之间的互斥 1)设公用信号量mutex保证生产者消费者进程之间的互斥,设 信号量avail为生产者进程的私有信号量, avail为生产者进程的私有信号量 信号量avail为生产者进程的私有信号量,表示有界缓冲区 中空单元的数目,full为消费者进程的私有信号量 为消费者进程的私有信号量, 中空单元的数目,full为消费者进程的私有信号量,表示有 界缓冲区中非空单元的数目。 界缓冲区中非空单元的数目。 设初始值mutex=1 avail=n,full=0。 mutex=1, 2)设初始值mutex=1,avail=n,full=0。 描述: 3)描述: remove(data): deposit(data): begin begin P(full) P(avail) P(mutex) P(mutex) 取缓冲区中某单元数据 送数据入缓冲区某单元 V(avail) V(full) V(mutex) V(mutex) end end