操作系统信号量实验五

操作系统信号量实验五

一、实验目的

生产者消费者是一个经典的并发性问题,通过生产者消费者模拟与实现,熟悉Linux 中的多线程编程,并且掌握用信号量处理线程间的同步和互斥问题。

**

二、实验内容

**

问题描述:
缓冲区大小为N,生产者产生物品放到缓冲区,消费者将物品从缓冲区移走互斥关系:
对缓冲区得访问需要互斥,包括生产者和生产者之间、消费者和消费者之间、生产者和消费者之间。
同步关系:
当缓冲区满时生产者进程需要等待,当缓冲区空时消费者进程需要等待。
解题思路:
用信号量解决生产者消费者问题。互斥:
有界缓冲区是一个临界资源,对临界资源得访问需要设置一个信号量 mutex
同步:
设置两个同步信号量empty 和full,其初值分别为 n、0,用于临界资源得具体数目,同时也可以表示等待条件
具体如下:
在这里插入图片描述

三、实验步骤

初步编写生产者消费者
在这里插入图片描述
一种测试结果
在这里插入图片描述
分析结果:生产者和消费者并发,谁先被调度的概率是一样的。缓冲区初始为空,如果先调度消费者,即使缓冲区是空的也执行取走一个数据,结果缓冲区数目出现了负数。所以应该设置同步控制,使得当缓冲区为空的时候消费者等待,生产者执行,当缓冲区不为空时,消费者才可以执行。另一方面,缓冲区满了,应该让生产者等待,消费者先执行,当缓冲区不满时,生产者才可以执行。
如果缓冲初始不是空的,设为N
在这里插入图片描述
测试结果
在这里插入图片描述
加入两个信号量作为条件同步。
在这里插入图片描述
多次测试,不会出现以前的问题
在这里插入图片描述
加入循环和 sleep,模拟不停地生产者,不停地消费者。
在这里插入图片描述
多次测试,每次执行一会儿就ctrlC 结束,分析数据结果有无异常。
在这里插入图片描述
分析结果:左侧为消费者输出,右侧为生产输出,先分析生产者,生产者生产 1 输出 1 再生
产 1 个还是输出 1,为什么不是 2 呢?分析消费者,因为生产者生产完第 2 个发生了线程切换消费者消费了一个,再切换回生产者线程结果就是消费后的结果了所以是 1。主要原因是临界区没有实现生产者和消费者的互斥。下面修改代码加入互斥解决问题。
在这里插入图片描述
执行测试一会儿,ctr c 结束,没有了上述问题。因此互斥信号量和同步信号量确保了结果的正常。
在这里插入图片描述
word文件下载

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值