实验四生产者和消费者

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验四生产者和消费者相关的知识,希望对你有一定的参考价值。

实验四生产者和消费者

一、实验目的

1.掌握临界区的概念及临界区的设计原则;

2.掌握信号量的概念、PV操作的含义以及应用PV操作实现进程的同步与互斥;

3.分析进程争用资源的现象,学习解决进程互斥的方法。

二、实验内容和要求

分析进程的同步与互斥现象,编程实现经典的进程同步问题——生产者消费者问题的模拟

  1. 生产者--消费者问题表述:

有一环形缓冲池,包含n个缓冲区(0~n-1)。

有两类进程:一组生产者进程和一组消费者进程,生产者进程向空的缓冲区中放产品,消费者进程从满的缓冲区中取走产品。

所有进程必须对缓冲区进行互斥的访问。

生产者不能向满缓冲区写数据,消费者不能从空缓冲区取数据,即生产者与消费者必须同步。

计算机系统中对资源的分配与释放过程:计算机系统中的每个进程都可以消费或生产某类资源。当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。而当某个进程释放资源时,则它就相当一个生产者。

  1. 定义生产者消费者问题中的各数据结构,并初始化。信号量,初值。
  2. 编写PV操作。
  3. 编写生产者与消费者程序,利用信号量及其PV操作,实现生产者与消费者之间的同步与互斥。
  4. 模拟显示生产者与消费者同步与互斥的效果。

三、实验方法、步骤及结果测试

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

#include<time.h>

#define N 100

 

typedef struct process

{

       int num;

}P;

P a[N];

int wordtime=0;

void main(){

int i=0,j,run=1,n,p=0,v=0,num;

printf("输入缓冲区大小\\n");

scanf("%d",&n);

while(run==1)

{

srand(time(NULL));

j=rand()%2+1;

if(1==j)

{

       if(i<5&&p==0&&v==0)

       {

              p++;

              v++;

              i++;

       printf("生产\\n");

       p--;

              v--;

       }

else{

printf("仓库已满无法生产\\n");

}     

}

else

{

if(i>0&&p==0&&v==0)

{

              p++;

              v++;

       i--;

       printf("消费\\n");

              p--;

              v--;

}

else{

printf("无货物无法消费\\n");

}     

}

printf("是否继续||1.是 2.否\\n");

scanf("%d",&run);

}

}

 

测试结果:

技术分享

 

 

四、实验总结

在这次实验过程中学习到了许多东西,并且成功完成了实验要求。

以上是关于实验四生产者和消费者的主要内容,如果未能解决你的问题,请参考以下文章

操作系统实验 生产者/消费者模型

JAVA模拟生产者与消费者实例

Kafka 简单实验二(Python实现简单生产者消费者)

Linux多线程_(Posix信号量实现环形队列生产者消费者模型)

Linux多线程_(线程同步,基于阻塞队列的生产者消费者模型)

实验四