




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章同步、通信与死锁主要内容并发进程临界区管理信号量与PV操作管程进程通信死锁14.1并发进程4.1.1顺序程序设计4.1.2进程的并发性4.1.3进程的交互:协作和竞争24.1.1顺序程序设计进程的顺序性一个进程在顺序处理器上的执行是严格按序的,一个进程只有当一个操作结束后,才能开始后继操作。顺序程序设计是把一个程序设计成一个顺序执行的程序模块,顺序的含义不但指一个程序模块内部,也指两个程序模块之间。3顺序程序设计特点程序执行的顺序性程序环境的封闭性程序执行结果的确定性计算过程的可再现性顺序程序设计的缺点:计算机系统效率不高。44.1.2进程的并发性1、并发程序设计进程执行的并发性:一组进程的执行在时间上是重叠的。并发性举例:有两个进程A(a1、a2、a3)和B(b1、b2、b3)并发执行。
a1、a2、a3、b1、b2、b3顺序执行
a1、b1、a2、b2、a3、b3并发执行从宏观上看,并发性反映一个时间段中几个进程都在同一处理器上,处于运行还未运行结束状态。从微观上看,任一时刻仅有一个进程在处理器上运行。5并行工作图示进程i1p1ipoo1i2p2o2i3p3o3t1t2t3时间并行工作i4t4i5P4t56并发的实质并发的实质是一个处理器在几个进程之间的多路复用,并发是对有限的物理资源强制行使多用户共享,消除计算机部件之间的互等现象,以提高系统资源利用率。73、与时间有关的错误对于一组交往的并发进程,执行的相对速度无法相互控制,各种与时间有关的错误就可能出现。与时间有关错误的表现形式:结果不唯一永远等待83、与时间有关的错误(例子1)T1: …
read(x) ifx>=1000then x=x-1000write(x)…9T2: …
read(x) ifx>=2000then x=x-2000write(x)…某银行业务系统,某客户的账户有5000元,有两个ATM机T1,T23、与时间有关的错误(例子2)10get、copy、put三个进程并发执行S缓冲区t缓冲区f缓冲区g缓冲区getcopyput(1)get把数据读入s,但s中数据还未被copy取走,第二次get过来的进程将s中数据覆盖。(2)若put进程先执行,但t中数据未准备好,可能将不需要的数据取走。11Stfggetcopyput当前状态fstg正误(3,4,…,m)22(1,2)执行顺序假设g,c,p为getcopyput的一次循环g
c
p(4,5,…,m)33(1,2,3)√g
p
c(4,5,…,m)33(1,2,2)╳c
g
p(4,5,…,m)32(1,2,2)╳c
p
g(4,5,…,m)32(1,2,2)╳p
c
g(4,5,…,m)32(1,2,2)╳p
g
c(4,5,…,m)33(1,2,2)╳并发执行分析12进程前驱图g1c1p1g2c2p2g3cipi…并发环境下进程间的制约关系两者先后顺序任意Stfggetcopyput3、与时间有关的错误(例子3)//飞机票售票问题voidT1(){voidT2(){{按旅客订票要求找到Aj};{按旅客订票要求找到Aj};intX1=Aj;intX2=Aj;if(X1>=1){if(X2>=1){
X1--;
X2--; Aj=X1; Aj=X2; {输出一张票};{输出一张票};}}elseelse{输出信息"票已售完"};{输出信息"票已售完"};}}13T1、T2并发执行,可能出现如下交叉情况:T1:X1=Aj;//X1=mT2:X2=Aj;//X2=mT2:X2--;Aj=X2;{输出一张票};//Aj=m-1T1:X1--;Aj=X1;{输出一张票};//Aj=m-1同一张票卖给两位旅客143、与时间有关的错误(例子3)(永远等待)主存管理问题申请和归还主存资源问题intX=memory;//memory为初始主存容量void
borrow(intB){voidreturn(intB){while(B>X)X=X+B;{进程进入等待主存资源队列};{修改主存分配表};X=X-B;{释放等主存资源进程};{修改主存分配表,进程获得主存资源};}}153、与时间有关的错误(例子4)122若对borrow和return的并发执行不加限制将会导致错误,例如:Borrow:while(B>X);Return:X=X+B;{修改主存分配表};{释放等待主存资源的进程};此时,因为borrow还没有进入等待队列,因此,return的释放操作是空操作,当borrow进入等待队列时,可能没有进程再来归还,处于永远等待状态。163、与时间有关的错误(例子4)3.1.3进程的交互:竞争与协作(1)
第一种是竞争关系进程互斥:若干个进程因相互争夺独占型资源时所产生的竞争制约关系。资源竞争的两个控制问题:一个是死锁(Deadlock)问题,一个是饥饿(Starvation)问题
既要解决饥饿问题,又要解决死锁问题。17进程的交往:竞争与协作(2)
第二种是协作关系进程同步:为完成共同任务的并发进程基于某个条件来协调它们的活动,因为需要在某些位置上排定执行的先后次序而等待、传递信号或消息所产生的协作制约关系。进程互斥关系是一种特殊的进程同步关系,即逐次使用互斥共享资源,是对进程使用资源次序上的一种协调。184.2临界区管理4.2.1互斥与临界区4.2.2实现临界区管理的几种尝试4.2.3实现临界区管理的软件方法4.2.4实现临界区管理的硬件设施1920竞争条件(空闲区域7)打印目录…4abc5Prog.c6Hi.c7out=4in=7ProcessAProcessB进程A和B都申请把要打印的文件名放入7,然后打印21竞争条件(空闲区域7)打印目录…4abc5Prog.c6Hi.c7out=4in=7ProcessAProcessB进程A读取到in=7,将文件名放入7,即将修改in时,进程A被切换下CPU,进程B上CPU。22打印目录…4abc5Prog.c6Hi.c7out=4in=7ProcessAProcessB进程B读取到in=7,将文件名放入7,修改in=8结果:进程A中文件未能打印,因为被进程B覆盖了。竞争条件(空闲区域7)4.2.1互斥与临界区(1)并发进程中,与共享变量有关的程序段叫“临界区”,共享变量代表的资源叫“临界资源”。与同一变量有关的临界区分散在各进程的程序段中,而各进程的执行速度不可预知。如果保证进程在临界区执行时,不让另一个进程进入临界区,即各进程对共享变量的访问是互斥的,就不会造成与时间有关的错误。2324竞争互斥由于各个进程要求使用共享资源(变量、文件)而这些资源需要排他性使用,各进程之间竞争使用这些资源——这一关系称为进程互斥临界资源系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源或共享变量临界区(互斥区)各个进程对某个临界资源(共享变量)实施操作的程序片段互斥与临界区(2)临界区调度原则:一次至多一个进程能够进入临界区内执行;如果已有进程在临界区,其他试图进入的进程应等待;进入临界区内的进程应在有限时间内退出,以便让等待进程中的一个进入。临界区调度原则总结:互斥使用、有空让进;忙则等待、有限等待;择一而入,算法可行。2526临界区(互斥区)的使用原则B要进入临界区被阻塞B进入临界区t1t2t3t4A进入临界区A出临界区进程A进程B时间(1)若没有进程在临界区,想进入临界区的进程可进入(2)不允许两个进程同时处于其临界区(3)临界区外运行的进程不能阻塞其他进程进入临界区(4)不得使进程无限期等待进入临界区软件方案Dekker解法、Peterson解法硬件方案屏蔽中断、TSL(XCHG)指令27实现进程互斥的方法28软件方法1P:……while(free);free=true;临界区free=false;……Q:……while(free);free=true;临界区free=false;……1CPUStep1:P先上CPUfree:临界区空闲标志true:有进程在临界区;false:无进程在临界区初值:free为false29软件方法1P:……while(free);free=true;临界区free=false;……Q:……while(free);free=true;临界区free=false;……1CPUStep2:P下CPU,Q上CPU2CPUfree:临界区空闲标志true:有进程在临界区;false:无进程在临界区初值:free为false30软件方法1P:……while(free);free=true;临界区free=false;……Q:……while(free);free=true;临界区free=false;……1CPUStep3:Q下CPU,P上CPU;此时两个进程都在临界区!该方法有问题。2CPU3free:临界区空闲标志true:有进程在临界区;false:无进程在临界区初值:free为false31软件方法1P:……while(free);free=true;临界区free=false;……Q:……while(free);free=true;临界区free=false;……free:临界区空闲标志true:有进程在临界区;false:无进程在临界区初值:free为false改进方法:设置原语lock()unlock()32软件方法2P:……while(notturn);临界区turn=false;……Q:……while(turn);临界区turn=ture;……turn:谁进临界区的标志
true:P进程进临界区;false:Q进程进临界区初值任意若P想进临界区,由于turn=false;进不了;同时Q进程始终不准备进临界区,即使临界区一直没有进程,但P一直无法进入临界区该方法,违反了使用临界区的原则33软件方法3P:……pturn=ture;while(qturn);临界区pturn=false;……Q:……qturn=ture;while(pturn);临界区qturn=false;……pturn,qturn的初值为falseP进入临界区的条件:pturn
^notqturn(与)Q进入临界区的条件:notpturn^
qturn(与)Step1:p执行到pturn=ture,被撤下CPU1CPU34软件方法3P:……pturn=ture;while(qturn);临界区pturn=false;……Q:……qturn=ture;while(pturn);临界区qturn=false;……pturn,qturn的初值为falseP进入临界区的条件:pturn^notqturnQ进入临界区的条件:notpturn^qturnStep2:Q进程上CPU执行到qturn=ture1CPU2CPU35软件方法3P:……pturn=ture;while(qturn);临界区pturn=false;……Q:……qturn=ture;while(pturn);临界区qturn=false;……pturn,qturn的初值为falseP进入临界区的条件:pturn^notqturnQ进入临界区的条件:notpturn^qturnStep3:Q进程上一直测试pturn,无法通过,始终不能进入临界区1CPU2CPU3此处不断循环36软件方法3P:……pturn=ture;while(qturn);临界区pturn=false;……Q:……qturn=ture;while(pturn);临界区qturn=false;……pturn,qturn的初值为falseP进入临界区的条件:pturn^notqturnQ进入临界区的条件:notpturn^qturnStep3:时间片结束,Q进程被撤下CPU,P进程上CPU,一直测试qturn,无法通过,始终不能进入临界区P进程和Q进程都无法进入空闲着的临界区(该方法不满足临界区的使用原则)1CPU2CPU3437软件方法4dekker算法对解法3的改进1965年第一个用软件的方法解决了临界区保护问题P:……pturn=ture;while(qturn){ if(turn==2){ pturn=false; while(turn==2); pturn=turn; }}临界区turn=2;pturn=false;……Q:……qturn=ture;while(pturn){ if(turn==2){ qturn=false; while(turn==1); qturn=turn; }}临界区turn=1;qturn=false;……引入turn变量:turn=1P上cpu;turn=2Q上cpu38P:……pturn=ture;while(qturn){ if(turn==2){ pturn=false; while(turn==2); pturn=turn; }}临界区turn=2;pturn=false;……Q:……qturn=ture;while(pturn){ if(turn==1){ qturn=false; while(turn==1); qturn=turn; }}临界区turn=2;qturn=false;……1CPU2CPUStep1:P上CPUStep2:P被撤下CPU,Q上CPU39P:……pturn=ture;while(qturn){ if(turn==2){ pturn=false; while(turn==2); pturn=turn; }}临界区turn=2;pturn=false;……Q:……qturn=ture;while(pturn){ if(turn==1){ qturn=false; while(turn==1); qturn=turn; }}临界区turn=2;qturn=false;……1CPU2CPU此时pturn=ture,qturn=true;根据turn的值决定谁进CPU340P:……pturn=ture;while(qturn){ if(turn==2){ pturn=false; while(turn==2); pturn=turn; }}临界区turn=2;pturn=false;……Q:……qturn=ture;while(pturn){ if(turn==1){ qturn=false; while(turn==1); qturn=turn; }}临界区turn=2;qturn=false;……1CPU2CPUStep3:根据turn的值,判断谁进临界区,Q将自己的qturn设为false,让P进入临界区,并用while一直查询turn是否=1,即轮到Q进入临界区3441软件方法5peterson算法进程i:…enter_region(i);//进程想进临界区调用该函数,看是否能 //安全进入,i是进程号;临界区;lever_region(i)
;//进程离开临界区调用该函数,Peterson算法解决了互斥访问的问题,而且克服了(Dekker算法)强制轮流法的缺点,可以完全正常的工作42软件方法5peterson算法#defineFALSE0#defineTRUE1#defineN2//进程的个数intturn;//轮到谁?intinterested[N];//兴趣数组,初始值均为FALSEvoidenter_region(intprocess){//process=0或1intother;//另外一个进程的进程号other=1-process;interested[process]=TRUE;//表明本进程感兴趣turn=process;//设置标志位while(turn==process&&interested[other]==TRUE);}voidleave_region(intprocess){ interested[process]=FALSE;//本进程已离开临界区}表明哪个进程要进临界区43软件方法5peterson算法#defineFALSE0#defineTRUE1#defineN2//进程的个数intturn;//轮到谁?intinterested[N];//兴趣数组,初始值均为FALSEvoidenter_region(intprocess){//process=0或1intother;//另外一个进程的进程号other=1-process;interested[process]=TRUE;//表明本进程感兴趣turn=process;//设置标志位while(turn==process&&interested[other]==TRUE);}voidleave_region(intprocess){ interested[process]=FALSE;//本进程已离开临界区}用进程号调用,表明哪一个进程要进入临界区44软件方法5peterson算法#defineFALSE0#defineTRUE1#defineN2//进程的个数intturn;//轮到谁?intinterested[N];//兴趣数组,初始值均为FALSEvoidenter_region(intprocess){//process=0或1intother;//另外一个进程的进程号other=1-process;interested[process]=TRUE;//表明本进程感兴趣turn=process;//设置标志位while(turn==process&&interested[other]==TRUE);}voidleave_region(intprocess){ interested[process]=FALSE;//本进程已离开临界区}想进临界区的进程,将进程号赋给turn45软件方法5peterson算法#defineFALSE0#defineTRUE1#defineN2//进程的个数intturn;//轮到谁?intinterested[N];//兴趣数组,初始值均为FALSEvoidenter_region(intprocess){//process=0或1intother;//另外一个进程的进程号other=1-process;interested[process]=TRUE;//表明本进程感兴趣turn=process;//设置标志位while(turn==process&&interested[other]==TRUE);}voidleave_region(intprocess){ interested[process]=FALSE;//本进程已离开临界区}若进程0先调用enter_regionturn的值为0之后,进程1调用enter_regionturn的值为1问题:如何保证先执行进程0?46软件方法5peterson算法#defineFALSE0#defineTRUE1#defineN2//进程的个数intturn;//轮到谁?intinterested[N];//兴趣数组,初始值均为FALSEvoidenter_region(intprocess){//process=0或1intother;//另外一个进程的进程号other=1-process;interested[process]=TRUE;//表明本进程感兴趣turn=process;//设置标志位while(turn==process&&interested[other]==TRUE);}voidleave_region(intprocess){ interested[process]=FALSE;//本进程已离开临界区}进程0先调用enter_region(),进程1后调用进程0调用enter_region(), process=0;turn=0;turn被改为1之后,进程1调用enter_region(),
process=1;turn=1,0被覆盖;那么,对于进程0,turn!=process条件不成立,进入临界区。对于进程1,turn==process,进程1的turn=1,条件成立,进程1陷入循环Peterson算法cobeginprocessP0(){inside[0]=true;turn=1;while(inside[1]&&turn==1); {临界区}; inside[0]=false;}
coend
47processP1(){inside[1]=true;turn=0;while(inside[0]&&turn==0); {临界区};inside[1]=false;}4.2.4实现临界区管理的硬件设施关中断测试并建立指令对换指令48“开关中断”指令(特权指令)可实现原语操作
操作步骤如下:Step1:执行“关中断”指令Step2:临界区操作Step3:执行“开中断”指令49简单,有效较高的代价,限制CPU并发能力(临界区大小)不适用于多处理器关中断实现互斥的最简单方法关中断适用场合简单有效,对操作系统自身有用,可在更新共享变量或列表的几条指令期间禁止中断。关中断方法的缺点不适合作为通用的互斥机制,关中断时间过长会影响性能和系统效率;不适应于多处理器计算机系统,因为一个处理器关中断,并不能防止进程在其它处理器上执行相同的临界段代码;若将这项权力赋予用户会存在危险,若用户未开中断,则系统可能因此而终止。50测试并建立指令TS指令的处理过程boolTS(bool&x){if(x){
x=false; returntrue; }else returnfalse;}
TS指令管理临界区时,可把一个临区与一个布尔变量s相连,由于变量s代表了临界资源的状态,可把它看成一把锁。51测试并建立指令TS指令实现进程互斥bools=true;cobeginprocessPi(){//i=1,2,...,n
while(!TS(s));//上锁
{临界区};
s=true;//开锁}coend52boolTS(bool&x){if(x){x=false;returntrue;}elsereturnfalse;}反复测试直到值为真对换指令(1)voidSWAP(bool&a,bool&b){
booltemp=a; a=b; b=temp; }53对换指令(2)对换指令实现进程互斥布尔型锁变量boollock=false;cobeginProcessPi(){//i=1,2,...,n boolkeyi=true; do{SWAP(keyi,lock);}while(keyi);//上锁
{临界区};
SWAP(keyi,lock);//开锁}coend54软件方法:开销,编程技巧硬件方法忙等待(busywaiting)进程在得到临界区访问权之前,持续测试而不做其他事情(单处理器避免使用)自旋锁Spinlock(多处理器)55小结4.3信号量与PV操作4.3.1同步与同步机制4.3.2信号量与PV操作4.3.3信号量实现互斥4.3.4信号量解决五个哲学家吃通心面问题4.3.5信号量解决生产者-消费者问题4.3.6记录型信号量解决读者-写者问题4.3.7记录型信号量解决理发师问题56进程同步:指系统中多个进程中发生的事件存在某种时序关系,需要相互合作,共同完成一项任务57进程的同步一个进程运行到某一个点时,要求另一伙伴进程为它提供消息在未获得消息之前,该进程进入阻塞态;获得消息后被唤醒进入就绪态4.3.1同步和同步机制著名的生产者--消费者问题是计算机操作系统中并发进程内在关系的一种抽象,是典型的进程同步问题。在操作系统中:生产者进程可以是计算进程、发送进程;而消费者进程可以是打印进程、接收进程等等。解决好生产者--消费者问题就解决好了一类并发进程的同步问题。58生产者--消费者问题表述59缓冲区生产者进程消费者进程问题描述:一个或多个生产者生产某种类型的数据放在缓冲区有消费者从缓冲区中取数据,每次取一项只能有一个生产者或消费者对缓冲区进行操作需要解决的问题缓冲区满,生产者添加数据到缓冲区缓冲区空,消费者不会从缓冲区取数据生产者-消费者问题算法描述(1)processproducer(void){while(true){//无限循环
{produceaniteminnextp};//生产一个产品
if(counter==k)//缓冲满时,生产者睡眠
sleep(producer); buffer[in]=nextp;//将一个产品放入缓冲区
in=(in+1)%k;//指针推进
counter++;//缓冲内产品数加1 if(counter==1)//缓冲为空,加进一件产品
wakeup(consumer);//并唤醒消费者
}}60检查共享变量的值会产生错误吗?生产者-消费者问题算法描述(2)processconsumer(void){ while(true){//无限循环
if(counter==0)//缓冲区空,消费者睡眠
sleep(consumer); nextc=buffer[out];//取一个产品到nextc out=(out+1)%k;//指针推进
counter--;//取走一个产品,计数减1 if(counter==k-1)//缓冲满了,取走一件产品并唤
wakeup(producer);//醒生产者
{consumetheiteminnextc};//消耗产品
}}61检查共享变量的值会产生错误吗?62processproducer(void){while(true){{produceaniteminnextp
if(counter==k)
sleep(producer); buffer[in]=nextp
in=(in+1)%k;
counter++; if(counter==1)
wakeup(consumer);
}}processconsumer(void){while(true){ if(counter==0) sleep(consumer); nextc=buffer[out]; out=(out+1)%k; counter--; if(counter==k-1) wakeup(producer); {consumetheiteminnextc}; }}1使用共享变量count可能会产生的错误Step1:count==0,进程counsumer上cpu2363processproducer(void){while(true){{produceaniteminnextp
if(counter==k)
sleep(producer); buffer[in]=nextp
in=(in+1)%k;
counter++; if(counter==1)
wakeup(consumer);
}}processconsumer(void){while(true){ if(counter==0) sleep(consumer); nextc=buffer[out]; out=(out+1)%k; counter--; if(counter==k-1) wakeup(producer); {consumetheiteminnextc}; }}1使用共享变量count可能会产生的错误Step2:进程consumer被撤下CPU,producer上CPUStep3:producer执行wakeup(consumer),由于进程consumer执行sleep之前被撤下,所以wakeup(consumer)相当于是空操作。2364processproducer(void){while(true){{produceaniteminnextp
if(counter==k)
sleep(producer); buffer[in]=nextp
in=(in+1)%k;
counter++; if(counter==1)
wakeup(consumer);
}}processconsumer(void){while(true){ if(counter==0) sleep(consumer); nextc=buffer[out]; out=(out+1)%k; counter--; if(counter==k-1) wakeup(producer); {consumetheiteminnextc}; }}1使用共享变量count可能会产生的错误Step4:producer被撤下,进程consumer继续执行,执行sleep(consumer);由于step3操作已经执行wakeup(consumer),所以consumer就不会被唤醒。234生产者-消费者问题解决方法的不足生产者和消费者进程对counter的交替执行会使其结果不唯一生产者和消费者进程的交替执行会导致进程永远等待654.3.2信号量与PV操作661965年E.W.Dijkstra提出了新的同步工具--信号量和P、V操作。信号量:用于进程间传递信息的一个整数值Structsemaphore{ intcount; queueTypequeue;//允许进程挂接到该队列上}
信号量声明:semaphores;
对信号量可以实施的操作,初始化、P和V操作信号量与PV操作(3)实现时,信号量是一种记录型数据结构,有两个分量:一个是信号量的值,另一个是信号量队列的队列指针。信号量的值信号量队列指针6768PV操作定义P(s){s.count--;if(s.count<0){
该进程状态为阻塞状态将该进程插入相等的等待队列s.queue末尾;(表示让出CPU)重新调度;}}V(s){s.count++;if(s.count<=0){
唤醒相应等待队列 s.queue等待的一个进程,改变其状态为就绪态,并将其插入就绪队列}}down,semwaitup,semsignal信号量与PV操作信号量:一种软件资源原语操作:内核中执行时不可被中断的过程P操作原语和V操作原语最初提出的是二元信号量(解决互斥)之后,推广到一般信号量(多值)或计数信号量(解决同步)6970用PV操作解决进程间的互斥问题分析并发进程的关键活动,划定临界区设置信号量mutex,初值为1在临界区钱实施P(mutex)在临界区之后实施V(mutex)临界区P(mutex)V(mutex)P(mutex)P(mutex)V(mutex)V(mutex)P1P2P371临界区P(mutex)V(mutex)P(mutex)P(mutex)V(mutex)V(mutex)P1P2P3设置信号量mutex,初值为1案例解析Step1:P1上CPU,执行P操作,mutex=mutex-1=0,此时mutex不小于0,所以P1进程进入临界区。Step2:P1被中断,P1被撤下CPU,P2上CPU,执行P操作,mutex=mutex-1=0-1=-1,此时mutex小于0,P2无法进入临界区,P2进程进入等待队列。72临界区P(mutex)V(mutex)P(mutex)P(mutex)V(mutex)V(mutex)P1P2P3设置信号量mutex,初值为1案例解析Step3:P2被中断,P2被撤下CPU,P3上CPU,执行P操作,mutex=mutex-1=-1-1=-2,此时mutex小于0,P3无法进入临界区,P3进程进入等待队列。73临界区P(mutex)V(mutex)P(mutex)P(mutex)V(mutex)V(mutex)P1P2P3设置信号量mutex,初值为1案例解析Step4:P3被中断,P3被撤下CPU,P1上CPU,执行V操作,mutex=mutex+1=-2+1=-1,此时mutex小于0,去等待队列中唤醒P2,P2进入就绪队列,P1进程继续执行自己的工作。74临界区P(mutex)V(mutex)P(mutex)P(mutex)V(mutex)V(mutex)P1P2P3设置信号量mutex,初值为1案例解析Step4:P1被中断,P1被撤下CPU,P2上CPU,直接进入临界区,执行V操作,mutex=mutex+1=-1+1=0,此时mutex等于0,去等待队列中唤醒P3,P3进入就绪队列,P2进程继续执行自己的工作。75临界区P(mutex)V(mutex)P(mutex)P(mutex)V(mutex)V(mutex)P1P2P3设置信号量mutex,初值为1案例解析Step4:P2被中断,P2被撤下CPU,P3上CPU,直接进入临界区,执行V操作,mutex=mutex+1=0+1=1,此时mutex大于0,表示无等待的进程,P3进程继续执行自己的工作。76用信号量解决生产者/消费者问题voidproducer(void){intitem;while(true){item=produce_item();
p(&empty);
insert_item(item);v(&full);}}voidconsumer(void){intitem;while(true){item=remove_item();
p(&full);
consume_item(item);
v(&empty);}}#defineN
100//缓冲区的个数typedefintsemaphore;//信号量是一种特殊的整型数据Semaphoremutex=1;//互斥信号量,控制对临界区的访问Semaphoreempty=N;//空缓冲区的个数Semaphorefull=0;//满缓冲区的个数77用信号量解决生产者/消费者问题voidproducer(void){intitem;while(true){item=produce_item();p(&empty);p(&mutex);insert_item(item);v(&mutex);v(&full);}}voidconsumer(void){intitem;while(true){item=remove_item();p(&full);p(&mutex);consume_item(item);
v(&mutex);v(&empty);}}78是否可以改变顺序voidproducer(void){intitem;while(true){item=produce_item();p(&empty);p(&mutex);inse
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 投影设备在电影后期制作的应用考核试卷
- 宝石的市场营销策略与品牌建设创新成果评价分析考核试卷
- 疏散指示标志的设置与检查标准考核试卷
- 灯具销售目标市场分析与定位考核试卷
- 泵的密封系统与泄漏控制考核试卷
- 中药材种植的农业水土保持措施考核试卷
- 玻璃制造中的市场竞争与品牌建设考核试卷
- 情绪管理教具设计考核试卷
- 全球及中国蒽醌(蒽醌中间体)市场发展趋势及前景潜力预测报告2025-2030年
- 专业英语 Unit 2教案学习资料
- 消防安全知识培训课件文库
- 四川省南充市顺庆区南充高级中学2024-2025学年高一下学期4月月考语文试题
- 2025年合肥兴泰金融控股(集团)有限公司招聘23人笔试参考题库附带答案详解
- 二级水电工试卷及答案
- 宠物清洁卫生用品猫砂
- 边坡支护施工方案
- 2025年山东省淄博市张店区中考一模道德与法治试题(五四学制)(含答案)
- 湖北省部分高中联考协作体2023-2024学年高二下学期期中考试政治试卷(原卷版)
- 古代小说戏曲专题-形考任务2-国开-参考资料
- 《电气照明设备安装》ppt课件
- 天然烟用香料的芳香组分和提取工艺分析
评论
0/150
提交评论