操作系统-------用P,V操作解决生产者和消费者问题(详解!!!)

问题:

        系统中有一组生产者进程和一组消费者进程,生产者每次生产一个产品放入缓冲区,消费者每次从缓冲区取出一个产品并使用(注:这里的产品可以理解成某种数据)。

条件:生产者、消费者共享一个初始化为空的、大小为n的缓冲区。

提示:

        做这一题之前一定要熟练的掌握进程的互斥和进程的同步,一定要会!!一定要会!!一定要会!

        不会的话可以   点击这里!!!

题目分析:

        1.首先读题之后就容易知道,咱们现在有一个缓冲区,生产者负责生产产品,然后把产品放到缓冲区里面,生产产品的前提条件是缓冲区未满,缓冲区的大小为n。消费者负责使用产品,但是使用产品的前提条件缓冲区里面有产品。

        2.下面分析一下互斥和同步的问题,因为只有一个缓冲区(生产者放产品,消费者取产品),所以这里可以把缓冲区看成临界资源(类似多个打印机进程打印那样),而且多个生产者之间不能同时往缓冲区中放产品(可能会造成覆盖),多个消费者也不可以同时在缓冲区中取产品,也不可以生产者放产品的同时,消费者取产品。

          经过上面的分析,可以得出进程的互斥和进程同步的结论

 结论:

        互斥------------因为缓冲区是临界资源,各种进程必须互斥的访问(即不能同时访问)。

        同步1-----------只有缓冲区不空时,消费者才可以从缓冲区中取产品,即  “ 先生产后消费 ”。

        同步2-----------只有缓冲区不满时,生产者才可以往缓冲区中放产品,即  “ 先消费后生产”。

具体解法:

semaphore mutex=1;//互斥信号量 ,实现对缓冲区的互斥访问 
semaphore full =0;//同步1信号量,表示产品的数量 
semaphore empty=n;//同步2信号量,表示空闲区的数量 

producer()
{
	while(1)
	{
		生产一个产品;
		P(empty); 
		P(mutex);
		将产品放入缓冲区;
		V(mutex);
		V(full); 
	}
} 

consumer()
{
	while(1)
	{
		P(full); 
		P(mutex);
		从缓冲区取出一个产品;
		V(mutex);
		V(empty); 
		使用一个产品;
	}
} 

讨论:

      1.生产者和消费者进程都有两个P操作在一块,可以把生产者的两个P操作或者消费者的两个P操作调换顺序吗?

     答案:无论是生产的的两个P操作,还是消费者的两个P操作都不可以调换顺序。假如生产的的两个P操作调换了顺序(包含了消费者换或者不换两种情况),现在有一种情况是empy=0,full=n,在这种情况下,假设消费者进程先执行,

生产一个产品------>P(mutex)占用缓冲区,这时候除非等消费者释放缓冲区,不然谁也无法使用缓冲区了

-------->P(empty)因为empty=0,所以执行block原语,将生产的进程从运行态转到阻塞态,经过这一步之后消费者进程阻塞,只能等切换进程,假如切换到消费者进程,无论P(mutex)在P(full)前还是在P(full)后,总归要执行P(mutex),但是生产者正在占用缓冲区,因此就产生了死锁。

       调换消费的的两个P操作顺序也是类似,在empty=n,full=0的情况下也不满足,如果不懂得话,自己可以按照上面的进行推导。 

      2.生产者和消费者进程都有两个V操作在一块,可以把生产者的两个V操作或者消费者的两个V操作调换顺序吗?

      答案:可以

注意:如果看完分析还是不懂,再去把进程的互斥和进程的同步看一遍,一点要把这两个弄清楚。

  • 20
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一、设计要求 设计一个模拟仿真“生产者-消费者问题解决过程及方法的程序。 主要内容是P、V操作过程的设计与实现。生产消费者问题操作系统设计中经常遇到的问题。多个生产者消费者线程访问在共享内存中的环形缓冲。生产者生产产品并将它放入环形缓冲,同时消费者从缓冲中取出产品并消费。当缓冲区满时生产者阻塞并且当缓冲区有空时生产者又重新工作。类似的,消费者当缓冲区空时阻塞并且当缓冲区有产品时又重新工作。显然,生产者消费者需要一种同步机制以协调它们的工作。 二、系统功能 本程序模拟实现了“生产者-消费者问题解决过程,用图形界面动态演示了P、V操作过程以及生产者消费者进程之间的工作流程。 本程序使用的算法是典型的P、V操作使用信号量解决生产者-消费者问题。 本程序在界面上使用了Java的swing接口函数,用矩形条表示生产者进程中待生产的产品,并设置了三个分区分别表示生产者进程待生产的产品、公共缓冲池中已生产的产品和消费者进程已消费的产品,以动画的效果动态演示了待生产产品变成消费者进程中已消费产品的过程,以及在这一过程中生产者进程和消费者进程协调工作的过程。在程序运行过程中使用了两个生产者线程和两个消费者线程并发工作,并使用了线程随机休眠的策略,即每个线程在完成一次生产过程或消费过程后随机休眠1至10秒钟。这一策略能保证生产者消费者之间的运行顺序被打破,从而产生生产产品和消费产品之间的矛盾(即没有产品可消费的情况下消费者试图向公共缓冲池取产品消费、公共缓冲池里的产品已满的情况下生产者试图生产产品放入缓冲池)。因为生产者生产产品和消费者消费产品都是随机的,所以产生的矛盾也是不可预知的,在这种情况下,才能检验所使用的算法是否健壮高效。而本程序正是基于这种思想设计出来的,用来模拟生产者消费者问题解决过程。 本程序在运行时提供友好的交互界面,且操作简单,在模拟过程中各种情况有相应文字提示,并伴有相应的图像变化,如:当没有产品可消费的情况下消费者试图向公共缓冲池取产品消费,消费者进程阻塞,公共缓冲池随之变成红色,文字提示框内显示warning: it's empty!Consumer is block;当缓冲池已满而生产者试图生产产品并向缓冲池放入产品时,生产者进程阻塞,公共缓冲池里的每一个产品变成黄色,问题提示框显示warning: it's full!Producer is block。整个模拟过程通俗易懂,利于理解,能很好的帮助使用者加强生产者消费者问题的理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值