华东理工815操作系统第7讲讲述.ppt
文本预览下载声明
第7讲作业: P82-83页:第23-28,30,32题 2.4 经典进程的同步问题 在多道程序环境下,进程同步问题十分重要,出现一系列经典的进程同步问题,其中有代表性有: 生产者—消费者问题 哲学家进餐问题 读者—写者问题 一、“生产者—消费者”问题 问题描述: “生产者---消费者”问题是最著名的进程同步问题。它描述了一组生产者向一组消费者提供产品,它们共享一个缓冲池(有n个缓冲区),生产者向其中投放产品,消费者从中取得产品。 它是许多相互合作进程的抽象,如输入进程与计算进程;计算进程与打印进程等。 一、“生产者—消费者”问题 一个生产者,一个消费者,公用一个缓冲区 定义两个同步信号量: empty——表示缓冲区是否为空,初值为n。 full——表示缓冲区中是否为满,初值为0。 生产一个产品 取出一个产品 生产者 缓冲区 一、“生产者—消费者”问题 生产者进程: while(TRUE){ 生产一个产品; P(empty); 把产品送往Buffer; V(full); } 消费者进程: while(TRUE){ P(full); 从Buffer取出一个产品; V(empty); 消费产品; } 一、“生产者—消费者”问题 M个生产者,K个消费者,公用有n个缓冲区的缓冲池 一、“生产者—消费者”问题 M个生产者,K个消费者,公用有n个缓冲区的缓冲池 设缓冲池的长度为n(n0),一群生产者进程P1,P2,…,Pm,一群消费者进程C1,C2,…,Ck,如图所示。假定生产者和消费者是相互等效,只要缓冲池未满,生产者就可以把产品送入缓冲区,类似地,只要缓冲池未空,消费者便可以从缓冲区取走产品并消耗它。生产者和消费者的同步关系将禁止生产者向满的缓冲池输送产品,也禁止消费者从空的缓冲池提取产品。 设置两个同步信号量及一个互斥信号量 empty:说明空缓冲区的数目,其初值为缓冲池的大小n,表示消费者已把缓冲池中全部产品取走,有n个空缓冲区可用。 full:说明满缓冲区的数目(即产品数目),其初值为0,表示生产者尚未把产品放入缓冲池,有0个满缓冲区可用。 mutex: 说明该缓冲池是一临界资源,必须互斥使用,其初值为1。 “生产者—消费者”问题的解决 “生产者—消费者”问题的同步算法描述 semaphore full=0; /*表示满缓冲区的数目*/ semaphore empty=n; /*表示空缓冲区的数目*/ semaphore mutex=1; /*表示对缓冲池进行操作的互斥信号量*/ main() { cobegin producer(); consumer(); coend } “生产者—消费者”问题的解决 { while(true) { 生产一个产品放入nextp; P(empty); P(mutex); Buffer[in]=nextp; in=(in+1) mod n; V(mutex); V(full); } } producer() { while(true) { P(full); P(mutex); nextc =Buffer[out]; out=(out+1) mod n; V(mutex); V(empty); 消费nextc中的产品; } } consumer() “生产者-消费者”问题中应注意 1. 互斥信号量的P、V操作在每一进程中必须成对出现。 2. 对资源信号量(full,empty)的P、V操作也必须成对出现,但可分别处于不同的程序中。 3. 多个P操作顺序不能颠倒。 4. 先执行资源信号量的P操作,再执行互斥信号量的P操作,否则可能引起进程死锁。 “生产者-消费者”问题中应注意 5. 它是一个同步问题: (1)消费者想要取产品,缓冲池中至少有一个缓冲区是满的。 (2)生产者想要放产品,缓冲池中至少有一个缓冲区是空的。 6. 它是一互斥问题 缓冲池是临界资源,因此,各生产者进程和各消费者进程必须互斥访问。 用管程机制解决生产者—消费者问题 1、建立Producer-consumer(PC)管程 Type PC=monitor var in,out,count:integer; buffer:array[0,…,n-1] of item; notfull,notempty:con
显示全部