第3章 进程同步与通信-同步
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/* 将进程阻塞,并将其投入等待队列s.queue */
}
P操作
V操作:释放资源操作
① sem加1
② 若 sem 加 1 后结果大于 1 ,则 V 停止操作,该进程返回调用处 ,继续执行;
③ 若sem加1后小于或等于零,则 该进程转就绪队列,同时进程 调度选取一个等待队列中的进 程转运行或就绪。
P,V操作必须用原语实现。
结论:
当mutex≥0时其值表示可用资源个数; 当mutex<0时其绝对值表示等待进程的个数。
思考: n个并发进程,共享m个共享资源:
mutex的取值范围为?
22
答
同一类资源:
– m-n ≤ mutex ≤ m
不同类资源:
– 需要m个mutex – 1-n ≤ mutex ≤ 1
同步进程举例 直接制约 同步定义 私用信号量 PV原语实现进程同步 生产者-消费者问题 哲学家进餐问题
int s2 =1; cobegin doctor( );test( ); coend
}
对于化验员的操作步骤: test { wait(化验单);
化验…
出化验结果… signal(有化验结果); }
31
对于医生的操作步骤: doctor {
给病人看病…
signal(化验单);
wait(化验结果);
16
x代表某航班的可用座位数,p1和p2两个售票进程, 售票工作是对变量x减1。试用信号量的P、V操作 实现这两个进程的互斥。 设:mutex为互斥信号量,
p1( ) { …… p(mutex); …… x:=x-1 ; v(mutex); …… } } p2( ) { …… p(mutex); …… x:=x-1 ; v(mutex); ……
40
描述:
Pc:
A:P(bufempty) 计算 buf计算结果 V(buffull) Goto A
Pp: B:P(buffull) 打印buf中的数据 清除buf中的数据 V(bufempty) Goto B
返回
41
直接制约 一组在异步环境下的并发进程,各自
的执行结果互为对方的执行条件,从
而限制各进程的执行速度的过程称为 并发进程间的直接制约。
51
设信号量 mutex:用于访问缓冲区时的互斥,初值是1 empty :为生产者进程的私用信号量,表示有 界缓冲区中的空单元数,初值为n; full: 为消费者进程的私用信号量,表示缓冲 区中非空单元数,初值为0 。
信号量(semaphore)
管理相应临界区的公有资源,它代
表可用资源实体。
3
信号量是一个整型变量。 ≥0:可供并发进程使用的资源实体数
<0:正在等待使用临界区的进程数
用于互斥的信号量初值应该大于零
4
8. P,V原语
信号量的初值只能由P,V原语操作。
P:passeren V:verhoog
P操作:申请资源操作
48
49
它们之间满足:
① 消费者想接收数据时,有界缓冲区中至少有 一个单元是满的;
② 生产者想发送数据时,有界缓冲区中至少有 一个单元是空的。 生产者-消费者问题是同步关系
50
当有进程在写数据时(如生产者进程)则同
时不允许对该缓冲区进行读操作(如消费者
进程)。 故有界缓冲区是临界资源,进程必须互斥访 问。 生产者-消费者问题同时也具有互斥关系
●哲学家进餐问题
●打磕睡的理发师问题
生产者-消费问题
消费者:系统中使用某一类资源的进程称为 该资源的消费者。 生产者:释放同类资源的进程称为该资源的 生产者。
计算进程和打印进程共享缓冲区的例子中, 计算进程把数据送入缓冲区, 打印进程从缓冲区中取数据, 则计算进程可看作数据资源的生产者, 打印进程可看作是消费者。
18
分析
共享临界资源:20个同类的售票窗口 先来者先进入
算法描述
⑴.主函数算法: main() { int mutex=20; cobegin P1(); … Pi();… Pn(); coend }
⑵.购票者i的算法: Pi() { P(mutex); 购票; V(mutex); }
⑶.信号量mutex的取值范围:
-(n-20) ≤ mutex ≤ 20 其物理含义是:
当mutex=20时,表示售票厅内没有购票者进入,20个窗口都是 空闲的,表示可用资源个数;
当mutex=0时,表示售票厅内已经进入了20个购票者,每个窗口 都被分配,没有等待的购票者,可用资源为0; 当mutex=-(n-20)时,表示一共有n个购票者,其中20个购票者 已经进入厅内,分别占有一个窗口,还有n-20个购票者在厅 外等待,绝对值表示等待进程个数。
种信号量为私用信号量。
互斥时使用的是公用信号量 返回
45
用P,V原语操作实现同步
用P,V原语操作实现进程同步的方法:
①为各并发进程设置私用信号量 ②为私用信号量赋初值 ③利用 P,V 原语和私用信号量规定各进程
的执行顺序。
返回
46
●
3.2经典进程同步问题
●生产者——消费者问题 ●读者——写者问题
/* 唤醒阻塞进程,将其从等待队列s.queue 取出,投入就绪队列*/
}
V操作
对于化验员的操作步骤:
test { P(s2); 化验…
出化验结果…
V(s1); }
35
对于医生的操作步骤: doctor {
给病人看病…
V(s2);
P(s1);
继续诊病… }
36
同步进程举例2
Pc
Pp
buffer
V(mutex);
15
如果有n个终端,则mutex信号量的取值范围为:
-(n-1)≤mutex≤1 其物理含义为: 当机票数空闲时,mutex=1。 当有一个终端进入,对机票进行处理,其它终端进 程还没有到来时,mutex=0。 当所有终端进程都到来,且有一个正在对机票进行 处理时, mutex= -( n - 1 )。它表示有 n - 1 个 进程在等待队列上等待。
继续诊病… }
32
信号灯的PV操作
void wait(semaphore s) { s.value = s.value - 1; if (s.value < 0) block(s.queue);
/* 将进程阻塞,并将其投入等待队列s.queue */
}
P操作
信号灯的PV操作
void signal(semaphore s) { s.value = s.value + 1; if (s.value <= 0) wackup(s.queue);
24
1.同步进程举例1-病人就诊
唤 醒 后
门诊医生: 等 待 …… 开化验单; …… 等 等化验结果; 待 …… 继续诊病;
化验员: …… 等化验单; …… 唤 化验; 醒 填写化验结果; 后 ……
化验单
继续诊病
化验结果
对于医生的操作步骤: 有病人时:
① 开化验单(化验单多一个) ② 等待化验结果
12
思考: n个并发进程,共享m个共享资源:
mutex的取值范围为?
13
互斥问题举例2 [ 例] 假设某飞机定票系统在 t0时刻有 A、 B 、 C、 D四个终端程 序同时都要对机票库中的某航班当前剩余票数 X 进行操作。 如果每个终端程序的当前定票需求为 N,并对共享变量X进行 如下操作:
在机票数据库中取出当前剩余票数X; 判断X>0(有票吗)? 如果有, X≥N(票够吗)? 如果够,则出票(打印票据); X=X-N(修改剩余票数); 将X回写到数据库中;
10
信号量可能的取值范围 假设有 N 个并发进程共用一台打印机,设 互斥信号量mutex的初值为1,则:
信号量mutex代表什么?
mutex的取值范围为多少? mutex的值分别代表什么含义?
11
N个并发进程,互斥信号量mutex的初值为1: mutex的取值范围为:1~-(N-1) 1 :表示没有进程进入临界区。有一个资源,无 进程等待; 0:表示有1个进程进入临界区。无资源,无进程 等待; -i :表示 1 个进程进入 临界区 。无资源,且有 i (i<=N-1)个进程等待进入。
7
信号灯ຫໍສະໝຸດ BaiduPV操作
void signal(semaphore s) { s.value = s.value + 1; if (s.value <= 0) wackup(s.queue);
/* 唤醒阻塞进程,将其从等待队列s.queue 取出,投入就绪队列*/
}
V操作
用信号灯解决互斥问题
semaphore mutex=1; P1: while (1){ P(mutex); 临界区; V(mutex); 剩余区; };
第3 章
进程同步与通信
●进程同步与互斥
本章要点
●经典进程同步问题
●AND信号量 ●管程
●进程通信
进程同步的基本概念
●同步:指多个进程中发生的事件存在着某种时
序关系,它们必须按规定时序执行,以共同完成 一项任务 。 ●互斥:多个进程不能同时使用同一资源。 ●临界资源:某段时间内仅允许一个进程使用的 资源。 ●临界区:每个进程中访问临界资源的那段代码。
Pp: B:wait(buffull) 打印buf中的数据 清除buf中的数据 buffullfalse signal(bufempty) Goto B
wait等待合作进程发来的消息 signal向合作进程发送消息
39
main()
{ int bufempty=1,buffull=0; cobegin Pc(); Pp(); coend }
① sem减1 ② 若sem减1后仍大于1或等于零, 则P返回,进程继续; ③ 若 sem 减 1 后小于零,则该进程 阻塞转等待队列中。
5
信号灯的PV操作
void wait(semaphore s) { s.value = s.value - 1; if (s.value < 0) block(s.queue);
③(有化验结果)继续诊病
27
对于化验员的操作步骤:
①等化验单 ②(有化验单时)进行化验
(未化验的化验单少一个)
③出化验结果(化验结果多一个)
④等待下一化验单
28
需要两个信号量 s1: 表示化验结果是否出来,初值为0. s2:表示医生是否开化验单,初值为0.
程序描述
main( )
{
int s1 =0;
14
针对临界资源机票数设置一个信号量mutex,初值 为1。每个终端进程中的程序描述如下:
P(mutex);
在机票数据库中取出当前剩余票数X;
判断X>0(有票吗)?
如果有, X≥N(票够吗)? 如果够,则出票(打印票据); X=X-N(修改剩余票数); 将X回写到数据库中;
互斥问题举例3
某车站售票厅有20个窗口,任何时刻最多可容 纳20名购票者进入,当售票厅中少于20名购票 者时,则厅外的购票者可立即进入,否则需在 厅外等待。若把一个购票者看作一个进程,请 用P、V操作管理这些并发进程,要求如下: ⑴.在主函数中给出信号量的定义和初值。 ⑵.给出一个购票者进程的算法。 ⑶.给出当购票者最多不超过n (设n>20)个时, 信号量可能的变化范围。
37
利用过程 wait 和 signal 可简单地描述计算 进程Pc和打印进程Pp的同步关系:
设消息名 bufempty 表示 buf 空,消息名
buffull表示buf中装满了数据。
bufempty=true,buffull=false
38
描述:
Pc:
A:wait(bufempty) 计算 buf计算结果 bufemptyfalse signal(buffull) Goto A
返回
42
同步的定义 异步环境下,一组并发进程,因直 接制约而互相发送消息而进行相互 合作,互相等待,使得各进程按一
定的速度执行的过程称为进程间同
步。
返回
43
合作进程:具有同步关系的一组
并发进程称为合作进程。 消息:合作进程间互相发送的信
号称为消息或事件。
返回
44
私用信号量 把进程间发送的消息看作信号量,则这种 信号量只与制约进程及被制约进程有关而 不是整组并发进程有关(如进程互斥),称这
P2: while (1){ P(mutex); 临界区 V(mutex); 剩余区; };
互斥进程举例1-两个进程共享一台打印机 设信号量print代表打印机,初值为1. pa() int main(void) { { P(print); int print=1; 使用打印机 V(print); cobegin } pa(); pb(); pb() coend { } P(print); print=1 表示没有进程使用打印机 使用打印机 print=0 表示一个进程在用,没有进程等待 V(print); print=-1 表示一个进程在用,另一个在等待 }
}
P操作
V操作:释放资源操作
① sem加1
② 若 sem 加 1 后结果大于 1 ,则 V 停止操作,该进程返回调用处 ,继续执行;
③ 若sem加1后小于或等于零,则 该进程转就绪队列,同时进程 调度选取一个等待队列中的进 程转运行或就绪。
P,V操作必须用原语实现。
结论:
当mutex≥0时其值表示可用资源个数; 当mutex<0时其绝对值表示等待进程的个数。
思考: n个并发进程,共享m个共享资源:
mutex的取值范围为?
22
答
同一类资源:
– m-n ≤ mutex ≤ m
不同类资源:
– 需要m个mutex – 1-n ≤ mutex ≤ 1
同步进程举例 直接制约 同步定义 私用信号量 PV原语实现进程同步 生产者-消费者问题 哲学家进餐问题
int s2 =1; cobegin doctor( );test( ); coend
}
对于化验员的操作步骤: test { wait(化验单);
化验…
出化验结果… signal(有化验结果); }
31
对于医生的操作步骤: doctor {
给病人看病…
signal(化验单);
wait(化验结果);
16
x代表某航班的可用座位数,p1和p2两个售票进程, 售票工作是对变量x减1。试用信号量的P、V操作 实现这两个进程的互斥。 设:mutex为互斥信号量,
p1( ) { …… p(mutex); …… x:=x-1 ; v(mutex); …… } } p2( ) { …… p(mutex); …… x:=x-1 ; v(mutex); ……
40
描述:
Pc:
A:P(bufempty) 计算 buf计算结果 V(buffull) Goto A
Pp: B:P(buffull) 打印buf中的数据 清除buf中的数据 V(bufempty) Goto B
返回
41
直接制约 一组在异步环境下的并发进程,各自
的执行结果互为对方的执行条件,从
而限制各进程的执行速度的过程称为 并发进程间的直接制约。
51
设信号量 mutex:用于访问缓冲区时的互斥,初值是1 empty :为生产者进程的私用信号量,表示有 界缓冲区中的空单元数,初值为n; full: 为消费者进程的私用信号量,表示缓冲 区中非空单元数,初值为0 。
信号量(semaphore)
管理相应临界区的公有资源,它代
表可用资源实体。
3
信号量是一个整型变量。 ≥0:可供并发进程使用的资源实体数
<0:正在等待使用临界区的进程数
用于互斥的信号量初值应该大于零
4
8. P,V原语
信号量的初值只能由P,V原语操作。
P:passeren V:verhoog
P操作:申请资源操作
48
49
它们之间满足:
① 消费者想接收数据时,有界缓冲区中至少有 一个单元是满的;
② 生产者想发送数据时,有界缓冲区中至少有 一个单元是空的。 生产者-消费者问题是同步关系
50
当有进程在写数据时(如生产者进程)则同
时不允许对该缓冲区进行读操作(如消费者
进程)。 故有界缓冲区是临界资源,进程必须互斥访 问。 生产者-消费者问题同时也具有互斥关系
●哲学家进餐问题
●打磕睡的理发师问题
生产者-消费问题
消费者:系统中使用某一类资源的进程称为 该资源的消费者。 生产者:释放同类资源的进程称为该资源的 生产者。
计算进程和打印进程共享缓冲区的例子中, 计算进程把数据送入缓冲区, 打印进程从缓冲区中取数据, 则计算进程可看作数据资源的生产者, 打印进程可看作是消费者。
18
分析
共享临界资源:20个同类的售票窗口 先来者先进入
算法描述
⑴.主函数算法: main() { int mutex=20; cobegin P1(); … Pi();… Pn(); coend }
⑵.购票者i的算法: Pi() { P(mutex); 购票; V(mutex); }
⑶.信号量mutex的取值范围:
-(n-20) ≤ mutex ≤ 20 其物理含义是:
当mutex=20时,表示售票厅内没有购票者进入,20个窗口都是 空闲的,表示可用资源个数;
当mutex=0时,表示售票厅内已经进入了20个购票者,每个窗口 都被分配,没有等待的购票者,可用资源为0; 当mutex=-(n-20)时,表示一共有n个购票者,其中20个购票者 已经进入厅内,分别占有一个窗口,还有n-20个购票者在厅 外等待,绝对值表示等待进程个数。
种信号量为私用信号量。
互斥时使用的是公用信号量 返回
45
用P,V原语操作实现同步
用P,V原语操作实现进程同步的方法:
①为各并发进程设置私用信号量 ②为私用信号量赋初值 ③利用 P,V 原语和私用信号量规定各进程
的执行顺序。
返回
46
●
3.2经典进程同步问题
●生产者——消费者问题 ●读者——写者问题
/* 唤醒阻塞进程,将其从等待队列s.queue 取出,投入就绪队列*/
}
V操作
对于化验员的操作步骤:
test { P(s2); 化验…
出化验结果…
V(s1); }
35
对于医生的操作步骤: doctor {
给病人看病…
V(s2);
P(s1);
继续诊病… }
36
同步进程举例2
Pc
Pp
buffer
V(mutex);
15
如果有n个终端,则mutex信号量的取值范围为:
-(n-1)≤mutex≤1 其物理含义为: 当机票数空闲时,mutex=1。 当有一个终端进入,对机票进行处理,其它终端进 程还没有到来时,mutex=0。 当所有终端进程都到来,且有一个正在对机票进行 处理时, mutex= -( n - 1 )。它表示有 n - 1 个 进程在等待队列上等待。
继续诊病… }
32
信号灯的PV操作
void wait(semaphore s) { s.value = s.value - 1; if (s.value < 0) block(s.queue);
/* 将进程阻塞,并将其投入等待队列s.queue */
}
P操作
信号灯的PV操作
void signal(semaphore s) { s.value = s.value + 1; if (s.value <= 0) wackup(s.queue);
24
1.同步进程举例1-病人就诊
唤 醒 后
门诊医生: 等 待 …… 开化验单; …… 等 等化验结果; 待 …… 继续诊病;
化验员: …… 等化验单; …… 唤 化验; 醒 填写化验结果; 后 ……
化验单
继续诊病
化验结果
对于医生的操作步骤: 有病人时:
① 开化验单(化验单多一个) ② 等待化验结果
12
思考: n个并发进程,共享m个共享资源:
mutex的取值范围为?
13
互斥问题举例2 [ 例] 假设某飞机定票系统在 t0时刻有 A、 B 、 C、 D四个终端程 序同时都要对机票库中的某航班当前剩余票数 X 进行操作。 如果每个终端程序的当前定票需求为 N,并对共享变量X进行 如下操作:
在机票数据库中取出当前剩余票数X; 判断X>0(有票吗)? 如果有, X≥N(票够吗)? 如果够,则出票(打印票据); X=X-N(修改剩余票数); 将X回写到数据库中;
10
信号量可能的取值范围 假设有 N 个并发进程共用一台打印机,设 互斥信号量mutex的初值为1,则:
信号量mutex代表什么?
mutex的取值范围为多少? mutex的值分别代表什么含义?
11
N个并发进程,互斥信号量mutex的初值为1: mutex的取值范围为:1~-(N-1) 1 :表示没有进程进入临界区。有一个资源,无 进程等待; 0:表示有1个进程进入临界区。无资源,无进程 等待; -i :表示 1 个进程进入 临界区 。无资源,且有 i (i<=N-1)个进程等待进入。
7
信号灯ຫໍສະໝຸດ BaiduPV操作
void signal(semaphore s) { s.value = s.value + 1; if (s.value <= 0) wackup(s.queue);
/* 唤醒阻塞进程,将其从等待队列s.queue 取出,投入就绪队列*/
}
V操作
用信号灯解决互斥问题
semaphore mutex=1; P1: while (1){ P(mutex); 临界区; V(mutex); 剩余区; };
第3 章
进程同步与通信
●进程同步与互斥
本章要点
●经典进程同步问题
●AND信号量 ●管程
●进程通信
进程同步的基本概念
●同步:指多个进程中发生的事件存在着某种时
序关系,它们必须按规定时序执行,以共同完成 一项任务 。 ●互斥:多个进程不能同时使用同一资源。 ●临界资源:某段时间内仅允许一个进程使用的 资源。 ●临界区:每个进程中访问临界资源的那段代码。
Pp: B:wait(buffull) 打印buf中的数据 清除buf中的数据 buffullfalse signal(bufempty) Goto B
wait等待合作进程发来的消息 signal向合作进程发送消息
39
main()
{ int bufempty=1,buffull=0; cobegin Pc(); Pp(); coend }
① sem减1 ② 若sem减1后仍大于1或等于零, 则P返回,进程继续; ③ 若 sem 减 1 后小于零,则该进程 阻塞转等待队列中。
5
信号灯的PV操作
void wait(semaphore s) { s.value = s.value - 1; if (s.value < 0) block(s.queue);
③(有化验结果)继续诊病
27
对于化验员的操作步骤:
①等化验单 ②(有化验单时)进行化验
(未化验的化验单少一个)
③出化验结果(化验结果多一个)
④等待下一化验单
28
需要两个信号量 s1: 表示化验结果是否出来,初值为0. s2:表示医生是否开化验单,初值为0.
程序描述
main( )
{
int s1 =0;
14
针对临界资源机票数设置一个信号量mutex,初值 为1。每个终端进程中的程序描述如下:
P(mutex);
在机票数据库中取出当前剩余票数X;
判断X>0(有票吗)?
如果有, X≥N(票够吗)? 如果够,则出票(打印票据); X=X-N(修改剩余票数); 将X回写到数据库中;
互斥问题举例3
某车站售票厅有20个窗口,任何时刻最多可容 纳20名购票者进入,当售票厅中少于20名购票 者时,则厅外的购票者可立即进入,否则需在 厅外等待。若把一个购票者看作一个进程,请 用P、V操作管理这些并发进程,要求如下: ⑴.在主函数中给出信号量的定义和初值。 ⑵.给出一个购票者进程的算法。 ⑶.给出当购票者最多不超过n (设n>20)个时, 信号量可能的变化范围。
37
利用过程 wait 和 signal 可简单地描述计算 进程Pc和打印进程Pp的同步关系:
设消息名 bufempty 表示 buf 空,消息名
buffull表示buf中装满了数据。
bufempty=true,buffull=false
38
描述:
Pc:
A:wait(bufempty) 计算 buf计算结果 bufemptyfalse signal(buffull) Goto A
返回
42
同步的定义 异步环境下,一组并发进程,因直 接制约而互相发送消息而进行相互 合作,互相等待,使得各进程按一
定的速度执行的过程称为进程间同
步。
返回
43
合作进程:具有同步关系的一组
并发进程称为合作进程。 消息:合作进程间互相发送的信
号称为消息或事件。
返回
44
私用信号量 把进程间发送的消息看作信号量,则这种 信号量只与制约进程及被制约进程有关而 不是整组并发进程有关(如进程互斥),称这
P2: while (1){ P(mutex); 临界区 V(mutex); 剩余区; };
互斥进程举例1-两个进程共享一台打印机 设信号量print代表打印机,初值为1. pa() int main(void) { { P(print); int print=1; 使用打印机 V(print); cobegin } pa(); pb(); pb() coend { } P(print); print=1 表示没有进程使用打印机 使用打印机 print=0 表示一个进程在用,没有进程等待 V(print); print=-1 表示一个进程在用,另一个在等待 }