一、生产者-消费者问题
生产者-消费者问题是一个著名的进程同步问题。
它描述的是:有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区;消费者进程可从一个缓冲区中取走产品去消费。尽管所有的生产者进程和消费者进程都是以异步方式运行的,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。
用一个数组来表示上述的具有n个(0,1,...,n-1)缓冲区的缓冲池;
用输入指针in来指示下一个可投放产品的缓冲区,每当生产者进程生产并投放一个产品后,输入指针加1;
用一个输出指针out来知识下一个可从中获取产品的缓冲区,每当消费者进程取走一个产品后,输出指针就加1;
注意,由于这里的缓冲池是组织成循环缓冲的(就是数据结构中的循环队列),故应把输入指针加1表示成in:=(in+1)mod n;
输出指针加1表示成out:=(out+1)mod n。
当(in+1)mod n=out时表示缓冲池满;而in=out则表示缓冲池空。
此外,还引入了一个整型变量counter,其初始值为0。每当生产者进程向缓冲池中投放一个产品后,count+1;反之,每当消费者进程虫中取走一个产品时,使counter-1.
1.利用记录型信号量解决生产者-消费者问题
假定在生产者和消费者之间的公用缓冲池中,具有n个缓冲区,这时可利用互斥信号量mutex实现诸进程对缓冲池的互斥利用。利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量。又假定这些生产者和消费者相互等效,只要缓冲池未满,生产者便可将消息送入缓冲池;只要缓冲池未空,消费者便可从缓冲池中取走一个消息。
伪码描述如下:
V
生产者-消费者问题是一个著名的进程同步问题。
它描述的是:有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区;消费者进程可从一个缓冲区中取走产品去消费。尽管所有的生产者进程和消费者进程都是以异步方式运行的,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。
用一个数组来表示上述的具有n个(0,1,...,n-1)缓冲区的缓冲池;
用输入指针in来指示下一个可投放产品的缓冲区,每当生产者进程生产并投放一个产品后,输入指针加1;
用一个输出指针out来知识下一个可从中获取产品的缓冲区,每当消费者进程取走一个产品后,输出指针就加1;
注意,由于这里的缓冲池是组织成循环缓冲的(就是数据结构中的循环队列),故应把输入指针加1表示成in:=(in+1)mod n;
输出指针加1表示成out:=(out+1)mod n。
当(in+1)mod n=out时表示缓冲池满;而in=out则表示缓冲池空。
此外,还引入了一个整型变量counter,其初始值为0。每当生产者进程向缓冲池中投放一个产品后,count+1;反之,每当消费者进程虫中取走一个产品时,使counter-1.
1.利用记录型信号量解决生产者-消费者问题
假定在生产者和消费者之间的公用缓冲池中,具有n个缓冲区,这时可利用互斥信号量mutex实现诸进程对缓冲池的互斥利用。利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量。又假定这些生产者和消费者相互等效,只要缓冲池未满,生产者便可将消息送入缓冲池;只要缓冲池未空,消费者便可从缓冲池中取走一个消息。
伪码描述如下:
V