操作系统实验报告:生产者――消费者问题算法的实现

2023-05-16

生产者――消费者问题算法的实现


文章目录

  • 生产者――消费者问题算法的实现
  • 实验内容
    • 1.问题描述:
    • 2.功能要求:
  • 背景知识
    • 1.进程管理
    • 2.信号量的有关知识
  • 思路
  • 核心代码
  • 运行结果
  • 结论


实验内容

1.问题描述:

  • 一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消费者从中取得消息。假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将消息送入缓冲池,只要缓冲池未空,消费者可从缓冲池取走一个消息。

2.功能要求:

  • 根据进程同步机制,编写一个解决上述问题的程序,可显示缓冲池状态、放数据、取数据等过程。

在这里插入图片描述


背景知识

1.进程管理

  • 进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。同时,进程也是系统分配资源的最小单位。

  • 资源 :内存、网络、硬盘

  • cpu : 多核cpu,把多个cpu打包捆绑在一起,安装在电脑,每个cpu核心都可以执行进程的代码

2.信号量的有关知识

  • 信号量机制是一种功能较强的机制,可用于解决互斥和同步的问题,它只能被两个标准的原语wait(S)和signal(S)访问,也可以记为“P操作”和“V操作”。

  • 原语:指完成某种功能且不被分割,不被中断执行的操作序列,通常可由硬件来实现。例如TestAndSet和Swap指令就是通过硬件实现的原子操作。原语功能的不被中断执行特性在单处理机上可由屏蔽中断方法来实现。

思路

  • 假定在生产者和消费者之间的公用缓冲池中具有B个缓冲池,这时可利用互斥信号量mutex实现诸进程对缓冲池的互斥作用;利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量。又假定这些生产者和消费者相互等效,只要缓冲池未满,生产者便可将产品送入缓冲池;只要缓冲池未空,消费者便可从缓冲池中取走一个产品。

核心代码

#include <stdio.h>
#include <windows.h>
#include<iostream>
using namespace std;
#define B 6
typedef int semaphore;  //信号量是一种特殊的整型变量 
 semaphore full=0;      // 记录缓冲区中满的槽数
 semaphore buf[B];      // 有B个槽数的缓冲区buf[B],并实现循环缓冲队列 
 semaphore front=0, rear=0;//记录数据所在缓冲区的位置 
 semaphore mutex=1;     // 互斥访问 
 semaphore empty=B;     // 记录缓冲区中空的槽数,最多只能存在6个 
 
void produce_item(int *item_ptr)//生产产品(用数据代替) 
 {
    cout<<"生产一个产品:"; 
    cin>>*item_ptr;
 }
 
void enter_item(int x)//产品进入缓冲区 
 {
    buf[front]=x;
    cout<<"产品"<<buf[front] <<"被放到缓冲区 buf[";
	cout<<front<<"]中"<<endl;
	cout<<endl;
    front=(front+1)%B;
 }
 
void p(semaphore *x)  // p操作 
 {
    *x=(*x)-1;
 }
 
void v(semaphore *y)   // v操作 
 {
    *y=(*y)+1;
 }

void producer()// 生产者 
{
    	int item;
        produce_item(&item);//生产产品 
        p(&empty);          // 递减空槽数 
        p(&mutex);          // 进入临界区 
        enter_item(item);   //将一个新的数据项放入缓冲区
        v(&mutex);          // 离开临界区 
        v(&full); // 递增满槽数 
}
 
void remove_item(int *yy)
{
   	cout<<"从缓冲区 buf[";
	cout<<rear<<"] 取走"<<buf[rear]<<endl;
    *yy=buf[rear];
   	buf[rear]=0;   
    rear=(rear+1)%B;
}

void consume_item(int y)
{
    cout<<"消费者取出的产品为 "<< y<<endl;
    cout<<endl;
}

void consumer()// 消费者 
{
    	int get_item;
        p(&full);           // 递减满槽数 */
        p(&mutex);          // 进入临界区 */
        remove_item(&get_item); // 从缓冲区中取走一个数据项 */
        v(&mutex);          //离开临界区 */
        v(&empty);          // 递增空槽数 */
        consume_item(get_item); //对数据项进行操作(消费)
 }
 

 int main() // 调用生产者-消费者进程实现进程间同步
{
	int a ;
	while(1)
	{
	cout<<"1:生产者使用  2:消费者使用"<<endl; 
	cout<<"请输入1 or 2 "<<endl;
	cin>>a;
	if(a==1)
	{
		if(full<B)//如果缓冲区未满,生产者就可以将产品放入到缓冲区中 
			producer();
		else
		{
			cout<<"缓冲区已满,无法使用,请排队等候,请消费者取走消费\n";
			cout<<endl;
		}
	}
     else if(a==2)
    {
    	if(empty<B)//如果缓冲区未空,消费者就可以将产品取出 
    	consumer();	
    	else
    	{
    		cout<<"缓冲区已空,无法使用,请排队等候,请生产者先放产品到缓冲区\n";
    		cout<<endl;
		}
    	
	}
	}
    return 0;
}

运行结果

请添加图片描述
请添加图片描述


结论

  • 掌握P、V操作及其原理,理解系统如何调度线程,创建线程,初始化线程。
  • 程序可能因阻塞问题而导致输出。理解了生产者与消费者问题模型,掌握解决该问题的算法思想。
  • 掌握正确使用同步机制的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统实验报告:生产者――消费者问题算法的实现 的相关文章

随机推荐

  • Property or method “XXX“ is not defined on the instance but referenced during render.解决方法

    在做Vue项目时 xff0c 有时候会看到这个警告 这里是因为vue检测到了 count 这个属性有被使用 xff0c 但是未定义 xff0c 页面虽然能够显示但是有红色信息总归是不好看的 xff0c 解决方法如下 xff1a 我们只需要在
  • 如何用Idea 创建Spring项目

    如何用IntelliJ Idea创建一个简单的Spring项目呢 xff0c 刚入门的人可能不太懂 xff0c 那我就来简单分享一下吧 第一步 点击新建一个maven项目 xff0c 点击下一步 xff08 不用选择从原型创建 xff09
  • OpenCV初尝试13——图像特征

    13 图像特征 13 1 Harris角点检测 Harris角点检测的思想是通过图像的局部的小窗口观察图像 xff0c 角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化 Harris角点检测的数学原理较为繁琐 xff0c 直接上个链
  • 华为secoclient客户端安装

    下载安装包 xff0c 右键以管理员身份运行 2 安装过程中一律选择同意 是 xff0c 完成后打开软件 点击标注处 3 输入网关地址和端口号 xff0c 选择添加 4 添加完成后确定并点击连接 xff0c 输入用户名 密码 xff0c 记
  • maven配置连接MySQL数据库

    2019年7月9号 问题 xff1a maven项目中连接不上mysql数据库 问题 xff1a maven项目中连接不上mysql数据库 从昨晚调bug一直调到今天上午 xff0c 昨晚发现了是maven项目中mysql数据库连接的问题
  • python学习:最适合初学者的8本Python书籍

    Python是最友好的编程语言之一 xff0c 也因此成为初学者的首选 xff0c 为了帮助你更好更快的上手Python xff0c 并学会使用Python进行编程 xff0c 本文我们为初学者分享了最好的Python书籍 希望能够对你有所
  • 最适合Python入门到大牛必看的7本书籍,一定要收藏!

    Python零基础应该阅读哪些书籍 xff1f 我推荐这三本书 1 Python学习手册 xff08 第4版 xff09 以计算机科学家一样的思维方式来理解Python语言编程 xff0c 实用的学习指南 xff0c 适合没有Python编
  • 前端开发:深入使用proxy代理解决前端跨域问题

    在前端领域里面 xff0c 跨域指的是浏览器允许向服务器发送跨域请求 xff0c 进而克服Ajax只能同源使用的局限性限制 同源策略是一种约定 xff0c 而且是浏览器中最基本也是最核心的安全功能 xff0c 若缺少了该策略 xff0c 浏
  • 手工搭建Servlet实现

    现在作为一个Java程序员 xff0c 我们已经习惯了使用IDE和Web框架进行开发 xff0c IDE帮助我们做了编译 打包的工作 Spring框架则帮助我们实现了Servlet接口 xff0c 并把Servlet容器注册到了Web容器中
  • airflow 文档学习(二) - 概念

    1 核心功能 1 1 DAGs 有向无环图 反映所涉及的task的依赖关系 注 xff1a 搜索dag的时候 xff0c airflow只会关注同事包含 34 DAG 34 和 34 airflow 34 字样的py文件 1 2 scope
  • java使用枚举进行前后端交互,以列表方式返回前端

    在有些情况下 xff0c 有一些下拉选择器的数据项 xff0c 我们采取了枚举的方式返回前端一个列表 xff0c 但是里面的东西多 xff0c 前端不想写死 xff0c 需要提供接口返回 xff0c 如下图类似这种 第一步 xff1a 先创
  • python循环,16段代码入门Python循环语句,值得收藏!

    导读 本文重点讲述for语句和while语句 for语句属于遍历循环 xff0c while语句属于当型循环 除了两个循环语句外 xff0c 还介绍了break continue与pass三个用于控制循环结构中的程序流向的语句 在此基础之上
  • IntelliJ IDEA中Error java: 程序包org.slf4j不存在 解决办法

    前言 问题描述 是我这边重构一个工程的时候新建一个module 希望这个module仅仅做kafka消费的服务 刚刚搭建起来运行发现有异常 Error nbsp java 程序包org slf4j不存在 解决办法 很显然可以想到的就是这个里
  • Linux下的Ubuntu系统下载安装python3.9.0

    在安装python3 9 0之前 xff0c 首先要进行换源 xff0c 这样才能防止下载过慢的情况 我这里换的是阿里云的镜像源 xff0c 在终端输入一下命令 其他镜像源可以查看 xff1a https www myfreax com u
  • 操作系统的基本概念

    操作系统的基本概念 一 操作系统的基本概念1 1概念1 2特征1 2 1 并发1 2 2 共享1 2 2 1 互斥共享方式1 2 2 2 同时访问方式 1 2 3 虚拟1 2 4 异步 1 3 目的和功能1 3 1操作系统作为计算机系统资源
  • Android -No toolchains found in the NDK toolchains folder for ABI with prefix: arm-linux-androideabi

    1 原因分析 xff1a 最新版ndk xff08 version 61 25 1 8937393 xff09 的toolchains文件夹中无arm linux androideabi文件 2 解决方案 xff1a 同时安装低版本的ndk
  • Python中的函数

    一 前言 我们在写Python时 xff0c 经常需要用到函数 xff0c 在此来说一下函数 xff0c 也就是本章要介绍的函数的作用于使用步骤 文章内容有点长 xff0c 请耐心看完哦 xff0c 文末有惊喜 二 Python中函数的作用
  • Spring自学笔记(学完老杜视频后再进行修改)

    Spring 概念 Spring框架是一个储存对象的容器 xff0c 是一个轻量级的开源Java开发框架 xff0c 它的核心是控制反转 xff08 IoC xff09 和面向切面编程 xff08 AOP xff09 xff0c 它由20多
  • 5 个用于自动化的杀手级 Python 脚本

    Python 是一种功能强大的语言 xff0c 广泛用于自动执行各种任务 无论您是开发人员 系统管理员 xff0c 还是只是想通过自动化日常任务来节省时间的人 xff0c Python 都能满足您的需求 这里有 5 个 Python 脚本
  • 操作系统实验报告:生产者――消费者问题算法的实现

    生产者 消费者问题算法的实现 文章目录 生产者 消费者问题算法的实现实验内容1 问题描述 xff1a 2 功能要求 xff1a 背景知识1 xff0e 进程管理2 xff0e 信号量的有关知识 思路核心代码运行结果结论 实验内容 1 问题描