资源描述:
《经典进程同步问题ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、2.4经典进程同步问题在多道程序环境下,进程同步问题是十分重要的,也是相当有趣的问题,因而吸引了不少学者对它进行研究。其中较有代表性的是“生产者——消费者问题”、“读者——写者问题”、“哲学家进餐问题”等。12.4.1生产者——消费者问题问题的描述:有一群生产者进程生产消息,并将此消息提供给消费者进程消费。为使生产者进程和消费者进程并发执行,在它们之间设置一个具有n个缓冲区的公共缓冲池。生产者进程将它所生产的消息放入一个缓冲区中,消费者进程可以从一个缓冲区中取得一个消息消费。不允许消息费者进程到一个空
2、缓冲区中去取消息,也不允许生产者进程向一个已装有消息且尚未被取走消息的缓冲区中投放消息。2需要解决的问题:1、对缓冲池的互斥访问,即只有一个进程访问缓冲区。2、对生产、消费进程的同步,即:有产品时才能消费,无产品时,必须先生产后消费;有空间时才能生产,空间满时,必须先消费再生产。3信号量的设置:1、一个互斥信号量mutex,用于实现对共享缓冲区的互斥访问,初始值为1。2、两个同步信号量,分别表示可用资源数:Empty:表示空缓冲区的个数,初始值为nFull:表示装有消息的缓冲区的个数,初始值为0,(一
3、个缓冲区中放一条消息)4一、利用记录型信号量解决生产者——消费者问题数据结构:Varmutex,empty,full:semaphore∶=1,n,0;//定义信号量并赋初值buffer:array[0,…,n-1]ofitem;//定义缓冲区in,out:integer∶=0,0;//定义存取指针的初始位置5Proceduer://生产者进程beginrepeat…生产一件产品;…wait(empty);wait(mutex);buffer[in]:=nextp;in∶=(i
4、n+1)modn;signal(mutex);signal(full);untilfalse;endempty:=empty-1;ifempty<0thenblock;mutex:=mutex-1;ifmutex<0thenblock;full:=full+1;iffull<=0thenwakeup;mutex:=mutex+1;ifmutex<=0thenwakeup;6consumer://消费者进程beginrepeatwait(full);wait(mutex);nextc:
5、=buffer[out];out∶=(out+1)modn;signal(mutex);signal(empty);消费这件产品;untilfalse;endfull:=full-1;iffull<0thenblock;mutex:=mutex-1;ifmutex<0thenblock;empty:=empty+1;ifempty<=0thenwakeup;mutex:=mutex+1;ifmutex<=0thenwakeup;7例:有生产者P1、P2和消费者C1,利用3个信号量和对它们的
6、wait和signal操作实现同步与互斥。初始条件:记录型信号量mutex.value=1,empty=2,full=0执行序列mutexemptyfullempty队列full队列P1:wait(empty),wait(m),CS01signal(m),signal(f)11P1:wait(empty),wait(m),CS00signal(m),signal(f)12P2:wait(empty)-1p2P1:wait(empty)-2p1C1:wait(full),wait(m),CS01sign
7、al(m),signal(empty)1-1(唤醒p2)P2:wait(m)0CSC1:wait(full),wait(m)-10C1P2:signal(m),signal(full)01(唤醒C1)C1:CS,signal(m),signal(e)10(唤醒p1)P1:wait(m)08在生产者—消费者问题中应注意:(1)在每个程序中用于实现互斥的wait(mutex)和signal(mutex)必须成对地出现。(2)对资源信号量empty和full的wait和signal操作,同样需要成对地出现,
8、但它们分别处于不同的进程中,这样保证生产者进程和消费者进程的同步及交替执行。(3)在每个进程中,多个wait操作顺序不能颠倒,而signal操作的次序是无关紧要的。9Wait操作不能颠倒!!P:wait(empty)wait(mutex)C:wait(full)wait(mutex)如果颠倒P:wait(mutex)mutexl.value=0wait(empty)如果此时缓冲池满empty=-1,P阻塞C:wait(mutex)mutex.value=