同步互斥小口诀

  • 画图理解题目
  • 判断题目类型
  • 分析进程数目 填写进程模板
  • 补充基本代码(伪代码)
  • 补充PV代码
  • 检查调整代码

注意事项

  • 代码是一步一步写出来的,代码是反复调整写出来的
  • 60%是生产者和消费者模型
  • 30%是读者和写者的模型

生产者和消费者

例子1

  • 妈妈每次放放一个苹果到桌子上,孩子每次从桌子上取一个苹果。取苹果和放苹果不可以同时进行,而且桌子上最多只能放10个苹果,请使用pv代码实现同步互斥
  • 箭头 代表生产的含义,数目代表生产的数量

  • 特征:1,存在一个容器,具有容量的限制;2,具有生产行为和消费行为,生产行为增加容量,消费行为减少容量
  • 分析:生产者:需要考虑容器的容量,考虑的是剩余空间;消费者:需要考虑已占用空间
  • 进程的数目:母亲 和 孩子两个进程
  • 补充基本代码  取一个苹果 和 放一个苹果
  • 补充PV代码 full代表占用空间;empty代表已经占用的空间;p代表减;v代表加
  • 使用P(s)和V(s)包住会改变容器容量的代码,也就是临界资源
  • 代码
semaphore full = 0;  //表示资源
semaphore empty = 10;//表示资源
semaphore s = 1;     //表示互斥
孩子(){while(1){p(full);//是否有已占用空间,有则减少已占用空间,无则等待p(s);取一个苹果;v(s);v(empty);//增加剩余空间}
}妈妈(){while (1){p(empty);//是否有剩余空间,有则减少剩余空间,无则等待p(s);放一个苹果;v(s);v(full);//增加已占用空间}}

例子2

  • 桌子上有一个盘子,每次只能放入一个水果,妈妈放入橘子,爸爸放入苹果,儿子吃橘子,女儿吃苹果。盘子为空,爸爸妈妈才可以放入水果,当盘子的水果和儿子或者女儿匹配的时候,儿子和女儿才可以拿水果
  • 消费者(儿子) 关注橘子;消费者(女儿)关注苹果;生产者(妈妈)关注盘子空间;生产者(爸爸)关注盘子空间
  • 四个进程

  • mutex 和 plate的效果是等价的,因此,这里不加mutex也是可以的
  • 代码
semaphore orange = 0;
semaphore apple = 0;
semaphore plate = 1;
semaphore mutex = 1;
妈妈(){while(1){p(plate);p(mutex);放橘子;v(mutex);v(orange);}
}爸爸(){while (1){p(plate);p(mutex);放苹果;v(mutex);v(apple);}}儿子(){while (1){p(orange);p(mutex);吃橘子;v(mutex);v(plate);}}女儿(){while (1){p(apple);p(mutex);吃苹果;v(mutex);v(plate);}}

例子3

  • AB两个人通过信箱进行辩论,每个人都从自己的信箱取出对方的问题,将答案和新的问题组成一个邮件放入对方的信箱中,假设A的信箱可以装入M个邮件,B的信箱可以装入N个邮件,初始的时候,A信箱有X封邮件,B信箱有y封邮件,辩论者每次只取一封邮件,请使用PV操作实现,并解释信号量初值和含义
  • 分析
  • 生产者 A  关注 B的邮箱剩余空间
  • 生产者 B 关注 A的邮箱剩余空间
  • 消费者 A 关注 A的邮箱有多少封信件
  • 消费者 B 关注 B的邮箱有多少封信件

  • 代码
semaphore mutex_A = 1;
semaphore mutex_B = 1;
semaphore full_A = x;
semaphore empty_A = M - x;
semaphore full_B = y;
semaphore empty_B = N - y;
A(){while(1){p(full_A);p(mutex_A);从A的邮箱抽取信件;v(mutex_A);v(empty_A);p(empty_B);p(mutex_B);向B的邮箱投递信件;v(mutex_B);v(full_B);}
}B(){while (1){p(full_B);p(mutex_B);从B的邮箱抽取信件;v(mutex_B);v(empty_B);p(empty_A);p(mutex_A);向A的邮箱投递信件;p(mutex_A);p(full_A);}}

例子4

  • 系统中有多个生产者和消费者,共享一个能存放1000件产品的环形缓冲区(初始为空)。当缓冲区没有满的时候,生产者可以放入生产的一个产品,否则等待,当缓冲区域不为空的时候,消费者进程可以取走一件商品,否则等待。要求一个消费者从缓冲区域连续取走10个产品之后,其他消费者才可以取走产品,请使用PV实现该流程并解释信号量的含义
  • 生产者 j 剩余空间
  • 消费者 i 剩余空间
  • 消费者 m 物件数量
  • 消费者 n  物件数量
  • 代码
semaphore empty = 1000;
semaphore full = 0;
semaphore mutex = 1;
semaphore mutex_2 = 1;
生产者i(){while(1){p(empty);p(mutex);放一件物品;v(mutex);v(full);}
}生产者j(){while(1){p(empty);p(mutex);放一件物品;v(mutex);v(full);}
}消费者m(){while (1){p(mutex_2);for(int i = 0;i < 10;i++){p(full);p(mitex);取一件物品;v(mutex);v(empty);}v(mutex_2);}}消费者n(){while (1){p(mutex_2);for(int i = 0;i < 10;i++){p(full);p(mitex);取一件物品;v(mutex);v(empty);}v(mutex_2);}}

计算机操作系统生产者和消费者模型的简单介绍相关推荐

  1. python多线程实现生产者消费者_用Python实现多线程“生产者-消费者”模型的简单例子...

    用 Python 实现多线程"生产者 - 消费者"模型的简单例子 生产者消费者问题是一个著名的线程同步问题, 该问题描述如下: 有一个生产者在生产产品, 这些产品将提供给若干个消费 ...

  2. 开启子进程的两种方式,孤儿进程与僵尸进程,守护进程,互斥锁,IPC机制,生产者与消费者模型...

    开启子进程的两种方式 # # # 方式一: # from multiprocessing import Process # import time # # def task(x): # print(' ...

  3. java线程-从生产者和消费者模型说起

    今天学习了经典的生产者和消费者模型,引起了对java线程等知识的一系列的思考. 在平时的编程中,经常遇到一个线程要产生数据,而另一个线程要处理产生出来的数据,这其实就是生产者和消费者的关系.生产者在产 ...

  4. 【Linux下】 线程同步 生产者与消费者模型

    文章目录 [Linux下] 线程同步 生产者与消费者模型 线程同步 同步概念与竞态条件 条件变量 条件变量本质 操作条件变量 初始化和销毁条件变量 等待 唤醒 通过条件变量实现的简单线程同步例子 为什 ...

  5. Linux系统编程39:多线程之基于阻塞队列生产者与消费者模型

    文章目录 (1)生产者与消费者模型概述 (2)生产者与消费者模型优点 (3)基于阻塞队列(blockingqueue)的生产者消费者模型(单消费者单生产者) (4)基于阻塞队列(blockingque ...

  6. Linux 生产者与消费者模型C++实现

    生产者与消费者模型 本篇博客代码实现都是在linux环境下跑的 通过条件变量实现 应用场景:针对大量数据的产生与处理的场景 生产与处理是放到不同执行流中完成的,中间会增加一个数据缓冲区,作为中间的数据 ...

  7. Java多线程案例--生产者和消费者模型(送奶人和喝奶人的故事!)

    文章目录 一.进程和线程 1.进程 2.线程 3.进程与线程的区别 二.生产者和消费者模型 1.生产者消费者模式概述 2.奶箱类 3.生产者类 4.消费者类 三.测试 1.测试类(BoxDemo) 2 ...

  8. 例说生产者和消费者模型

    什么是生产者和消费者模型 什么是生产者消费者模型?生产者和消费是操作系统中一种重要的模型,它描述的是一种等待和通知的机制,如下图. 生产者和消费者模型必须具有的条件 用一句话概括,生产者消费者模型必须 ...

  9. 生产者和消费者模型介绍

    一.概念引入 日常生活中,每当我们缺少某些生活用品时,我们都会去超市进行购买,那么,你有没有想过,你是以什么身份去的超市呢?相信大部分人都会说自己是消费者,确实如此,那么既然我们是消费者,又是谁替我们 ...

最新文章

  1. insert size|single-read|Paired-end|Mate-pair
  2. linux命令 -- split命令
  3. 50个常用元器件图片_50个最常用的英语短语(一),值得收藏!
  4. POJ - 2318 TOYS(叉积+二分)
  5. 用计算机连接路由器,用路由器怎么连接两台电脑
  6. 数据结构与算法--再谈递归与循环(斐波那契数列)
  7. (三)图像转灰度图Python实现
  8. 网络行业协会责令十大流氓软件整改(继续踩他们一脚)
  9. AppWidget实现机制分析--什么是桌面插件
  10. 用UltraEdit软件替换回车换行的窍门
  11. 信号与系统——四对时域频域对应关系
  12. linux选was清除缓存,Linux清除缓存操作
  13. zepto 事件分析2($.on)
  14. grep 不区分大小写_使用不区分大小写的Grep
  15. win8.1环境下硬盘安装centos6.5双系统
  16. java execute、executeQuery和executeUpdate之间的区别
  17. 数组、数组的定义、对数组的理解
  18. 【FPGA】实战之按键消抖
  19. 理解React框架的Fiber架构
  20. 学习mongo系列(四) find().pretty() remove() 查询

热门文章

  1. python time perf_Python Time 的学习笔记
  2. 高斯投影坐标系为什么是六七八位数
  3. 【转】WPF Expander 收缩不占空间的用法
  4. java中synchronized(同步代码块和同步方法)详解及区别
  5. oracle win10配置命令,记一次Windows 平台下Oracle 10.2.0.5 EM重新配置
  6. 数据结构中“图”的相关概念理解
  7. 【牛客 - 315B】 勇气获得机(二叉树性质,思维,知识点,tricks)
  8. mysql操作json优点和缺点_MySQL与JSON-为什么?
  9. java socket 判断是否断开_Linux Socket:如何在客户端程序中检测断开的网络?
  10. 对计算机的分析,对计算机思维的逻辑分析(范文).doc