进程同步问题总结

生产者-消费者问题类

  1. 由三个进程get,copy和put以及两个缓冲区buffer1和buffer2完成一项输入/输出操作。进程get的功能是把一张卡片上的信息从读卡机上读进buffer1;进程copy的功能是把buffer1中的信息复制到buffer2;进程put的功能是取出buffer2中的信息并从打印机上打印输出。试用P、V操作完成这三个进程间的尽可能并发正确执行的关系(用程序或框图表示),并指明信号量的作用和初值。
    分析:可设置6个信号量mutex1,mutex2,empty1,empty2,full1,full2。
    mutex1和mutex2是互斥信号量,初值为1,分别用于对buffer1和buffer2的互斥访问;
    empty1和empty2为同步信号量,初值为1,分别表示buffer1和buffer2是否空闲,1表示空闲,0表示不空闲;
    full1和full2为同步信号量,初值为0,分别表示buffer1和buffer2中是否有可取用的信息,1表示有可取用的信息,0表示无可取用的信息。
    semaphore mutex1, mutex2, empty1, empty2, full1, full2 ;
    mutex1=mutex2=1;		//互斥信号量
    empty1=empty2=1;		//生产者进程的同步信号量
    full1=full2=0;		//消费者进程的同步信号量
    
    parbegin
    	process get( )  //读进程(生产者进程)
    	{
         
    		while (1) {
         
    			从读卡机读入一张卡片的信息;
    			P(empty1);	//看看buffer1是否空闲
    			P(mutex1);	//互斥访问buffer1
    			将信息放入buffer1;
    			V(mutex1);
    			V(full1);	//通知进程copy,buffer1中已有信息可取(若copy正在等待,则唤醒之)
    		}
    	}
    	
    	process copy( )  //复制进程(既是消费者又是生产者进程)
    	{
         
    		while (1) {
         
    			P(full1)	//看看buffer1是否有信息可取
    			P(mutex1); 	//互斥访问buffer1
    			从buffer1中复制出信息;
    			V(mutex1);
    			V(emtpy1); 	//通知get,buffer1中的信息已取走(可能唤醒get)
    			P(empty2);	//看看buffer2是否空闲
    			P(mutex2);	//互斥访问buffer2
    			将复制的信息放入buffer2;
    			V(mutex2);
    			V(full2);	//通知put,buffer2中已有信息
    		}
    	
  • 5
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值