收藏 分享(赏)

进程管理三互斥和同步二计算机软件及应用it计算机专业资料PPT课件.ppt

上传人:微传9988 文档编号:2296232 上传时间:2018-09-10 格式:PPT 页数:70 大小:979KB
下载 相关 举报
进程管理三互斥和同步二计算机软件及应用it计算机专业资料PPT课件.ppt_第1页
第1页 / 共70页
进程管理三互斥和同步二计算机软件及应用it计算机专业资料PPT课件.ppt_第2页
第2页 / 共70页
进程管理三互斥和同步二计算机软件及应用it计算机专业资料PPT课件.ppt_第3页
第3页 / 共70页
进程管理三互斥和同步二计算机软件及应用it计算机专业资料PPT课件.ppt_第4页
第4页 / 共70页
进程管理三互斥和同步二计算机软件及应用it计算机专业资料PPT课件.ppt_第5页
第5页 / 共70页
点击查看更多>>
资源描述

1、1,2.3 进程互斥和同步,复习 临界资源、临界区定义, 同步机制遵循的原则 记录型的信号量内部成员 的意义signal wait操作含义 怎样利用信号量解决进程之间的前趋关系?,2,临界区(critical section):进程中访问临界资源的一段代码。 进入区(entry section):在进入临界区之前,检查可否进入临界区的一段代码。如果可以进入临界区,通常设置相应“正在访问临界区“标志 退出区(exit section):用于将“正在访问临界区“标志清除。 剩余区(remainder section):代码中的其余部分。,返回,3,2.3.1 基本概念-临界区,2、临界区:每个进程

2、中访问临界资源的那段程序段称为临界区(临界段)。,4,2.3.1 基本概念-临界区的访问过程,临界区的访问过程,返回,进入区,退出区,临界区,5,同步机制应遵循的准则,空闲让进:其他进程均不处于临界区; 忙则等待:已有进程处于其临界区; 有限等待:等待进入临界区的进程不能“死等“; 让权等待:不能进入临界区的进程,应释放CPU(如转换到阻塞状态),返回,6,2.3.2 信号量(semaphore),需要一个地位高于进程的管理者来解决公有资源的使用问题。OS可从进程管理者的角度来处理互斥的问题,信号量就是OS提供的管理公有资源的有效手段。,1965年,由荷兰学者Dijkstra提出(所以P、V分

3、别是荷兰语的test(proberen)和increment(verhogen)),是一种卓有成效的进程同步机制。 信号量是一个被保护的变量,被初始化之后,只有wait操作、signal操作才能访问和改变它的值。信号量代表可用资源实体的数量。 wait操作、signal操作又称为P、V操作。它们都是原子操作(原语),7,2.3.2 信号量(semaphore),一、整型信号量整型信号量是表示共享资源状态且只能由特殊的原子操作改变的整型量。 想法:定义一个整型变量,用整形变量值来标记资源使用情况:如整型量0,说明有可用资源;整型量0说明资源忙,进程必须等待。对于一次只允许一个进程访问的临界资源,

4、可定义一个用于互斥的整型信号量,并初始化为1。,8,2.3.2 信号量(semaphore),一、整型信号量利用整型信号量实现互斥方法:想法:为必须互斥访问的CS定义一个互斥信号量mutex,初始值为1,然后将CS放入wait(mutex)和signal(mutex)之间,当CS可访问时,wait(mutex)才能正常结束使进程进入CS。,9,三、利用信号量来协调进程执行的顺序 例1:P1、P2两个进程, P1 中有语句S1,P2中有语句S2,要求S2必须在S1结束后执行,为此,设置一个信号量S,初始值为0。parbeginP1: S1; Signal(s); P2: Wait(s); S2

5、; parend,10,三、利用信号量来描述前趋关系 例2:有P1,P2两个进程:S1,S2,SS6分别是P1、P2中的语句,我们要求它们的执行顺序如下图所示 :,11,12,利用整型信号量来描述前趋关系-例2 Semaphore a,b,c,d,e,f,g=0,0,0,0,0,0; cobeginbegin s1; signal(a); signal(b); end;begin wait(a); s2;signal(c); signal(d); end;begin wait(b); s3;signal(g); end;begin wait(c); s4;signal(e); end;begi

6、n wait(d); s5;signal(f); end;begin wait(e); wait(f); wait(g); s6; end.coend ,13,记录型信号量和wait、signal原语,信号量是一个确定的二元组(value, list),value 是一个具有非负初值的整型变量,list 是一个初始状态为空的队列。 value代表资源的实体。在实际应用中应准确地说明s的意义和初值; 初始化指定一个非负整数值,表示空闲资源总数(又称为“资源信号量”)若为非负值表示当前的空闲资源数,若为负值其绝对值表示当前等待临界区的进程数 List:每个信号量的相关队列,表示因得不到临界资源而阻

7、塞的进程,其初始状态为空。,14,2.3.2.1 信号量和wait、signal原语,信号量只能通过初始化和两个标准的原语来访问作为OS核心代码执行,不受进程调度的打断 在实际操作系统中,一般情况下是由机器硬件提供P、V操 作的指令,当然是原子操作,若机器不提供P、V操作的指 令,则操作系统提供P、V操作原语。 信号量的形式化定义: typedef struct int value;struct process_control_block *list; semaphore;,1. wait原语,15,wait(semaphore *S) S-value-; /表示申请一个资源;if S-val

8、uelist); /如果没有空闲资源,调用进程进入和信号量S相关的等待队列 s.L; 阻塞调用wait 的进程,2. V原语(signal),procedure signal(S)var S: semaphore;beginS.value:=S.value+1; /表示释放一个资源;if S.value=0 then wakeup(S.L);/如果有进程处于阻塞状态,从等待队列s.L中取出一个进程P,将其唤醒;end,16,V原语通常唤醒进程等待队列中的头一个进程,17,3. 利用信号量实现互斥,为临界资源设置一个互斥信号量mutex(MUTual Exclusion),其初值为1;在每个进程

9、中将临界区代码置于P(mutex)和V(mutex)原语之间 必须成对使用Wait和Signal原语:遗漏Wait原语则不能保证互斥访问,遗漏Signal原语则不能在使用临界资源之后将其释放(给其他等待的进程);两个原语不能次序错误、重复或遗漏,18,4 用信号量实现进程的同步,共享缓冲区的合作进程的同步设有一个缓冲区buffer,大小为一个字节,CP进程不断产生字符,送buffer,IOP进程从buffer中取出字符打印。如不加控制,会有多种打印结果,这取决于这两个进程运行的相对速度。在这众多的打印结果中,只有CP、IOP进程的运行刚好匹配的一种是对的,其它均为错误,并且不能重现。,19,4

10、 用信号量实现进程的同步,要保证打印结果的正确, CP、IOP必须遵循以下同步规则: (1)当CP把结果送入buffer后,IOP才能从buffer中取,否则IOP必须等待; (2)当IOP从buffer中取走数据后,CP才能将新产生数据送buffer,否则也必须等待。,CP,IOP,20,4 用信号量实现进程的同步,解决这个问题的步骤: (1)分析问题,弄清楚同步关系,如上分析; (2)设置信号量 ,说明含义、初值; (3)写出程序描述。 两个信号量控制两个进程依次运行。 信号量Sa:表示缓冲区是否有数据可供打印; 初值为0,表示刚开始时候没有数据 信号量Sb:表示是否可以向缓冲区放新数据;

11、 初值为1,表示刚开始时候可以放数据。,21,4 用信号量实现进程的同步,CP( )/计算进程 计算,得到一个结果;将结果送到缓冲区;,IOP( )/打印进程 从缓冲区中取出一个数据;打印取出的数据;,wait(sb);,signal(sa);,wait(sa);,signal(sb);,22,4 用信号量实现进程的同步,23,补充题1:,三个进程:输入、计算、打印,写出同步算法。,缓冲区a,缓冲区b,输入,输出,计算,24,经典进程同步问题,生产者消费者问题 有界缓冲区问题的建模 哲学家进餐问题 多进程同步问题的建模 读者写者问题 数据库互斥访问问题的建模 理发师睡觉问题 CS模式进程同步问

12、题的建模,进程通信,生产者消费者问题(引入),单进程多缓模型:与前面例子类似,但是有多个缓冲区。如何描述多缓冲区?,用循环队列描述多缓冲区,第一个缓冲区 B0 第二个缓冲区 B1 第n个缓冲区 Bn-1 假设共有n个缓冲区,P是当前第一个空缓冲区下标,那么下一个缓冲区下标表示为:P = (P + 1) mod n,Empty:表示有多少空缓冲区,初值为n; Full:表示有多少带数据的缓冲区,初值为0,生产者消费者问题(引入),一个生产者进程和一个消费者进程,27,4 用信号量实现进程的同步- 生产者消费者问题,我们把上面的例子扩充,假定缓冲区buffer是一个有界缓冲区,可存放n个数据,同时

13、假定有n个CP进程不断地产生数据,并送buffer;有m个IOP进程从缓冲区中取数据打印。 在我们生活中有很多这样的例子。,28,问题描述 一个有限空间的共享缓冲区,负责存放货物 生产者向缓冲区中放物品,缓冲区满则不能放 消费者从缓冲区中拿物品,缓冲区空则不能拿,(如何体现进程的同步),28,29,4 用信号量实现进程的同步- 生产者消费者问题P48,对于生产者进程:产生一个数据,当要送入缓冲池时,要检查缓冲池是否已满,若未满,则可将数据送入某个缓冲区,并通知消费者进程;否则,等待; 对于消费者进程:当它去取数据时,要看缓冲池中是否有数据可取,若有则取走一个数据,并通知生产者进程,否则,等待。

14、 这种相互等待,并互通信息就是典型的进程同步。 同时,缓冲池是个临界资源,因此,诸进程对缓冲区的操作程序是一个共享临界区,因此,还有个互斥的问题。,30,4 用信号量实现进程的同步- 生产者消费者问题,互斥关系分析 任何时刻,只能有一个进程在缓冲池中操作 引入互斥信号量(mutex) 信号量为0,表明已有进程进入临界区; 同步关系分析 对于“生产者”而言,缓冲池全满则应等待 引入同步信号量“empty”,为0表示缓冲池全满 对于“消费者”而言,缓冲池全空则应等待 引入同步信号量“full”,为0表示缓冲池全空,31,4 用信号量实现进程的同步- 生产者消费者问题,32,4 用信号量实现进程的同

15、步- 生产者消费者问题,我们可利用一个数组来表示具有n个(0,1,n-1)缓冲区的缓冲池。 两个下标: 用输入指针in来指示下一个可投放产品的缓冲区,每当生产者进程生产并投放一个产品后,输入指针加1; 用输出指针out来指示下一个可从中获取产品的缓冲区,每当消费者进程取走一个产品后,输出指针加1。由于这里的缓冲池是组织成循环缓冲的, 故应把输入指针加1表示成 in:= (in+1)mod n; 输出指针加1表示成out:= (out+1) mod n。,在生产者进程中使用一局部变量nextp,用于暂时存放每次刚生产出来的产品;而在消费者进程中,则使用一个局部变量nextc,用于存放每次要消费的

16、产品。,35,semaphore mutex,empty,full=1,n,0;item buffern ;int in,out=0,0;cobegin void proceducer( ) do producer an item nextp;wait(empty); wait(mutex);bufferin:=nextp;in:=(in+1) mod n;signal(mutex);signal(full); while(TRUE);,void consumer( )do wait(full);wait(mutex);nextc:=bufferout;out:=(out+1) mod n;

17、signal(mutex); signal(empty);consumer the item in nextc; while(TRUE); coend,36,4 用信号量实现进程的同步- 生产者消费者问题,思考1:mutex和empty两个信号量之间有什么区别吗? 思考2:多信号量的操作顺序有要求吗?,互斥信号量 mutex:防止多个进程同时进入临界区 同步信号量 empty和full:保证事件发生的顺序 缓冲区满时,Producer停止运行 缓冲区空时,Consumer停止运行 概念差别互斥与同步(并发的两个要素) 互斥:保护临界区,防止多个进程同时进入 同步:保证进程运行的顺序合理,思考,

18、生产者进程中,两个wait操作的顺序能否互换? 生产者进程先执行wait(mutex),再执行wait(empty), 何时会出错? 消费者进程中,先wait(mutex),再wait(full)何时会出错?,37,如果某种原因使得生产者进程执行了多次,而消费者进程一次也没执行,从而全部缓冲区都存满新数据时,再执行一次生产者进程就会死锁。,如果某种原因使得消费者进程执行了多次,而生产者进程一次也没执行,从而全部缓冲区都为空时,再执行一次消费者进程就会死锁。,38,同步/互斥信号量的使用方法,互斥信号量 必定成对出现:进入临界区临界区退出临界区 同步信号量 未必成对出现,依赖于同步关系的性质 同

19、步信号量和互斥信号量的操作顺序 基本原则:互斥信号量永远紧邻临界区:同步在前,互斥在后。,39,2.4.2 信号量集,一段处理代码需要同时获取两个或多个临界资源可能死锁:各进程分别获得部分临界资源,然后等待其余的临界资源,“各不相让“ 基本思想:在一个原语中,将一段代码同时需要的多个临界资源,要么全部分配给它,要么一个都不分配。称为Swait(Simultaneous Wait)。在Swait时,各个信号量的次序并不重要,虽然会影响进程归入哪个阻塞队列,但是由于是对资源全部分配或不分配,所以总有进程获得全部资源并在推进之后释放资源,因此不会死锁。,信号量集用于同时需要多个资源时的信号量操作;,

20、1. AND型信号量,AND型信号量用于同时需要多种资源且每种占用一个时的信号量操作;,40,Swait(S1, S2, , Sn) /P原语;while (TRUE)if (S1 =1 将调用进程的PC置为swait操作开头 ,41,Ssignal(S1, S2, , Sn)for (i = 1; i = n; +i)+Si; /释放占用的资源;for (each process P waiting in Si.L)/检查每种资源的等待队列的所有进程;从等待队列Si.L中取出进程P;进程P进入就绪队列; ,需要注意: 原先处于阻塞状态的进程,被唤醒后,从何处开始执行? 与 记录型信号量机制有

21、何不同?,42,1. 生产者消费者问题(the producer-consumer problem),问题描述:若干进程通过有限的共享缓冲区交换数据。其中,“生产者“进程不断写入,而“消费者“进程不断读出;共享缓冲区共有N个;任何时刻只能有一个进程可对共享缓冲区进行操作。,43,生产者消费者问题 AND型信号量,若不愿意考虑wait操作的先后顺序,也可用AND型信号量来实现。 生产者进程中: 用Swait(empty,mutex)代替wait(empty)和wait(mutex), 用Ssignal(mutex,full)代替signal(mutex)和signal(full) 消费者进程中

22、用Swait(full,mutex)代替wait(full)和wait(mutex), 用Ssignal(mutex,empty)代替signal(mutex)和signal(empty),producer: begin repeat produce an item in nextp; Swait(empty,mutex); buffer(in):=nextp; in:=(in+1)mod n; Ssignal(mutex,full); until false; end,consumer: begin repeat Swait(full,mutex); Nextc:=buffer(out);

23、Out:=(out+1) mod n; Ssignal(mutex,empty); consumer the item in nextc; until false; end,45,2. 一般“信号量集”,问题:一次需要N个某类临界资源时,就要进行N次wait操作低效又可能死锁 方法:在AND型信号量集的基础上进行扩充:进程对信号量Si的测试值为ti(用于信号量的判断,即当Si= ti时,表示可用资源数量大于ti,才分配资源,否则便不予分配),占用值为di(用于信号量的增减,即 分配资源时Si = Si di 释放资源时Si = Si + di) Swait(S1, t1, d1; .; Sn,

24、 tn, dn); Ssignal(S1, d1; .; Sn, dn);,一般信号量集用于同时需要多种资源、每种占用的数目不同、且可分配的资源还存在一个临界值时的处理;,46,Swait(S1, S2, , Sn) /P原语;while (TRUE)if (S1 =1 将调用进程的PC置为swait操作开头 ,47,Ssignal(S1, S2, , Sn)for (i = 1; i = n; +i)+Si; /释放占用的资源;for (each process P waiting in Si.L)/检查每种资源的等待队列的所有进程;从等待队列Si.L中取出进程P;进程P进入就绪队列; ,需

25、要注意: 原先处于阻塞状态的进程,被唤醒后,从何处开始执行? 与 记录型信号量机制有何不同?,48,一般“信号量集“的几种特定情况: Swait(S, d, d)表示每次申请d个资源,当少于d个时,便不分配; Swait(S, 1, 1)表示互斥信号量; Swait(S, 1, 0)作为一个可控开关 当S=1时,允许多个进程进入临界区; 当S=0时,禁止任何进程进入临界区; 一般“信号量集“未必成对使用Swait和Ssignal:如:一起申请,但不一起释放;,49,2. 读者写者问题(the readers-writers problem),问题描述 写者向数据区放数据,读者从数据区获取数据

26、多个读者可同时读取数据 多个写者不能同时写数据 读者和写者的控制策略变化多端,50,读者写者问题的信号量解法,互斥关系分析 读者和写者不能同时进入共享数据区 多个写者不能同时进入共享数据区 多个读者可以同时进入共享数据区 同步关系分析 读者进入缓冲区,写者必须等待 写者进入缓冲区,读者必须等待 三种类型: 读者优先:一旦有读者进入,则后续读者均可进入 合理顺序:读者在先来的写者之后 写者优先:只要有写者等待,则后续读者必须等待,写-写互斥,读-写互斥,51,当读者进程到来时,三种情况: 1)无读者、写者:新读者可以读 2)有写者等待,但有其它读者正在读:新读者也可以读 3)有写者写:新读者等当

27、写者进程到来时,三种情况: 1)无读者、其他写者:新写者可以写 2)有读者:新写者等待 3)有其它写者:新写者等待,读-写互斥,读-写互斥,写-写互斥,读-写互斥,读-写互斥 写写互斥: 互斥信号量Wmutex,怎样判断有没有读者在读?,52,增加一个公共变量Readcount,表示当前有几个读者进程在读。,新来一个读者进程,Readcount加1; 撤销一个读者进程,Readcount减1;,第一个读者:阻塞所有写者进程;允许其他读者进程执行。 最后一个读者:唤醒可能的写者进程。,Readcount成为临界资源,必须互斥访问: 增加互斥信号量Rmutex,53,采用信号量机制: 两种进程:

28、Reader、Writer 两个信号量 Wmutex表示读者和写者之间互斥,初值是1。 公共变量Readcount表示“正在读”的进程数,初值是0; Rmutex表示读者对Readcount的互斥操作,初值是1。 Readcount0时允许写,分析小结,54,wait(rmutex); If readcount=0 then wait(wmutex); Readcount:=readcount+1; signal(rmutex); 执行读取操作 wait(rmutex); Readcount:=readcount-1 if readcount=0 then signal(wmutex); si

29、gnal(rmutex);,读者-写者问题,读者部分,第一个读者要阻塞所有后来的写者,最后一个读者要唤醒所有阻塞的写者,55,wait(wmutex); 执行写操作 signal(wmutex);,写者部分,56,增加限制条件,即同时读取的读者数不能超过RN L,mx:=RN,1 信号量集: Swait(S,d,t); Ssignal(S,d) S为信号量,d为需求量,t为下限值,写者: Swait(mx,1,1;L,RN,0); 执行写操作 Ssignal(mx,1);,读者-写者问题 一般“信号量集“机制,读者: Swait(L,1,1); Swait(mx,1,0); 执行读取操作 Ss

30、ignal(L,1);,If(L=1)L=L-1;,If(mx=1)mx=mx;,If(mx=1 ,57,3. 哲学家进餐问题 (the dining philosophers problem),问题描述:(由Dijkstra首先提出并解决)5个哲学家围绕一张圆桌而坐,桌子上放着5支筷子,每两个哲学家之间放一支;哲学家的动作包括思考和进餐,进餐时需要同时拿起他左边和右边的两支筷子,思考时则同时将两支筷子放回原处。如何保证哲学家们的动作有序进行?如:不出现相邻者同时要求进餐;不出现有人永远拿不到筷子;,58,59,1.利用记录型信号量机制解决 2.利用AND型信号量机制解决,2.4.2哲学家就餐

31、问题,60,哲学家就餐问题,问题分析: 筷子是临界资源:每根有多于一个哲学家要用,而且同时只能有一个哲学家使用 5根筷子可以用5个信号量表示。形成信号量数组: var chopstick:array0,4of semaphore; 所有信号量初值为1,表示未被使用。,61,哲学家就餐问题解决方法,第i位哲学家的活动描述为: Repeat wait(chopsticki);wait(chopstick(i+1)mod 5);eat;signal(chopsticki);signal(chopstick(i+1)mod 5);think; Until false;,parbegin philoso

32、pher (0); philosopher (1); philosopher (2); philosopher (3); philosopher (4); parend,62,不足之处及改进方法,可能产生死锁: 五位哲学家同时饥饿,各自拿起左边的筷子时,会使得所有信号量的值为0,再试图拿起右边的筷子时,都将拿不到筷子。 解决死锁的方法: 至多允许四个哲学家同时进餐。 仅当哲学家的左右两支筷子均可用时,才进餐。(用AND信号量机制解决哲学家进餐问题。) 奇数号哲学家先拿左边的筷子,偶数号哲学家先拿右边的筷子。,63,AND型信号量机制解决哲学家就餐问题,要求哲学家同时获得两根筷子,否则一根也不拿

33、。 var chopstick:array0,4of semaphore:=(1,1,1,1,1); /第i位哲学家进程: Repeatthink;Sswait(chopstick(I+1)mod 5),chopstickI);Eats;Ssignal(chopstick(I+1)mod 5),chopstickI); until false;,64,思考: 用其余两种思路,怎样解决哲学家就餐问题?,65,10. 有一阅览室,读者进入时必须先在一张登记表上进行登记,该表为每一座位列一表目,包括座号和读者姓名。读者离开时要消掉登记信号,阅览室中共有100个座位,请问:,(1) 为描述读者的动作,

34、应编写几个程序?设置几个进程?进程与程序间的对应关系如何?,(2) 用类Pascal语言和Wait, Signal操作写出这些进程间的同步算法。,66,答:(1) 应编写1个程序;设置2个进程; 进程与程序间的对应关系是:多对1。,(2) begin S1:=100 (有100个座位) S2:=0 (没有阅读者) mutex: =1 cobegin P1: repeat P(S1); P(mutex); 登记信息; V(muetx); V(S2)就座,阅读; until false coend end,P2: repeat P(S2) P(mutex); 消掉信息; V(muetx); V(S

35、1); 离开阅览室; until false,67,经典问题:睡眠理发师问题,问题描述 一把理发椅,N把等待座位 理发师为理发椅上的顾客理发,没有顾客时就在理发椅上睡觉 有一个顾客时需要叫醒理发师 多个顾客时需要在等待座位上等候,进程通信,68,作业,设有5个哲学家,共享一张放有5把椅子的桌子,每人分得1把椅子。但是,桌子上总共只有5支筷子,在每人两边分开各放一支。哲学家们在肚子饥饿时才试图分两次从两边拾起筷子就餐。 条件: 1)只有拿到两支筷子时,哲学家才能吃饭。 2)如果筷子已在他人手上,则该哲学家必须等待到他人吃完之后才能拿到筷子。 3)任何哲学家在自己未拿到两支筷子吃饭之前,决不放下自已手中的筷子。 要求: 1)有什么情况下5个哲学家全部吃不上饭? 2)描述一种没有人饿死(永远拿不到筷子)算法。,69,实验,进程同步互斥问题模拟,70,小结,顺序执行和并发执行 进程的定义(与程序比较),静态表示(上下文,包括PCB),动态表示(状态),用户代码和OS代码 进程控制(注意:挂起和激活),UNIX和Windows NT举例 线程:引入原因,与进程比较 互斥和同步:信号量,信号量集,管程 进程间通信IPC:信号,共享存储区,管道,消息,管套 死锁问题:原因,条件,解决方法 其他方面:OS引导,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 中等教育 > 小学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报