BUF1BUFnBUF2.….PbPa1发送进程和接收进程的同步问题利用信号量可以解决合作进程之间的同步。例:设进程Pa,Pb通过缓冲区队列传送数据经典的进程同步问题发送和接送过程满足的条件是:1)在Pa至少送一块数据入一个缓冲区之前,Pb不可能从缓冲区中取出数据2)Pa往缓冲队列发送数据时,至少有一个缓冲区是空的;3)由Pa发送的数据块在缓冲队列中按先进先出(FIFO)方式排列.描述发送过程deposit(data)和接受过程remove(data).BUF1BUFnBUF2.….PbPa1)Bufempty————进程Pa的私用信号量,Buffull————进程Pb的私用信号量;2)Bufempty的初始值为n(n为缓冲队列的缓冲区个数),Buffull的初始值为0;发送过程Deposit(data),接送过程Remove(data),这两个过程必须同步,因为,因为过程deposit(data)的执行结果是过程remove(data)的执行条件,而当缓冲队列全部装满数据时,remove(data)的执行结果又是deposit(data)的执行条件。BUF1BUFnBUF2.….PbPaPa:deposit(data)Pb:remove(data)beginlocalxbeginlocalxP(Bufempty)P(Buffull)按FIFO方式选择一个按FIFO方式选择一个空缓冲Buf(x);装满数据的缓冲Buf(x)Buf(x)--datadata--Buf(x)Buf(x)置满标记Buf(x)置空标记V(Buffull)V(Bufempty)endend发送过程deposit(data)和接受过程remove(data)123…….……nP1P2P3.Pn.C1C2C3.CnDijkstra把同步问题抽象成一种生产者和消费者关系,计算机系统中的许多问题都可以被归结为生产者和消费者关系,例如,生产者可以是计算进程,消费者是打印进程,输入时输入进程是生产者,计算进程是消费者。我们可以通过一个缓冲区把生产者和消费者联系起来2生产者-消费者的同步问题(TheProceducer-ConsumerProblem)举例:生产者把产品生产出来,送入仓库。给消费者发信号,消费者得到信号后,到仓库取产品,取走产品后给生产者发信号……产品仓库一个生产者一个消费者经典的进程同步问题生产者-消费者问题是相互合作进程关系的一种抽象输入——计算——打印生产者消费者生产者消费者系统中使用资源的进程——消费者系统中释放资源同类资源的进程——生产者产品仓库一个生产者一个消费者1想接收数据时,有界缓冲区中至少有一个单元是满的2生产者想发送数据时,有界缓冲区中至少有一个单元是空的同步问题由于缓冲区是临界资源,所以生产者和消费者之间必须互斥的访问临界资源用信号量解题的关键步骤:信号量的设置;给信号量赋初值(常用的互斥和同步信号量值的大小);P、V操作安排的位置(其中,P的顺序不能颠倒,V的顺序任意)要解决进程的同步问题要满足的条件设:公用信号量mutex表示缓冲区的个数初值为1(消费者)私用信号量full表示有界缓冲区中非空单元数初值为0(生产者)私用信号量avail表示有界缓冲区中空的单元数初值为ndeposit(data):beginP(avail)检查缓冲区中是否有空单元执行后n-1P(mutex)检查缓冲区是否可用执行后mutex=0送数据入缓冲区V(full)执行后,非空单元数加10+1=1V(mutex)释放缓冲区中的资源endRemove(data):beginP(full)检查缓冲区是否有数据P(mutex)访问缓冲区取缓冲区中某单元数据V(avail)取走数据以后,有界缓冲区的空单元个数加1V(mutex)释放缓冲区enddeposit(data):beginP(avail)P(mutex)送数据入缓冲区V(full)V(mutex)endRemove(data):beginP(full)P(mutex)取缓冲区中某单元数据V(avail)V(mutex)end公用信号量,互斥时使用的信号量(二元信号量):它仅允许取值为“0”与“1”,用作互斥。它联系着一组共行进程,初值为1,每个进程均可对之施加P、V操作。私用信号量:一般信号量(资源信号量):它联系着一组共行进程,但其初值为0,或为某个正整数n,表示资源的数目,主要用于进程同步。只允许拥有它的进程对之施加P操作,对V操作没有限制次序次序(消费者)私用信号量full表示有界缓冲区中非空单元数初值为0(生产者)私用信号量avail表示有界缓冲区中空的单元数初值为n几个经典的进程同步问题生产者—消费者问题哲学家进餐问题读者—写者问题图书馆阅览室问题理发师问题吃水果问题司机—售票员问题过河问题生产者—消费者问题一个最著名的进程同步问题问题描述:一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者存入消息,消费者从中取得消息。哲学家进餐问题哲学家进餐问题是典型的同步问题,是由Dijkstra提出并解决的。问题描述5个哲学家,他们的生活方式是交替的思考和进餐。哲学家们公用一张圆桌,分别坐在周围的5张椅子上,圆桌上有5个碗和5支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左、右最靠近他的筷子,只有他拿到两只筷子时才能进餐,放下筷子又继续思考。例:利用信号量解决读者和写者问题一个文件可能被多个进程共享,为了保证读写的正确性和文件的一致性,系统要求,当有读者进程读文件时,不允许任何写者进程写,但允许多读者同时读;当有写者进程写时,不允许任何其它写者进程写,也不允许任何读者进行读。为了解决读者和写者问题,需设置两个信号量:(1)读互斥信号量rmutex,用于使读者互斥地访问共享变量readcount,这里readcount是记录有多少读者正在读;(2)写互斥信号量wmutex,用于实现读写互斥。读者—者问题进行如下描述:structsemaporermutex,wmutex=1,1;intreadcount:=0;cobeginvordreaderi(vord)(i=1,2,…k){while(true){p(rmutex);ifreadcount=0thenp(wmutex);readcount:=readcount+1;v(rmutex);读文件;…p(rmutex);readcount:=readcount-1;ifreadcount=0thenv(wmutex);v(rmutex);}}vordwriterj(vord)(j=1,2,…,m){while(true){p(wmutex);写文件;v(wmutex);}}Coend课后练习图书馆阅览室问题问题描述:假定阅览室最多可同时容纳100个人阅读,读者进入时,必须在阅览室门口的一个登记表上登记,内容包括姓名、座号等,离开时要撤掉登记内容。用P、V操作描述读者进程的同步算法。理发师问题问题描述:一个理发店由一个有几张椅子的等候室和一个放有一张理发椅的理发室组成。若没有要理发的顾客,则理发师就去睡觉;若一顾客走进理发店且所有的椅子都被占用了,则该顾客就离开理发店;若理发师正在为人理发,则该顾客就找一张空椅子坐下等待;若理发师在睡觉,则顾客就唤醒他,设计一个协调理发师和顾客的程序。吃水果问题问题描述:桌上有一只盘子,每次只能放一个水果,爸爸专向盘中放苹果,妈妈专向盘中放桔子,儿子专等吃盘里的桔子,女儿专等吃盘里的苹果。只要盘子空,则爸爸或妈妈可向盘中放水果,仅当盘中有自己需要的水果时,儿子或女儿可从中取出,请给出四人之间的同步关系,并用P、V操作实现四人正确活动的程序。四人之间的关系爸爸,妈妈要互斥使用盘子,所以两者之间是互斥关系;爸爸放的苹果,女儿吃,所以两者是同步关系;妈妈放的桔子,儿子吃,所以两者也是同步关系。司机—售票员问题设公共汽车上,司机和售票员的活动分别是:司机:售票员:启动车辆上下乘客正常行车关车门到站停车售票开车门上下乘客在汽车不断到站,停车,行驶过程中,这两个活动的同步关系。