您好,欢迎访问三七文档
chap51一个共享资源的同步访问一个共享资源的同步访问//process0//process0while(true){while(true){......P(sP(s););acquireRacquireRuseittodouseittodosthsthreleaseRreleaseRV(sV(s););}}11semaphoressemaphores共享资源共享资源RR//process1//process1while(true){while(true){......P(sP(s););acquireRacquireRuseittodouseittodosthsthreleaseRreleaseRV(sV(s););}}//process2//process2while(true){while(true){......P(sP(s););acquireRacquireRuseittodouseittodosthsthreleaseRreleaseRV(sV(s););}}三个进程访问共享资源一个三个进程访问共享资源一个RR。可用。可用P(sP(s))和和V(sV(s))同步访同步访问此资源。问此资源。操作系统原理ZHEJIANGUNIVERSITYCITYCOLLEGEPDF文件使用pdfFactoryPro试用版本创建一类共享资源的同步访问一类共享资源的同步访问//process0//process0while(true){while(true){......P(sP(s););acquireRacquireRuseittodouseittodosthsthreleaseRreleaseRV(sV(s););}}22semaphoressemaphores共享资源共享资源RR//process1//process1while(true){while(true){......P(sP(s););acquireRacquireRuseittodouseittodosthsthreleaseRreleaseRV(sV(s););}}//process2//process2while(true){while(true){......P(sP(s););acquireRacquireRuseittodouseittodosthsthreleaseRreleaseRV(sV(s););}}假设资源假设资源RR有两个有两个..任何时候至多有两个进程可以使用此资源任何时候至多有两个进程可以使用此资源。将。将ss初始化为初始化为22可以达到此目标。可以达到此目标。çççççç操作系统原理ZHEJIANGUNIVERSITYCITYCOLLEGEPDF文件使用pdfFactoryPro试用版本创建……downloadamusicfiledownloadamusicfileV(music_readyV(music_ready););……00semaphoresemaphoremusic_readymusic_ready//processBforplayingmusic//processBforplayingmusic……P(music_readyP(music_ready););playthemusicfileplaythemusicfile……用信号量代表条件或事件。用信号量代表条件或事件。OneprocessmayOneprocessmayP()P()forfortheoccurrenceofanevent,theoccurrenceofanevent,whereasanotherprocesswhereasanotherprocessV(V())theevent.theevent.çççç操作系统原理ZHEJIANGUNIVERSITYCITYCOLLEGEPDF文件使用pdfFactoryPro试用版本创建(therearemoreimagestodownload){while(therearemoreimagestodownload){downloadthenextimage;downloadthenextimage;V(image2display);V(image2display);}}00semaphoreimage2displaysemaphoreimage2display//processBfordisplayingimage//processBfordisplayingimagewhile(therearemoreimagestodisplay){while(therearemoreimagestodisplay){P(image2display);P(image2display);displaythenextimage;displaythenextimage;}}••afastdownloadprocessafastdownloadprocess••afastdisplayprocess.afastdisplayprocess.Image2display表示已下载,但未显示的图片数目。image2display=0,时进程B需要等待。.Image2displayImage2display表示已下载,但未显表示已下载,但未显示的图片数目。示的图片数目。image2display=0,image2display=0,时进程时进程BB需要等待。需要等待。..操作系统原理ZHEJIANGUNIVERSITYCITYCOLLEGEPDF文件使用pdfFactoryPro试用版本创建生产者生产者//消费者问题消费者问题nn两个进程通过共享缓冲区间接通讯。两个进程通过共享缓冲区间接通讯。nnproducerproducer进程反复生产产品,并将产品放入共享缓进程反复生产产品,并将产品放入共享缓冲区中冲区中nnconsumerconsumer进程反复从缓冲区区产品消费进程反复从缓冲区区产品消费nn保护共享缓冲区,防止缓冲区溢出或下溢保护共享缓冲区,防止缓冲区溢出或下溢ConsumerConsumerProducerProducer操作系统原理ZHEJIANGUNIVERSITYCITYCOLLEGEPDF文件使用pdfFactoryPro试用版本创建生产者生产者//消费者问题消费者问题ConsumerConsumerProducerProducertaketakeappendappend/*producer*//*producer*/while(true){while(true){produce(x);produce(x);append(x,Q);append(x,Q);}}/*consumer*//*consumer*/while(true){while(true){take(x,Q);take(x,Q);consume(x);consume(x);}}l生产产品,并将它暂存在局部变量中;l将产品从局部变量中移到共享缓冲区。ll生产产品,并将它暂存在局部变生产产品,并将它暂存在局部变量中;量中;ll将产品从局部变量中移到共享缓将产品从局部变量中移到共享缓冲区。冲区。l将产品从共享缓冲区中取出,存到局部变量中;l消费产品。ll将产品从共享缓冲区中取出,存将产品从共享缓冲区中取出,存到局部变量中;到局部变量中;ll消费产品。消费产品。操作系统原理ZHEJIANGUNIVERSITYCITYCOLLEGEPDF文件使用pdfFactoryPro试用版本创建()andtake()均访问共享缓冲区Q.引入信号量保护临界区。append()andtake()append()andtake()均均访问共享缓冲区访问共享缓冲区Q.Q.引入信引入信号量保护临界区。号量保护临界区。/*producer*//*producer*/Itemx;Itemx;while(true){while(true){produce(x);produce(x);P(sP(s););append(xappend(x,Q);,Q);V(sV(s););}}/*consumer*//*consumer*/Itemx;Itemx;while(true){while(true){P(sP(s););take(x,Q);take(x,Q);V(sV(s););consume(x);consume(x);}}BufferQBufferQ11semaphoressemaphores“produce()”和“consume()”无需放入临界区。它们操作在私有的局部变量x上,所以可以同时执行。““produce()produce()””和和““consume()consume()””无需放入无需放入临界区。它们操作在私有临界区。它们操作在私有的局部变量的局部变量xx上,所以可以上,所以可以同时执行。同时执行。操作系统原理ZHEJIANGUNIVERSITYCITYCOLLEGEPDF文件使用pdfFactoryPro试用版本创建缓冲区下溢或上溢缓冲区下溢或上溢/*producer*//*producer*/while(true){while(true){produce(x);produce(x);P(sP(s););append(x,Q);append(x,Q);V(sV(s););}}/*consumer*//*consumer*/while(true){while(true){P(sP(s););take(x,Q);take(x,Q);V(sV(s););consume(x);consume(x);}}如果缓冲区全空,消费者进程如果缓冲区全空,消费者进程不能从缓冲区区产品消费。为不能从缓冲区区产品消费。为防止缓冲区下溢,消费者进程防止缓冲区下溢,消费者进程必须在临界区外等待。必须在临界区外等待。如果缓冲区满,生产者进程不能如果缓冲区满,生产者进程不能再往缓冲区添加产品。为防止缓再往缓冲区添加产品。为防止缓冲区上溢,生产者进程必须在临冲区上溢,生产者进程必须在临界区外等待。界区外等待。操作系统原理ZHEJIANGUNIVERSITYCITYCOLLEGEPDF文件使用pdfFactoryPro试用版本创建的含义:n0:缓冲区中的产品数目n=0:缓冲区内没产品,且没消费者等待n0:缓冲区内没产品,|n|个消费者等待信号量信号量nn的含义的含义::n0:n0:缓冲区中的产品数目缓冲区中的产品数目n=0:n=0:缓冲区内没产品,且没消费者等待缓冲区内没产品,且没消费者等待n0:n0:缓冲区内没产品,缓冲区内没产品,|n||n|个消费者等个消费者等待待/*producer*//*producer*/while(true){while(true){produce;produce;P(sP(s););append;append;V(sV(s););V(nV(n););}}/*consumer*//*consumer*/while(true){while(true){P(nP(n););P(sP(s););take;take;V(sV(s)
本文标题:生产者-消费者问题
链接地址:https://www.777doc.com/doc-1624294 .html