生产者-消费者问题

生产者-消费者问题

image


一、问题背景及分析

  • 系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。(注:这里的“产品”理解为某种数据)
  • 生产者、消费者共享一个初始为空、大小为 n 的缓冲区。
  • 只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。
  • 只有缓冲区没空时,消费者才能从中取出产品,否则必须等待,
  • 缓冲区是临界资源,各进程必须互斥地访问。(互斥关系)

image

image

二、问题实现

image

理解补充:

  • 生产者生产了一个产品,现在要把它放入缓冲区,所以要先 P 一下 empty 看看有没有空闲缓冲区可以装入刚生产的产品;产品的总数量增加,这时候同时要 V 一下释放一个 full 资源。
  • 在同一个进程中互斥是保证当前只有一个生产者进程进入临界区,为了防止两个生产者进程同时往缓冲区内同一块地方写入数据。
  • 互斥表示这两个进程不能同时对缓冲区进行操作,而同步表示这两个进程是在同一段时间内一个生产一个消费。
  • P(empty) 在 P(mutex) 之前是因为要先检测缓冲区是否有人使用(先检测是否有空闲缓冲区),再执行释放资源(占用缓冲区)(进厕所前先看看有没有坑位,不然占用了厕所但得不到坑位,可能导致死锁)。

三、问题思考

image

(一)能否改变相邻 P 或相邻 V 操作的顺序

P 不能。实现互斥的 P 操作一定要在实现同步的 P 操作之后,否则会导致死锁。

V 可以。V 操作不会导致进程阻塞。

(二)生产者的生产过程和消费者的消费过程能否放入P、V操作之间

逻辑上可以,但会导致临界区代码变长,即导致一个进程对临界区的上锁时间增长,不利于各进程交替使用临界区资源,上锁的范围应尽量小。

posted @   Wind_730  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示