操作系统汤子英课件第3章进程同步.ppt
《操作系统汤子英课件第3章进程同步.ppt》由会员分享,可在线阅读,更多相关《操作系统汤子英课件第3章进程同步.ppt(142页珍藏版)》请在三一办公上搜索。
1、第三章 进程同步与通信,3.1 进程同步 3.2 经典进程的同步问题 3.3 管程机制 3.4 进程通信,回顾操作系统的特性:并发资源共享异步性(不确定性 或 随机性)虚拟性,3.1 进 程 同 步(重点),3.1.1 进程同步的基本概念,1.一组并发进程执行时存在两种相互制约关系:,进程互斥资源共享关系(间接相互制约关系)进程本身之间不存在直接联系。进程同步相互合作关系(直接相互制约关系)进程本身之间存在着相互制约的关系。,在多道程序系统中,进程之间存在2种不同的制约关系:(互斥/间接制约关系)、(同步/直接制约关系),进程互斥资源共享关系(间接相互制约关系)进程本身之间不存在直接联系。处于
2、同一系统中的进程,必然是共享着某种系统资源,如共享CPU、I/O设备。例如,在仅有一台打印机的系统中,有两个进程A和B,如果在A进程提出打印请求时,系统已将打印机分配给进程B,则系统让A进程等待,直至B将打印机用完并释放后,系统才将打印机分配给进程A。,进程同步相互合作关系(直接相互制约关系)进程本身之间存在着相互制约的关系。例如,有一输入进程A通过单缓冲向进程B提供数据。当该缓冲空时,计算进程B因不能获得所需数据而等待。当进程A把数据送入缓冲时,便应向进程B发送一信号,将它唤醒;(接力棒),2.临界资源(Critical Resouce),临界资源:在一段时间内只允许一个进程访问 的资源。诸
3、进程间应采取互斥方式,实现对资源的共享。共享变量,打印机 等均属于此类资源。,进程间的关系进程间并发举例,例1:一飞机订票系统,两个终端,运行T1、T2进程 T1:T2:.Read(x);Read(x);y1:=x;y2:=x;if y1=1 then if y2=1 then y1:=y1-1;y2:=y2-1;x:=y1;x:=y2;write(x);write(x);.,设x的当前值为:100,1.若执行顺序为:先T1;后T2;则结果:x=982.若执行顺序为:T1:Read(x);T2:Read(x);T1:if y1=1 then y1:=y1-1;T2:if y2=1 then y
4、2:=y2-1;T1:write(x);T2:write(x);则结果 x=99,分析:产生错误的原因是不加控制地访问共享变量x,例2,司机 P1 售票员 P2 REPEAT REPEAT 启动 关门 正常运行 售票 到站停 开门 UNTIL FALSE UNTIL FALSE,进程间的关系进程间并发举例,进程间的关系并发执行举例例3:与进程的执行顺序有关的错误,复制一个记录 Cobegin get;copy;put;Coend,get,copy,put,f,s,t,g,源记录,目标记录,进程间的关系并发执行举例例3:与进程的执行顺序有关的错误,f s t g 0 初始状态 3,4,.,m 2
5、 2(1,2)1 g,c,p 4,5,.,m 3 3(1,2,3)2 g,p,c 4,5,.,m 3 3(1,2,2)X3 c,g,p 4,5,.,m 3 2(1,2,2)X4 c,p,g 4,5,.,m 3 2(1,2,2)X5 p,c,g 4,5,.,m 3 2(1,2,2)X6 p,g,c 4,5,.,m 3 3(1,2,2)X,序 初始状态 源记录的 目标记录 结果正确性 号 及执行顺序 剩余部分 的当前值,注:从1到6的各个执行,是在0(初始状态)的基础上进行的,错误的原因是get,copy,put 过程没有按照应该的顺序执行,进程间的关系并发执行举例例3:与进程的执行顺序有关的错误
6、正确执行顺序,例4 生产者消费者问题(Producer-Consumer)有一个生产者进程和一个消费者进程。他们共享一个缓冲区。生产者进程每生产一件物品就要存入缓冲区,但缓冲区每次只能存放一件物品,只有消费者取走物品,才能放入第二件物品。缓冲区中有物品消费者进程就可以去取,每取走一件物品后必须等生产者再放入物品后才可以去取。生产者进程与消费者进程是以异步方式进行的,但它们之间必须保持同步;即不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个装满产品的缓冲区中投放产品。,生产者进程Buffer:intergerProcesser producerBegin L1:produce a
7、 product;Buffer:=product;go to L1end,消费者进程Buffer:intergerProcesser consumerBegin L2:take a product;consumer;go to L2end,生产者消费者问题(Producer-Consumer)有一群生产者进程在生产产品,并将产品提供给消费者进程去消费,为使生产者进程和消费者进程能并发执行,在他们之间设置了一个具有n个缓冲区的缓冲池,生产者进程将他所生产的产品放入一个缓冲区中;消费者进程可从一个缓冲区中取走产品去消费。生产者进程与消费者进程是以异步方式进行的,但它们之间必须保持同步;即不允许消费
8、者进程到一个空缓冲区去取产品,也不允许生产者进程向一个装满产品的缓冲区中投放产品。,in,out,1、用一个数组来表示上述的具有n个缓冲区的缓冲 池,用0,1,n-1表示。2、用输入指针in来指示下一个可投放产品的缓冲,每当生产者投放一个产品,输入指针加1;3、用输出指针out来指示下一个可从中获取产品的缓冲区,每当消费者进程取走一个产品后,输出指针加1。这里的缓冲池是组织成循环缓冲的,故应 把输入指针加1表示成in:=(in+1)modn;把输出指针加1表示成out:=(out+1)modn.当(in+1)=out时表示缓冲池满;in=out时表示缓冲池空。,?,还引入一个整型变量count
9、er,初值为0,生产者进程向缓冲池投放一个产品后,counter加1;消费者进程从中取走一个产品时,使counter减1;生产者和消费者共享下面的变量:var n:integer;type item=;var buffer:array0,1,n-1 of item;in,out:0,1,n-1;counter:0,1,n-1;,producer:repeat produce an item in nextp;while counter=n do no_op;bufferin=nextp;in:=(in+1)modn;counter=counter+1;until false;,consumer
10、:repeat while counter=0 do no_op;nextc:=bufferout;out:=(out+1)modn;counter=counter-1;consume the item in nextc;until false;,表示目前缓冲区产品已放满,刚生产出来的产品,虽然上面的生产者程序和消费者程序,在分别看时都是正确的,而且两者在顺序执行时其结果也会是正确的,但若并发执行时,就会出现差错,问题就在于这两个进程共享变量counter。生产者对它做加1操作,消费者对它做减1操作,这两个操作在用机器语言实现时,常可用下面的形式描述:register1=counter;reg
11、ister2=counter;register1=register1+1;register2=register2-1;counter=register1;counter=register2;假设:counter的当前值是5。无论是先执行生产者的语句还是先执行消费者的语句,counter都为5,但是,如果按下述顺序执行:register1=counter;(register1=5)register1=register1+1;(register1=6)register2=counter;(register2=5)register2=register2-1;(register2=4)counter=
12、register1;(counter=6)counter=register2;(counter=4)最后counter 的值为4,并且结果不可预见.解决问题的关键是,把counter作为临界资源来处理,即令生产者和消费者进程互斥访问变量counter.,执行过程相当于生产一点拿一点,而不是消费完整的产品,3.1、临界区的定义与进入临界区:把在每个进程中访问临界资源的那段代码称为临界区(critical section)。进入区:在临界区前面增加一段用于进行临界资源检查的代码,称为进入区。,3.临界区(critical section),退出区:将临界区正被访问的标志恢复为未被访问的标志。剩余区
13、:其余部分。,repeat,Entry section,Critical section;,Remainder section,Until false;,exit section,进入区,P、V操作,临界区,退出区,P、V操作,剩余区,P:wait(S),P(S)可理解为关锁V:signal(S),V(S)可理解为开锁,图 3.12 资源互斥使用例,4、互斥算法使用临界区遵循的原则空闲则入:其他进程均不处于临界区;忙则等待:已有进程处于其临界区;有限等待:等待进入临界区的进程不能死等;让权等待:不能进入临界区的进程,应释放CPU(如转换到阻塞状态)临界区的使用原则是什么?上面4条。,5 进程互
14、斥的软件方法,有两个进程Pi,Pj,其中:,算法1:单标志,设立一个公用整型变量 turn:描述允许进入临界区的进程标识在进入区循环检查是否允许本进程进入:turn为i时,进程Pi可进入;在退出区修改允许进入进程标识:进程Pi退出时,改turn为进程Pj的标识j;,在Pi出让临界区之后,Pj使用临界区之前,Pi不可能再次使用临界区,缺点:强制轮流进入临界区,没有考虑进程的实际需要。容易造成资源利用不充分:在Pi出让临界区之后,Pj使用临界区之前,Pi不可能再次使用临界区;,算法2:双标志、先检查,设立一个标志数组flag:描述进程是否在临界区,初值均为FALSE。先检查,后修改:在进入区检查另
15、一个进程是否在临界区,不在时修改本进程在临界区的标志;在退出区修改本进程在临界区的标志;,其中Pi,请写出Pj,While(flagj);Flagi=TRUE;,Flagi=FALSE;,Critical section,Remainder section,While(flagi);Flagj=TRUE;,Flagj=FALSE;,Critical section,Remainder section,flagi=flagj=FALSE,优点:不用交替进入,可连续使用;缺点:Pi和Pj可能同时进入临界区。按下面序列执行时,会同时进入:Pi Pj Pi Pj。即在检查对方flag之后和切换自己fl
16、ag之前有一段时间,结果都检查通过。这里的问题出在检查和修改操作不能连续进行。,算法3:双标志、后检查,类似于算法2,与互斥算法2的区别在于先修改后检查。可防止两个进程同时进入临界区。flag初值均为FALSE,其中的Pi:,flagi=TRUE;while(flagj);,flagi=FALSE;,critical section,remainder section,flagi=flagj=FALSE,其中的Pj:,缺点:Pi和Pj可能都进入不了临界区。按下面序列执行时,会都进不了临界区:Pi Pj Pi Pj。即在切换自己flag之后和检查对方flag之前有一段时间,结果都切换flag,都
17、检查不通过。,信号量(semaphore),前面的互斥算法都存在问题,它们是平等进程间的一种协商机制,需要一个地位高于进程的管理者来解决公有资源的使用问题。OS可从进程管理者的角度来处理互斥的问题,信号量就是OS提供的管理公有资源的有效手段。信号量代表可用资源实体的数量。,3.1.2 信号量机制,1.整型信号量 最初由Dijkstra把整型信号量定义为一个整型量,除初始化外,仅能通过两个标准的原子操作(Atomic Operation)wait(S)和signal(S)来访问。这两个操作一直被分别称为P、V操作。wait和signal操作可描述为:wait(S):while S0 do no-
18、op S=S-1;signal(S):S=S+1;,信号量,P操作,又称关锁,V操作,又称开锁,占用资源,所以减一,释放资源,所以加一,S代表资源个数,不放弃处理机,2.记录型信号量 在整型信号量机制中的wait操作,只要是信号量S0,就会不断地测试。记录型信号量机制,则是一种不存在“忙等”现象的进程同步机制。记录型信号量是由于它采用了记录型的数据结构而得名的。它所包含的上述两个数据项可描述为:,S代表资源个数,s:=s+1,Wait(s):,Signal(s):,Block,自我阻塞,放弃处理机,S 0,Wake Up,Y,N,信号量和P、V原语的另一种解释,每个信号量s除一个整数值s.co
19、unt(计数)外,还有一个进程阻塞队列s.queue,其中是阻塞在该信号量的各个进程的标识信号量只能通过初始化和两个标准的原语来访问作为OS核心代码执行,不受进程调度的打断。初始化指定一个非负整数值,表示空闲资源总数(又称为“资源信号量”)*若为非负值表示当前的空闲资源数,若为负值其绝对值表示当前等待临界区的进程数二进制信号量(binary semaphore):只允许信号量取0或1值,1.P原语wait(s),-s.count;/表示申请一个资源;if(s.count 0)/表示没有空闲资源;调用进程进入阻塞队列s.queue;阻塞调用进程;,记录型信号量,2.V原语signal(s),+s
20、.count;/表示释放一个资源;if(s.count=0)/表示有进程处于阻塞状态;从等待队列s.queue中取出一个进程P;进程P进入就绪队列;,V原语通常唤醒进程等待队列中的头一个进程,记录型信号量,P、V操作是定义在信号量S上的两个操作,其定义如下:P(S):S=S-1;若S0,则调用P(S)的进程继续运行;若S0,则调用V(S)的进程继续运行;若S0,从等待信号量S的阻塞队列中唤醒头一个进程,然后调用V(S)的进程继续运行。,S代表资源个数,type semaphore=record value:integer;L:list of process;end相应地,wait(S)和sig
21、nal(S)操作可描述为:procedure wait(S)var S:semaphore;begin S.value=S.value-1;if S.value0 then block(S,L)end procedure signal(S)var S:semaphore;begin S.value=S.value+1;if S.value0 then wakeup(S,L);end,系统中某类资源的数目,每次wait操作,意味着进程请求一个单位的该类资源1,资源已分配完毕,因此进程应调用block原语,进行自我阻塞,信号量链表中,仍有等待该资源的进程被阻塞,应将进程唤醒,S代表资源个数,如果S
22、.value的初值为1,表示只允许一个进程访问临界资源,此时的信号量转化为互斥信号量。,3.AND型信号量,在两个进程中都要包含两个对Dmutex和Emutex的操作,即process A:process B:wait(Dmutex);wait(Emutex);wait(Emutex);wait(Dmutex);若进程A和B按下述次序交替执行wait操作:process A:wait(Dmutex);于是Dmutex=0process B:wait(Emutex);于是Emutex=0process A:wait(Emutex);于是Emutex=-1 A阻塞process B:wait(Dm
23、utex);于是Dmutex=-1 B阻塞,2个共享数据,初值为1,P操作,1,S0阻塞,谁也不释放,死锁状态,AND同步机制的基本思想是:将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其它所有可能为之分配的资源,也不分配给他。对若干个临界资源的分配,采取原子操作方式:要么全部分配到进程,要么一个也不分配。由死锁理论可知,这样就可避免上述死锁情况的发生。为此,在wait操作中,增加了一个“AND”条件,故称为AND同步,或称为同时wait操作,即Swait(Simultaneous wait)定义如下:,Swait(S1
24、,S2,Sn)if Si1 and and Sn1 then for i=1 to n do Si=Si-1;endfor else place the process in the waiting queue associated with the first Si found with Si1,and set the program count of this process to the beginning of Swait operation endifSsignal(S1,S2,Sn)for i=1 to n do Si=Si+1;Remove all the process wai
25、ting in the queue associated with Si into the ready queue.endfor;,N类资源,每类资源只申请1个,在记录型信号量机制中,wait(s)或signal(s)操作仅能对信号量施以增1或减1的操作,即每次只能获得或释放一个单位的临界资源。当一次需N个某类临界资源时,便需要进行N次wait(s)操作,显然这是低效的。此外,在有些情况下,当资源数量低于某一下限值时,便不予分配。因而,在每次分配之前,都必须测试该资源的数量是否大于测试值t。基于上述两点可以对AND信号量机制进行扩充,形成一般化的“信号量集”机制。,4.信号量集,S代表资源个数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 汤子英 课件 进程 同步
链接地址:https://www.31ppt.com/p-6575571.html