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

同步互斥小口诀

  • 画图理解题目
  • 判断题目类型
  • 分析进程数目 填写进程模板
  • 补充基本代码(伪代码)
  • 补充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);}}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Glide图片加载框架(二)源码解析之load()

文章目录一、前言二、源码分析1、load()Android Glide图片加载框架系列文章 Android Glide图片加载框架&#xff08;一&#xff09;基本用法 Android Glide图片加载框架&#xff08;二&#xff09;源码解析之with() Android Glide图片加载框架&#xff08;二&#xff09;源码…

codeforces 231A-C语言解题报告

231A题目网址 题目解析 1.输入比赛的题目,每一道题3个人的解题状况(0或1),输出总的解答题目(每一个题至少有2个,记1次) 2.在for循环中去录入每道题的解答状况 3.因为有题目解答的计算,所以直接用原始的解答状况去计算 if(result[0]result[1]result[2]3) { count; } 知识点 …

英语一段落排序题技巧

总述 1.做此题不用通篇理解,找第一句和最后一句,理清楚里面的逻辑即可 首段 1.使用特殊疑问句提出问题,符合首段特点 连贯词 1.in one case…in another case 两个段落连在一起 2.some…others 隐式:most sites等同于others 逻辑 1.总分关系 调查–地面调查

计算机操作系统读者和写者模型的简单介绍以及思考

读者和写者 读写两组进程&#xff0c;共享一个文件&#xff0c;多个读者可以同时访问文件&#xff0c;多个写者不可以同时访问文件&#xff0c;写者和读者也不可以同时访问文件共享读&#xff1b;独占写特征:1,资源被谁占有&#xff1b;2&#xff0c;写者改变资源&#xff0c;…

Android Glide图片加载框架(二)源码解析之into()

文章目录一、前言二、源码解析1、into(ImageView)2、GlideContext.buildImageViewTarget()3、RequestBuilder.into(Target,RequestListener,RequestOptions);4、RequestBuilder.buildRequest()5、SingleRequest.obtain()6、isEquivalentTo()、isSkipMemoryCacheWithCompletePre…

codeforces 158A-C语言解题报告

158A题目网址 题目解析 1.输入n个选手,和第k个参考选手 再输入每一个选手的比赛成绩 2.输出比赛成绩>第k个选手的入选人数 3.n,k都是从1开始计算的 4.因为要比较所有的选手与第k个选手,所以使用数组,而且要使用两个循环(第一个输入数据,第二个比较成绩) 5.不要忘记scanf都…

通过字符串的方式读取文件的内容

代码 std::ifstream file("1.txt");std::stringstream data;data << file.rdbuf();printf(data.str().c_str());file.close(); 头文件 #include <cstdio> #include <cstdlib> #include <fstream> #include <sstream>

2014年考研英语一翻译知识点

题目讲解网址 总结 1.做翻译题,不用看句子前后的地方,直接看要翻译的部分 2.多根据语境去翻译 3.如果是不认识的单词,一般都是我们平常经常使用/说的词的代替高级词 题目句子 It is also the reason why when we try to describe music with words, all wecan do is articul…

Android Glide图片加载框架(三)缓存机制

文章目录一、缓存简介二、缓存用法内存缓存方式磁盘缓存方式三、缓存KEY四、内存缓存内存缓存流程五、磁盘缓存磁盘缓存流程Android Glide图片加载框架系列文章 Android Glide图片加载框架&#xff08;一&#xff09;基本用法 Android Glide图片加载框架&#xff08;二&#…

计算机操作系统 死锁问题

概念 条件是基础&#xff0c;在一定的原因下&#xff0c;产生结果死锁三胞胎 死锁 僵持&#xff0c;消耗时间&#xff0c;双方都占用了部分资源&#xff0c;不释放活锁 双方互相谦让&#xff0c;都不占用资源饥饿 谦让的一方一直等待&#xff0c;无法占有资源&#xff0c;导致…

C++ 力扣剑指Offer16-数值的整数次方

题目详情 /* * 实现函数double Power(double base, int exponent)&#xff0c; * 求base的exponent次方。不得使用库函数&#xff0c;同时不需要考虑大数问题。示例 1: 输入: 2.00000, 10 输出: 1024.00000示例 2: 输入: 2.10000, 3 输出: 9.26100 * 示例 3: 输入: 2.00000, -…

Android Glide图片加载框架(四)回调与监听

文章目录Android Glide图片加载框架系列文章 Android Glide图片加载框架&#xff08;一&#xff09;基本用法 Android Glide图片加载框架&#xff08;二&#xff09;源码解析之with() Android Glide图片加载框架&#xff08;二&#xff09;源码解析之load() Android Glide图…

算法章节 数组、链表、栈、队列

数组 概念与特性 1&#xff0c;数组是线性表&#xff0c;用一组连续的内存空间存储⼀组具有相同类型的数据 2&#xff0c;最大的特性是⽀持按照下标O(1)时间复杂度内快速访问数组元素 3&#xff0c;⼀维数组寻址公式&#xff1a;a[i]_addr base_addr i * data_type_size 操作…

武忠祥.高等数学.基础课-第一章函数 极限 连续P10

sin(1/x) 详细解析网址 1.图像 2.极限 x–>0时,函数极限不存在 sin2x 详细作图网址 1.图像 2.周期为Π f(x)周期为T,f(axb)周期为T/|a| 所以sinx周期为2Π,sin2x周期为2Π/2Π |sinx| 详细讲解网址 1.图像 2.周期:Π 3.绝对值 &#xff08;1&#xff09;y|sinx|的图…

Java命令:jstat — 查看JVM的GC信息

文章目录一、简介二、常用命令1、jstat -class pid : class loader行为统计2、jstat -compiler pid : JIT编译器行为统计3、jstat -gc pid 5000 20 : 垃圾回收堆行为统计4、jstat -gccapacity pid 5000 20 : 堆内存统计5、jstat -gcutil pid 5000 20 : 总结垃圾回收统计6、jsta…

算法章节 递归、排序、⼆分查找

递归 概念与特性函数调⽤函数⾃身的编程⽅式叫做递归&#xff0c;调⽤为”递“&#xff0c;返回为”归“三个条件1. ⼀个问题的解可以分解为多个⼦问题的解&#xff1b; 2. 分解之后的⼦问题&#xff0c;除了数据规模不同&#xff0c;求解思路跟原问题相同&#xff1b; 3. 存在…

codeforces 50A-C语言解题报告

50A题目网址 解题报告-others 题目解析 1.输入n x m大小的木板,使用21大小的多米诺去填满,求最多的多米诺数目 2.通过分析把木板分为奇数和偶数的情况 1)有一边是偶数的情况: 使用2去填满 2)两个边都是奇数 奇数-1偶数 还是让木板的(奇数-1)边去和2平行,再加上 (m-1)/2(n/1)…

Java命令:jps — 查看进程信息

文章目录一、简介二、常用命令1、jps2、jps -l3、jps -q4、jps -m5、jps -v6、jps失效一、简介 JVM Process Status Tool&#xff0c;显示指定系统内所有的HotSpot虚拟机进程。 功能&#xff1a; 显示当前所有java进程pid的命令&#xff0c;我们可以通过这个命令来查看到底启…

操作系统概述 记录操作系统相关知识

操作系统 现代计算机系统由一个或多个处理器、主存、打印机、键盘、鼠标、显示器、网络接口以及各种输入/输出设备构成。上面提到的这些东西都属于硬件资源&#xff0c;用户不会直接和硬件进行交互&#xff0c;计算机安装了一层软件&#xff0c;这层软件能够通过响应用户输入的…

2014年英语一作文partA

作文讲解网址 题目 Write a letter of about 100 words to the president of your university, suggesting how to improve students’ physical condition. You should include the details you think necessary. You should write neatly on the ANSWER SHEET. Do not sign…