第三章进程管理2(同步和互斥1)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
a
e b S3
S5
h S7 j S8
S1
f
g S6 i
c S4
27
进 程 管 理
例 2 : 已 知 一 个 求 值 公 式 ( A2+3B )
/(B+5A),若A,B已赋值,试画出该公式求 值过程的前趋图。 解:在该公式的求值过程中,有些运算 分量的执行是可以并发执行的。为了描 述方便,可设置一些中间变量保存中间 结果,并给每个语句命名,其求值过程 如下:
20
进 程 管 理
利用P、V原语实现进程互斥
设mutex为互斥信号量,取值范围为(1,0,-1), 有两个并发的进程PA、PB mutex =1表示进程PA、PB都没有进入类名为S的临 界区 mutex =0表示进程PA、PB中的一个已经进入临界区 mutex =-1表示进程中,一个进程已经进入临界区, 另一个进程阻塞,等待进入临界区
28
开始 S1:x1=A*A S2:x2=3*B S3:x3=5*A
S4:x4=x1+x2
S5:x5=B+x3
S1 S2 S3
S6:x6=x4/x5 结束
S4
S5
(A2+3B)/(B+5A)
S6
作业
如下图具有6个节点的前驱图,利用信号 量机制来解决该前驱图所描述的并发执 行的过程。
S1 S1 S1
Struct smaphore a,b,c,d,e,f,g,h,I,j=0,0,0,0,0,0,0,0,0,0 cobegin {S1;V(a);V(b);V(c);} {P(a);S2;V(d);} {P(b);S3;V(e);V(f);} {P(c);S4;V(g);} {P(d);P(e);S5;V(h);} {P(f);P(g);S6;V(i)} {P(h);P(i);S7;V(j);} {P(j);S8;} S2 d coend
简言之,同步机制的准则有: 1 空闲让进;2 忙则等待; 3 让权等待;4 有限等待;
4
进 程 管 理
加锁法
一种可能的办法是对临界区加锁以实 现互斥。 设临界区的类名为S,为了保证每一次 临界区中只能有一个程序段被执行,又设 锁定位Key[S],Key[S]表示锁定位属于类 名为S的临界区。加锁后的临界区程序描 述如下: lock ( key[S] ) <临界区> unlock( key[S] )
10
进 程 管 理
二、 进程同步 概念:指多个合作进程为了完成同一个 任务,它们在执行速度上必须相互协调, 即一个进程的执行依赖于另一个进程的 消息,当没有消息时要等待,直到消息 到达被唤醒。 具有同步关系的一组并发进程称为合作 进程,合作进程间互相发送的信号称为 消息或事件。
11
进 程 管 理
进程同步的传送消息实现 如果对一个事件或消息赋以唯一的消息 名,则过程wait (消息名)表示进程等待 合作进程发来消息,功能是等待到消息 名为true的进程继续执行; 过程signal (消息名)表示向合作进程发 送消息,功能则是向合作进程发送所需 要的消息名,并将其值置为true。
12
进 程 管 理
23
进 程 管 理
用信号量机制解决前趋图问题
方法:
若图中存在结点S1指向结点S2的有向边, 表示进程P1中的程序段S1应该先执行,而进程 P2中的程序段S2后执行。设置一个信号量s,初 值为0,将V(s)放在S1后面,而在S2前面先执行 P(s)。
S1 S1
s
S2
进程P1的语句序列为:S1;V(s) 进程P2的语句序列为:P(s);S2
是一个记录型的数据结构,包含两个数 据项,一是记数值域,另一是等待该信 号量的进程队列首指针域。描述如下: typedef struct semaphore { int value; PCB *p; }
18
进 程 管 理
P(s)和V(s)操作原语
void P(s) struct semaphore s; { s.value=s.value-1; if (s.value<0) block(s.p); } void v(s) struct semaphore s; { s.value=s.value+1; if (s.value<=0) wakeup(s.p); }
进 程 管 理
3.3 进程的同步与互斥
进程的同步和互斥机制的主要任务:控 制并发执行的诸进程之间能有效地共享 和相互协作,同时使并发执行的程序仍 具有可再现性。 进程互斥 进程同步 利用信号量机制解决具体问题
1
进 程 管 理
并发系统中诸进程由于资源共享、进程合作, 而产生进程之间的相互制约;又因共享资源的 方式不同,而导致两种不同的制约关系: 1 间接制约关系(进程互斥)
24
例1 利用信号量来描述前趋图关系
S2 S5
S1
S3
S6 S4
S7
S8
进 程 管 理
具有8个结点的前趋图。图中的前趋图中 共有有向边10条,可设10个信号量,初 值均为0;有8个结点,可设计成8个并发 进程,具体描述如下:
S2 a
S1 b d
e S3
f g
S5
h S7
j
S8
c
S4
S6
i
26
进 程 管 理
14
进 程 管 理
利用信号量机制解决问题
信号量机制:由Diskstra提出的一种解决 进程的同步与互斥的工具。 信号量——用于表示资源数目或请求使 用某一资源的进程个数的整形量. S是与临界区内所使用的公用资源有关的 信号量。 S≥0 可供并发进程使用的资源数 S<0 正在等待使用临界区的进程数
15
6
进 程 管 理
一种简便的实现方法是:
lock(x)= begin local v repeat v x until v=1 (临界资源成为可用) x 0 end
7
进 程 管 理
不过,这种方法是不能保证并发进程互斥执 行所要求的准则(3)的(只允许一个进程进入 临界区)。为了解决这个问题,有些机器在硬件 中设置了“测试与设置(test and set)指令”。 此外,有一点需要注意的是:在系统试验时锁定 为key[S]总是设置在公有资源所对应的数据结构 中的。
例:计算进程和打印进 程的同步关系. 设消息名bufempty表示 buf空, 初始化 bufempty =true, Pc: while(true){ wait(bufempty) 计算 buf计算结果 bufempty false signal(buffull)}
设消息名buffull表示buf 满. Buffull=false. Pp: while(true){ wait(buffull) 打印Buf中的数据 清除Buf中的数据 buffull false signal(bufempty)}
19
进 程 管 理
s.value的物理含义
当s.value>0数值时,表示某类可用资源的数量。 而当s.value<0数值时,表示该类资源已分配完。 若有进程请求该类资源,则被阻塞,其绝对值 等于等待该类资源的进程数。 每次的P(s)操作,意味着进程请求分配该类资 源的一个单位资源。相反,执行一次V(s) 操作 意味着进程释放相应资源的一个单位资源。当 值小于等于0时,表明有进程被阻塞,需要唤 醒。
进 程 管 理
P原语操作的主要动作
S-1 如果S-1以后仍大于等于零,则进程继续进 行 如果S-1以后小于等于零,则将该进程阻塞 以后插入阻塞队列,然后转进程调度
V原语操作的主要动作
S+1 如果相加后结果大于零,则继续进行 相加后结果小于零,则从该信号的等待队列 中唤醒一个等待进程,然后返回原进程继续 执行或者转进程调度。
由于共享资源而引起的暂临界区内不允许并发进程 交叉执行的现象。由共享公有资源而造成的对并发进 程执行速度的间接制约
2 直接制约关系(进程同步)
由于并发进程互相共享对方的私有资源所引起的直 接制约。
2
进 程 管 理
一、进程互斥
什么叫互斥? 一组并发进程中的一个或多个程序段,因共享 某一公有资源而导致它们必须以一个不允许交 叉执行的单位执行。即不允许两个以上的共享 该资源的并发进程同时进入临界区称为互斥。 临界资源:一次仅允许一个进程使用的资源。 临界区:每个进程中访问临界资源的那段代码 (critical section)。 (不允许多个并发进程交叉执行的那段程序)
3
进 程 管 理
临界区的管理 计算机专家Dijkstra 1965年提出临界区设 计原则,即一组并发进程互斥执行时必须满足: ①每次至多有一个进程处于临界区 ②当若干进程同时要求进入它们的临界区时,应 在有限时间内使一进程进入临界区,而不应相 互堵塞而致使彼此不能进入临界区 ③进程仅在临界区内逗留有限的时间。
S1
S1
S1
进 程 管 理
1:生产者-消费者的同步问题 举例:
一个生产者
产品
一个消费者
仓库
生产者把产品生产出来,送入仓库。给 消费者发信号,消费者得到信号后,到仓库 取产品,取走产品后给生产者发信号……
31
进 程 管 理
Begin s1,s2:sem; s1:=1; s2:=0; Cobegin procedure p begin L1:生产产品; p(s1); 放产品; V(s2); goto L1; end
procedure c begin L2: 想取产品 P(s2); 取产品; V(s1); goto L2; end Coend End
32
进 程 管 理
2)发送进程和接收进程的同步问题 利用信号量可以解决合作进程之间的同 步。 例:设进程Pa,Pb通过缓冲区队Biblioteka Baidu传送数 据
Pa
BUF1
21
进 程 管 理
mutex:integer:=1; cobegin p1: {
while(true){ p(mutex) 临界区代码 v(mutex) … } } coend
p2: { while(true){ p(mutex) 临界区代码 v(mutex) … } }
22
进 程 管 理
用信号量解题的关键
16
入口
入口
s.value=s.value-1
s.value≥0 调度进程入等待队列
是
s.value=s.value+1
返回 s.value≤0
是 唤醒等待队列中的一个进程 否
返回
s.value<0
转进程调度 P原语操作功能流程图
返回或转进程调度 V原语操作功能流程图
进 程 管 理
记录型的信号量机制
8
进 程 管 理
Test-and Set指令 定义了一个boolean变量,lock 当lock=false时,表示该资源空闲; 当lock=true时,表示该资源正被使用
9
进 程 管 理
加锁法和P、V原语法: 加锁法是采用反复测试lock而实现互 斥的,存在CPU浪费和不公平现象;而 P、V原语法是采用信号量来管理相应 的临界区的共有资源,信号量的值只能 由P、V原语操作来改变,克服了加锁 法的弊端。
步骤: 信号量的设置; 给信号量赋初值(常用的 互斥和同步信号量值的大小); P、V操作安排的位 置(其中,P的顺序不能颠倒,V的顺序任意) 注意区分1)公用信号量,互斥时使用的信号量(二元 信号量):它仅允许取值为“0”与“1”,用作互 斥。它联系着一组共行进程,初值为1,每个进程均 可对之施加P、V操作。 2)私用信号量:一般信号 量(资源信号量):它联系着一组共行进程,但其初 值为0,或为某个正整数n,表示资源的数目,主要 用于进程同步。只允许拥有它的进程对之施加P操作。
13
进 程 管 理
进程同步和互斥间的关系
相似处:进程的互斥实际上是进程同步的一种
特殊情况; 进程的互斥和同步统称为进程同步。 差别:进程互斥是进程间共享资源的使用权 , 这种竞争没有固定的必然联系,哪个进程竞争 到使用权就归那个进程使用,直到不需要使用 时在归还;而进程同步则涉及共享资源的并发 进程间有一种必然的联系,当进程必须同步时, 即使无进程在使用共享资源时,那么尚未得到 同步消息的进程也不能去使用这个资源。
5
进 程 管 理
设key[S]=1时表示类名为S的临界区可用, key[S]=0时表示类名为S的临界区不可用。 则,unlock(key[S])只用一条语句即可实现。 即: key[S] 1 不过,由于lock(key[S])必须满足 key[S]=0时,不允许任何进程进入临界区, 而key[S]=1时仅允许一个进程进入临界区的 准则,因而实现起来较为困难。