为了这个实验二,资料查了巨多,pv操作什么的好不容易弄明白了,但是感觉老师要求的好像用不到这个。

大部分都是某位同学的成果哈哈哈。

自己总结了一下:

1.队列和链表在c++中是可以直接用已经有的模板的。

2.学会用指针进行遍历。

3.消费者要是能放到buffer里就看生产者等待队列里有没有人,有人就唤醒一个生产者。

4.要是buffer只有1那么大,最终完成链表中必定是生产者和消费者交替,这是一个验证程序对错的方法。

#include<iostream>
#include<queue>
#include<list>
#include<cstdlib>
#include<ctime>using namespace std;
typedef struct
{int type;//进程类型标号 0 生产者 1位消费者int ID;//进程系统号  1-10int state;//进程状态 0就绪 1等待 2完成char product;//进程产品 字符}PCB;int buffersize = 2;//缓冲区大小
queue<PCB>ready;
queue<PCB>producerwait;//生产者等待队列
queue<PCB>consumerwait;//消费者等待队列
list<PCB>over;//收集已经运行结束的进程
int buffercount = 0;
int buffer[3];
void Producer(PCB &p)
{if (buffercount < 2){buffercount++;buffer[buffercount] = p.ID;if (!consumerwait.empty()){PCB temp;temp = consumerwait.front();temp.state = 0;ready.push(temp);consumerwait.pop();}over.push_back(p);p.state = 2;}else{p.state = 1;producerwait.push(p);}}void Consumer(PCB &p)
{if (buffercount != 0){buffer[buffercount] = NULL;buffercount--;over.push_back(p);if (!producerwait.empty()){PCB temp;temp = producerwait.front();temp.state = 0;ready.push(temp);producerwait.pop();}p.state = 2;}else{p.state = 1;consumerwait.push(p);}
}int main()
{PCB p[10];for (int i = 0; i < 10; i++)//对模块进行初始化{p[i].type = rand() % 2;p[i].ID = i + 1;p[i].state = 0;p[i].product = 'a'+i;ready.push(p[i]);}while (!ready.empty()){PCB t;t = ready.front();ready.pop();if (t.type == 0)//如果是生产者{Producer(t);}else{Consumer(t);}cout << "****************就绪队列:****************" << endl;queue<PCB>_ready;_ready = ready;while (!_ready.empty()){PCB te = _ready.front();cout <<"进程类型标号: "<< te.type<<" 进程系统号:  "<<te.ID<<" 进程状态: "<<te.state<<" 进程产品: "<<te.product<<" " << endl;_ready.pop();}cout << "****************完成链表:****************" << endl;std::list<PCB>::iterator iter;std::list<PCB>::iterator start = over.begin();for(iter=over.begin();iter!=over.end();iter++){PCB p = *iter;cout << "进程类型标号: " << p.type << " 进程系统号:  " << p.ID << " 进程状态: " << p.state << " 进程产品: " << p.product << " " << endl;}cout << "****************生产者等待队列:****************" << endl;queue<PCB>_producerwait;_producerwait = producerwait;while (!_producerwait.empty()){PCB te = _producerwait.front();cout << "进程类型标号: " << te.type << " 进程系统号:  " << te.ID << " 进程状态: " << te.state << " 进程产品: " << te.product << " " << endl;_producerwait.pop();}cout << "****************消费者等待队列:****************" << endl;queue<PCB>_consumerwait;_consumerwait = consumerwait;while (!_consumerwait.empty()){PCB te = _consumerwait.front();cout << "进程类型标号: " << te.type << " 进程系统号:  " << te.ID << " 进程状态: " << te.state << " 进程产品: " << te.product << " " << endl;_consumerwait.pop();}cout << endl;cout << endl;}system("pause");return 0;
}

最终结果图

自己画的自己理解的流程图

ps前一段时间学校oj竟更新了,原以为储存在学校网站和安全啊,我的数据结构代码啊,伤心,看来一定要多备份!

操作系统实验二总结(生产者消费者问题)相关推荐

  1. 作业必备:操作系统实验六【生产者消费者实验:用信号量实现PV操作】

  2. 操作系统实验二:物理内存管理系统

    操作系统实验二:物理内存管理系统 一. 实验目的 二. 实验内容 三. 实验准备 [实验概述] [关键数据结构] [执行流程] 四. 实验步骤 (一) 练习0:填写已有实验 (二) 练习1:实现 fi ...

  3. 广州大学2020操作系统实验二:银行家算法

    相关资料 广州大学2020操作系统实验一:进程管理与进程通信 广州大学2020操作系统实验二:银行家算法 广州大学2020操作系统实验三:内存管理 广州大学2020操作系统实验四:文件系统 广州大学2 ...

  4. 操作系统实验二·生产者消费者问题

    生产者消费者问题 1实验目的 2实验内容 3实验环境 3.1Windows 3.2Linux虚拟机 4程序设计和实现 4.1Windows实现 4.1.1函数解释 4.1.2程序代码 4.1.3运行结 ...

  5. 2020 操作系统 实验二 进程通信

    实验二.进程通信 一.实验名称 进程通信 二.实验目的 掌握用邮箱方式进行进程通信的方法,并通过设计实现简单邮箱理解进程通信中的同步问题以及解决该问题的方法. 三.实验原理 邮箱机制类似于日常使用的信 ...

  6. 南京邮电大学操作系统实验二:线程的互斥与同步

    实验原理及内容 基于互斥锁的临界区管理 使用编辑器gedit 2_1.c,新建一个2_1.c源文件,创建双线程并发完成订票操作,输入后面的范例代码: #include <stdio.h> ...

  7. 操作系统实验二(调度算法模拟-先进先出-时间片轮转法-优先服务调度算法)

    实验二 进程调度 一.     实验目的 1.       理解进程运行的并发性. 2.       理解处理器的三级调度. 3.       掌握先来先服务的进程调度算法. 4.       掌握短 ...

  8. 【操作系统】Semaphore处理生产者-消费者问题

    "生产者-消费者"问题 问题描述 问题分析 关系分析 求解思路 信号量设置 问题解决 复杂情况的求解示例 问题描述 一组生产者进程和一组消费者进程共享一个初始为空.大小为n的缓冲区 ...

  9. Java(二十二) -- 生产者消费者模式

    目录 生产者消费者模式 汉堡类 容器类 生产者 消费者 测试类 案例:多线程并发卖票 生产者消费者模式 在一个生产环境中,生产者和消费者在同一时间段内共享同一块缓冲区,生产者负责向缓冲区添加数据,消费 ...

最新文章

  1. CF1081G Mergesort Strikes Back
  2. Java Web 开发必须掌握的三个技术:Token、Cookie、Session
  3. Response_案例3_输出字节数据
  4. 解决StreamReader读取中文出现乱码的问题
  5. QT - Could not load the Qt platform plugin xcb in even though it was found.
  6. 封装 Vue.js 组件库
  7. 为什么学习Python数据分析,python数据分析有什么用?
  8. ups容量计算和配置方法_山埔UPS电源后备时间计算方法
  9. 数据结构 10分钟让你掌握经典排序(二)
  10. Apache-ab 接口性能测试
  11. Teamcenter 2007 之 Part 物件关联
  12. CTA策略05_AtrRsiStrategy
  13. 计算机地图制图符号制作的心得,计算机地图制图原理与方法——地图符号设计参考文档...
  14. Python PyQt5l表单应用 - 自定义选择下拉框样式
  15. 如何在excel中单独冻结多行或多列
  16. bmp怎么改jpg格式?
  17. Python: 鲁卡斯队列
  18. PHP+MySQL实现留言板功能(一)
  19. 一篇博客学会了坦克大战
  20. arttemplate入门

热门文章

  1. 创业公司想获取采访,找这四家科技媒体就够了
  2. J1939 DM1多包广播报文发送
  3. 此电脑右键管理提示windows找不到文件的解决方法
  4. 7月末出去玩啦,给大家分享一个青岛攻略吧~
  5. SQL中UPDATE 语句
  6. 通用三合一mysql_MySQL企业版线上专场 | 三合一精华版
  7. FFmpeg最常用命令参数详解及应用实例
  8. 东华软件青年学者丨唐卓:在“大数据+云计算”世界里探索产学研的路径
  9. TOPVIEW数据感想
  10. 转|地理数据下载的网站汇总 全国地研联 测绘学报 2018-12-05