操作系统生产者和消费者问题

生产者-消费者问题是一个经典的进程同步问题,已经属于化石级别的了。

该问题最早由Dijkstra 提出,用以演示他提出的信号量机制。

要求设计在同一个进程地址空间内执行的两个线程。

生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。

消费者线程从缓冲区中获得物品,然后释放缓冲区。

当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。

当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。

要求设计并实现一个进程,该进程拥有一个生产者线程和一个消费者线程,它们使用N个不同的缓冲区(N为一个自定义的确定的数值,例如N=32)。

需要使用如下信号量:
•一个互斥信号量,用以阻止生产者线程和消费者线程同时操作缓冲区列表;
•一个信号量,当生产者线程生产出一个物品时可以用它向消费者线程发出信号;
•一个信号量,消费者线程释放出一个空缓冲区时可以用它向生产者线程发出信号;
看代码吧:
//pv操作:生产者与消费者经典问题
//author:leaf
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include<semaphore.h>
#define M 32 /*缓冲数目*/
#define P(x)sem_wait(&x)
#define V(x)sem_post(&x)
int in = 0;/*生产者放置产品的位置*/
int out = 0;/*消费者取产品的位置*/
int buff[M]={0};/*缓冲初始化为0,开始时没有产品*/
sem_t empty_sem;/*同步信号量,当满了时阻止生产者
放产品*/
sem_t full_sem;/*同步信号量,当没产品时阻止消费者消费*/
pthread_mutex_t mutex;/*互斥信号量,一次只有一个线程访问缓冲*/
/*
*output the buffer
*/
void print()
{
int i;
for(i = 0; i < M; i++)
printf("%d ", buff[i]);
printf("\n");
}
/*
*producer
*/
void*producer()
{
for(;;)
{
sleep(1);
P(empty_sem);
pthread_mutex_lock(&mutex);
in = in % M;
printf("(+)produce a product. buffer:");
buff[in]= 1;
print();
++in;
pthread_mutex_unlock(&mutex);
V(full_sem);
}
}
/*
*consumer
*/
void*consumer()
{
for(;;)
{
sleep(2);
P(full_sem);
pthread_mutex_lock(&mutex);
out = out % M;
printf("(-)consume a product. buffer:");
buff[out]= 0;
print();
++out;
pthread_mutex_unlock(&mutex);
V(empty_sem);
}
}
void sem_mutex_init()
{
/*
*semaphore initialize
*/
int init1 = sem_init(&empty_sem, 0, M);
int init2 = sem_init(&full_sem, 0, 0);
if((init1 != 0)&&(init2 != 0))
{
printf("sem init failed \n");
exit(1);
}
/*
*mutex initialize
*/
int init3 =pthread_mutex_init(&mutex,NULL);
if(init3 != 0)
{
printf("mutex init failed \n");
exit(1);
}
}
int main()
{
pthread_t id1;
pthread_t id2;
int i;
int ret;
sem_mutex_init();
/*create the producer thread*/
ret =pthread_create(&id1,NULL, producer,NULL);
if(ret != 0)
{
printf("producer creation failed \n");
exit(1);
}
/*create the consumer thread*/
ret =pthread_create(&id2,NULL, consumer,NULL);
if(ret != 0)
{
printf("consumer creation failed \n");
exit(1);
}
pthread_join(id1,NULL);
pthread_join(id2,NULL);
exit(0);
}
程序执行结果:
其中1表示已经生产出的产品,1的个数就代表已生产出的产品个数。

合集下载

操作系统生产者与消费者问题实验报告

操作系统生产者与消费者问题实验报告

《操作系统》实验报告生产者和消费者的问题一、实验目的1.掌握基本的同步与互斥的算法,理解基本的生产者与消费者的模型。

2.学习使用Windows 2000/XP中基本的同步对象,掌握相关的API的使用方法。

3.了解Windows 2000/XP中多线程的并发执行机制,线程间的同步和互斥。

二、实验的内容及其要求1.实验内容以生产者/消费者模型为根据,在Windows 2000环境下创建一个控制台进程,在改进程中创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。

2.实验要求①学习并理解生产者/消费者模型及其同步/互斥规则②学习了解Windows同步对象及其特性③熟悉实验环境,掌握相关API的使用方法④设计程序,实现生产者/消费者进程(线程)的同步与互斥⑤提交实验报告三、实验的时间安排1.实验前,先到图书馆或上网百度了解有关生产者/消费者模型的相关知识,建立生产者/消费者模型的基本概念。

2.利用13周、15周、17周的上机时间编写和调试程序代码。

3.利用其他课余时间来分析实验的最终结果并完成相关的实验报告。

四、实验的环境1.硬件条件:普通计算机一台2.软件条件:①操作系统:Windows 2000/XP②开发语言:VC++本实验是在Windows 2000+VC6.0环境下实现的,利用Windows SDK提供的系统接口(API)完成程序的功能。

实验在Windows 下安装VC后进行,因为VC是一个集成开发环境,其中包含了Windows SDK所有工具和定义,所以安装了VC后就不用特意安装SDK了。

实验中所用的API(应用程序接口),是操作系统提供的用来进行应用程序设计的系统功能接口。

要使用这些API,需要包含对这些函数进行说明的SDK头文件,最常见的就是windows.h。

一些特殊的API调用还需要包含其他的头文件。

五、正文1.程序结构图:2.数据结构:(1)用一个整型数组Buffer_Critical来代表缓冲区。

生产者消费者问题实验报告

生产者消费者问题实验报告

操作系统课程设计实验报告实验名称:生产者消费者问题姓名/学号:一、实验目的以生产者和消费者问题为例,学习Linux和Windows下进程通信、同步机制的具体实现方法,主要是信号量和共享内存。

熟悉相关系统API的用法。

二、实验内容使用共享内存和信号量机制来实现多个生产者/消费者进程间的通信和同步。

要求在Linux和Windows下分别实现。

缓冲区大小为3,初始为空。

2个生产者,随机等待一段时间,往缓冲区添加数据,重复6次。

3个消费者,重复4次。

三、实验环境Ubuntu 10.10 , GCC; Windows 7, VC 6.0;四、程序设计与实现1. Linux下:(1) 数据结构:a. 共享内存定义为一个结构,使得其数据成员更清晰且操作变得简单。

b. 共享缓冲区采用循环队列的数据结构,由上面的结构struct buf { int start; int end; int info[BUF_NUM]; }维护。

其中start为队头指针,end为队尾指针,info为数据区域。

(2) 算法:大致由三个模块组成:a.主程序(main):i.创建信号量、共享内存并进行初始化ii.创建生产者、消费者进程,生产者执行pro_fun(),消费者执行con_fun()iii.等待所有子进程的结束iv.删除信号量、共享内存b.生产者进程(pro_fun):i.通过key获得信号量、共享内存的ID,将内存添加到自己的地址空间ii.P(empty),P(mutex),Add(data),V(mutex),V(full)iii.解除和共享内存的关联c.消费者进程(con_fun):i.通过key获得信号量、共享内存的ID,将内存添加到自己的地址空间ii.P(full),P(mutex),Add(data),V(mutex),V(empty)iii.解除和共享内存的关联d.循环队列部分:加入数据:info[end] = value; end = (end + 1) % 3;取出数据:temp = info[start]; info[start] = 0; (start = start + 1)%3; return temp;(3) 程序流程图:a. 主函数:b. 生产者进程:c. 消费者进程和生产者类似4. Windows 下:(1) 数据结构:和Linux大致相同(2) 算法:a. 创建的子进程调用正在执行的文件本身,通过main函数的参数区分主进程和生产者、消费者进程。

操作系统中的经典问题——生产者消费者问题(两种方式实现)

操作系统中的经典问题——生产者消费者问题(两种方式实现)

操作系统中的经典问题——⽣产者消费者问题(两种⽅式实现)操作系统中的经典问题——⽣产者消费者问题(两种⽅式实现)1、问题引⼊:什么是⽣产者消费者问题?⽣产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是⼀个多线程同步问题的经典案例。

该问题描述了共享固定⼤⼩缓冲区的两个线程——即所谓的“⽣产者”和“消费者”——在实际运⾏时会发⽣的问题。

⽣产者的主要作⽤是⽣成⼀定量的数据放到缓冲区中,然后重复此过程。

与此同时,消费者也在缓冲区消耗这些数据。

该问题的关键就是要保证⽣产者不会在缓冲区满时加⼊数据,消费者也不会在缓冲区中空时消耗数据。

.要解决该问题,就必须让⽣产者在缓冲区满时休眠(要么⼲脆就放弃数据),等到下次消费者消耗缓冲区中的数据的时候,⽣产者才能被唤醒,开始往缓冲区添加数据。

同样,也可以让消费者在缓冲区空时进⼊休眠,等到⽣产者往缓冲区添加数据之后,再唤醒消费者。

通常采⽤进程间通信的⽅法解决该问题。

如果解决⽅法不够完善,则容易出现死锁的情况。

出现死锁时,两个线程都会陷⼊休眠,等待对⽅唤醒⾃⼰。

该问题也能被推⼴到多个⽣产者和消费者的情形。

2、问题分析该问题需要注意的⼏点:1. 在缓冲区为空时,消费者不能再进⾏消费2. 在缓冲区为满时,⽣产者不能再进⾏⽣产3. 在⼀个线程进⾏⽣产或消费时,其余线程不能再进⾏⽣产或消费等操作,即保持线程间的同步4. 注意条件变量与互斥锁的顺序由于前两点原因,因此需要保持线程间的同步,即⼀个线程消费(或⽣产)完,其他线程才能进⾏竞争CPU,获得消费(或⽣产)的机会。

对于这⼀点,可以使⽤条件变量进⾏线程间的同步:⽣产者线程在product之前,需要wait直⾄获取⾃⼰所需的信号量之后,才会进⾏product的操作;同样,对于消费者线程,在consume之前需要wait直到没有线程在访问共享区(缓冲区),再进⾏consume的操作,之后再解锁并唤醒其他可⽤阻塞线程。

生产者消费者问题操作系统课程设计

生产者消费者问题操作系统课程设计

目录1 绪论 (1)1.1 实现的功能 (1)1.2 P V 操作 (1)2 生产者——消费者问题。

(2)2.1 要求 (2)2.2 生产者和消费者两个进程的程序 (2)2.3进程控制块PCB。

(3)2.4处理器的模拟。

(3)2.5程序设计 (3)3设计步骤 (4)3.1课程分析 (5)3.1.2 流程图 (5)3.1.3 测试程序 (7)3.1.4测试结果分析 (12)5 结论 (12)参考文献 (13)1 绪论生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。

模拟实现用同步机构避免发生进程执行时可能出现的与时间有关的错误。

进程是程序在一个数据集合上运行的过程,进程是并发执行的,也即系统中的多个进程轮流地占用处理器运行。

我们把若干个进程都能进行访问和修改的那些变量称为公共变量。

由于进程是并发地执行的,所以,如果对进程访问公共变量不加限制,那么就会产生“与时间有关”的错误,即进程执行后所得到的结果与访问公共变量的时间有关。

为了防止这类错误,系统必须要用同步机构来控制进程对公共变量的访问。

一般说,同步机构是由若干条原语——同步原语——所组成。

本实习要求学生模拟PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用。

1.1 实现的功能生产者-消费者问题是一个经典的进程同步问题,有m个生产者和n个消费者,它们共享可存放k件产品的缓冲区。

生产者进程生产物品,然后将物品放置在一个空缓冲区中,供消费者进程消费。

消费者进程从缓冲区中获得物品,然后释放缓冲区。

当生产者进程生产物品时,如果没有空缓冲区可用,那么生产者进程必须等待消费者线程释放出一个空缓冲区。

当消费者进程消费物品时,如果没有满的缓冲区,那么消费者进程将被阻塞,直到新的物品被生产出来。

1.2 P V 操作(1) PV操作同步机构,由P操作原语和V操作原语组成,它们的定义如下:P操作原语P (s):将信号量s减去1,若结果小于0,则执行原语的进程被置成等待信号量s的状态。

操作系统——生产者和消费者

操作系统——生产者和消费者

操作系统——生产者和消费者之我知陈双周西安工程大学临潼校区摘要:把进程引入到操作系统之后,操作系统的性能得到了很大的提高,一个操作系统之内可以同时存在几个进程,彼此独立,各自完成自己的工作,按自己的方式工作,并且同时分享这系统的资源,大大克服了人与机器之间的矛盾;但同时也引入了进程之间的同步和互斥问题,解决好进程的同步和互斥将会为我们使用计算机带来很大的方便。

生产者和消费者问题——操作系统中同步、互斥问题的经典,全面深入和透彻的理解这个问题会给我们带来很大的启发!关键词:进程同步、进程互斥,生产者消费者问题,PV操作,信号量一、引言:操作系统是连接硬件和软件的系统软件,对于人们更好的使用计算机有很大的帮助,真正的解决好操作系统中的问题,会为人类带来很大的贡献。

而进程同步和互斥问题是操作系统中的重点内容和主要问题,生产者消费者问题是进程同步和互斥中的经典问题,是抽象问题的实例化,真正的解决消费者和生产者之间的问题会为我们学习操作系统带来很大的帮助和启发。

二、生产者消费者问题所牵涉的概念:进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源非配和调度的一个独立单位。

进程同步:进程之间的一种直接的协同工作关系,是一些进程相互合作,共同完成一项任务。

进程互斥:系统中,许多进程常常要共享资源,而这些资源往往要求排他性的使用,因此,各进程之间互斥使用这些资源。

临界区:系统中一些资源一次只允许一个进程使用,这类资源称为临界资源或共享变量;在进程中访问临界资源的那一段程序称为临界区。

信号量:把互斥的关键含义抽象成信号量,用于解决同步互斥问题。

PV操作:p操作是申请一个资源,减1操作;v操作是释放一个资源,加1操作。

三、见解——生产者消费者问题问题描述:生产者P生产产品,一次可放一个产品;消费者Q取产品,一次可取一个产品。

1.一个生产者,一个消费者,一个缓冲区同步问题:P进程不能往满的缓冲区放产品,设置信号量empty,初值为0,用于指示空缓冲区数目。

操作系统_生产者与消费者问题的实现

操作系统_生产者与消费者问题的实现
shm_unlink("/shm"); /*删除共享内存区,程序中基本上保证了子进程先退出,因此父进程中无wait操作且这部操作放在父进程这里*/
//shmctl(shmid,IPC_RMID,&buf);
//del_sem(semid);
return 0;
}
/*生产者写5次后退出*/
void producer(key_t keyFull, key_t keyEmpty)
empty Write P1 : 2
empty Write P2 : 4
in = 0
Write : 5
full Write V1 : 0
full Write V2 : 0
full Read P2 : 0
out = 0
Read : 5
empty Read V1 : 4
empty Read V2 : 5
Write : 7
full Write V1 : 0
full Write V2 : 0
full Read P2 : 0
out = 2
Read : 7
empty Read V1 : 4
empty Read V2 : 5
Read Finish
p(empty); /*是否有空缓冲区,有则占有,无则被挂起,是原子操作*/
printf("empty Write P2 : %d\n", semctl(empty, 0, GETVAL, 0));
value_write++;
in = in++;
pData[in] = value_write;
in = in % 5;
printf("full Write V2 : %d\n", semctl(full, 0, GETVAL, 0));

现代操作系统课程设计报告 生产者与消费问题

进程同步模拟设计——生产者和消费者问题第一章课设任务本课程设计的任务在于,通过编写一个具体的有关操作系统进程同步互斥的经典问题,加强对操作系统实现进程间同步与互斥的机制的理解。

同时培养提出问题、发现知识、使用工具、解决问题的能力。

具体地,我们要编制出一个程序,利用PV原语以及进程创建、同步、互斥、销毁等相关的系统调用来模拟“生产者—消费者”问题。

第二章背景介绍2.1 “生产者—消费者”问题(the producer-consumer problem)生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区。

其中一个是生产者,用于将消息放入缓冲区;另外一个是消费者,用于从缓冲区中取出消息。

问题出现在当缓冲区已经满了,而此时生产者还想向其中放入一个新的数据项的情形,其解决方法是让生产者此时进行休眠,等待消费者从缓冲区中取走了一个或者多个数据后再去唤醒它。

同样地,当缓冲区已经空了,而消费者还想去取消息,此时也可以让消费者进行休眠,等待生产者放入一个或者多个数据时再唤醒它。

问题分析:该问题涉及到操作系统进程管理当中的两个重要概念——同步和互斥。

同步,表现在生产者和消费者需要协同工作,步调不能拉开太大(由缓冲区大小n决定,n越大,缓冲空间越大,步调可以拉得越开;n=1时,必须是生产一个,消费一个,生产者和消费者就完全同步了)。

当步调差距超过极限时,走在前面的当前进程(生产者)调用P 原语时由于资源耗尽,被阻塞;步调靠后的继续向前推进。

由此实现同步。

互斥,表现在生产者与消费者、生产者与生产者、消费者与消费者任何两个成员之间必须互斥地使用缓冲区。

当有一个成员进入缓冲区存/取产品时,其他成员将被关在门外排队等候(被阻塞);当完毕时,通知队首成员进入。

由操作系统理论可知,我们需要三个信号量,分别命名full, empty, mutex,来分别代表消费者的可用资源数、生产者的可用资源数、缓冲区是否可用。

操作系统生产者消费者问题实验报告

操作系统生产者消费者问题实验报告实验名称:一、生产者-消费者问题的多线程解决方案二、设计一个执行矩阵乘法的多线程程序日期:20XX-10-22 班级:13级计科学号:姓名:一、实验目的1.掌握线程的同步与互斥2.掌握生产者消费者的实现问题3.掌握多线程的编程方法4.掌握矩阵乘法的基本计算原理以及实现二、实验内容1.生产者-消费者问题的多线程解决方案2.设计一个执行矩阵乘法的多线程程序三、项目要求与分析1.请查阅资料,掌握线程创建的相关知识以及矩阵乘法的相关知识,了解java语言程序编写的相关知识2.理解线程的实验步骤在本次试验中,以“生产者-消费者”模型为依据,提供了一个多线程的“生产者-消费者”实例,编写java代码调试运行结果,得出相应的结论。

理解矩阵乘法的实验步骤四、具体实现1.生产者-消费者实例(1)创建一个缓冲信息发送接收通道接口,并创建邮箱盒子类实现,主要代码如下://通道接口public interface Channel{public abstract void send(Object item);public abstract Object receive();}//实现接口public class MessageQueue implements Channel{private Vector queue;public MessageQueue(){queue=new Vector();}public void send(Object item){queue.addElement(ite m);}public Object receive(){if(queue.size()==0)return null;elsereturn queue.remove(0);}}(2)创建一个工厂多线程类(启动生产者和消费者),并且添加main 函数进行测试,主要代码如下://工厂类与主方法public class Factory{public Factory(){Channel mailBox=new MessageQueue();Thread producerThread=new Thread(new Producer(mailBox));Thread consumerThread=new Thread(new Consumer(mailBox));producerThread.start();consumerThread.start();}public static void main(String[] args){Factory server=new Factory();}(3)创建一个线程睡眠类,用于测试,主要代码如下:public class SleepUtilities{public static void nap(){nap(NAP_TIME);}public static void nap(int duration){int sleeptime = (int)(NAP_TIME * Math.random());try{ Thread.sleep(sleeptime*1000); }catch (InterruptedException e) {}}private static final int NAP_TIME = 5;(4)创建生产者类实现Runnable,主要代码如下:public class Producer implements Runnable{private Channel mbox;public Producer(Channel mbox){this.mbox=mbox;}public void run(){Date message;while(true){SleepUtilities.nap();message=new Date();System.out.println("Producer produced "+message);mbox.send(message);}}}(5)创建消费者类实现Runnable,主要代码如下:public class Consumer implements Runnable{private Channel mbox;public Consumer(Channel mbox){this.mbox=mbox;}public void run(){Date message;while(true){SleepUtilities.nap();message=(Date)mbox.receive();if(message!=null)System.out.println("Consumer consumed "+message);}}}(6)调试程序,运行结果:2.矩阵乘法实例(1)初始化矩阵(便于观察,这里使用随机数生成矩阵),主要初始化代码如下matrix1 = new int[m][k];matrix2 = new int[k][n];matrix3 = new int[m][n];//随机初始化矩阵a,bfillRandom(matrix1);fillRandom(matrix2);static void fillRandom(int[][] x){for (int i=0; i<x.length; i++){for(int j=0; j<x[i].length; j++){//每个元素设置为0到99的随机自然数x[i][j] = (int) (Math.random() * 100);}}}(2)打印输出矩阵函数,主要代码如下:static void printMatrix(int[][] x){for (int i=0; i<x.length; i++){for(int j=0; j<x[i].length; j++) {System.out.print(x[i][j]+" ");}System.out.println("");}System.out.println("");}(3)创建多线程类,并实现Runnable接口同步对矩阵进行分行计算,主要代码如下://创建线程,数量 <= 4for(int i=0; i<4; i++){if(index < m){Thread t = new Thread(new MyThread());t.start();}else{break;}synchronized static int getTask(){if(index < m){return index++;}return -1;}}class MyThread implements Runnable{int task;//@Overridepublic void run(){MultiThreadMatrix.threadCount++;while( (task= MultiThreadMatrix.getTask()) != -1 ){System.out.println("进程:"+Thread.currentThread().getName()+"\t开始计算第"+(task+1)+"行");for(int i=0; i<MultiThreadMatrix.n; i++){for(int j=0; j<MultiThreadMatrix.k;j++){MultiThreadMatrix.matrix3[task][i] += MultiThreadMatrix.matrix1[task][j] *MultiThreadMatrix.matrix2[j][i];}}}MultiThreadMatrix.threadCount--;}(4)通过不断改变矩阵大小,线程数目,,调试程序,运行结果:五、所遇问题与解决方法1.在生产者-消费者多线程试验中,刚开始没有考虑到使用线程睡眠,运行结果速度之快,没法观看数据变化,后面定义了睡眠控制,使得问题得以解决2.在多线程矩阵开发实验中,刚开始定义矩阵太小,测试结果不太明显,后面通过把矩阵改大,并且线程数目不断变化使得结果明显。

操作系统生产者和消费者问题

生产者-消费者问题是一个经典的进程同步问题,已经属于化石级别的了。

该问题最早由Dijkstra 提出,用以演示他提出的信号量机制。

要求设计在同一个进程地址空间内执行的两个线程。

生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。

消费者线程从缓冲区中获得物品,然后释放缓冲区。

当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。

当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。

要求设计并实现一个进程,该进程拥有一个生产者线程和一个消费者线程,它们使用N个不同的缓冲区(N为一个自定义的确定的数值,例如N=32)。

需要使用如下信号量:•一个互斥信号量,用以阻止生产者线程和消费者线程同时操作缓冲区列表;•一个信号量,当生产者线程生产出一个物品时可以用它向消费者线程发出信号;•一个信号量,消费者线程释放出一个空缓冲区时可以用它向生产者线程发出信号;看代码吧://pv操作:生产者与消费者经典问题//author:leaf#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<pthread.h>#include<semaphore.h>#define M 32 /*缓冲数目*/#define P(x)sem_wait(&x)#define V(x)sem_post(&x)int in = 0;/*生产者放置产品的位置*/int out = 0;/*消费者取产品的位置*/int buff[M]={0};/*缓冲初始化为0,开始时没有产品*/sem_t empty_sem;/*同步信号量,当满了时阻止生产者放产品*/sem_t full_sem;/*同步信号量,当没产品时阻止消费者消费*/pthread_mutex_t mutex;/*互斥信号量,一次只有一个线程访问缓冲*//**output the buffer*/void print(){int i;for(i = 0; i < M; i++)printf("%d ", buff[i]);printf("\n");}/**producer*/void*producer(){for(;;){sleep(1);P(empty_sem);pthread_mutex_lock(&mutex);in = in % M;printf("(+)produce a product. buffer:");buff[in]= 1;print();++in;pthread_mutex_unlock(&mutex);V(full_sem);}}/**consumer*/void*consumer(){for(;;){sleep(2);P(full_sem);pthread_mutex_lock(&mutex);out = out % M;printf("(-)consume a product. buffer:");buff[out]= 0;print();++out;pthread_mutex_unlock(&mutex);V(empty_sem);}}void sem_mutex_init(){/**semaphore initialize*/int init1 = sem_init(&empty_sem, 0, M);int init2 = sem_init(&full_sem, 0, 0);if((init1 != 0)&&(init2 != 0)){printf("sem init failed \n");exit(1);}/**mutex initialize*/int init3 =pthread_mutex_init(&mutex,NULL);if(init3 != 0){printf("mutex init failed \n");exit(1);}}int main(){pthread_t id1;pthread_t id2;int i;int ret;sem_mutex_init();/*create the producer thread*/ret =pthread_create(&id1,NULL, producer,NULL);if(ret != 0){printf("producer creation failed \n");exit(1);}/*create the consumer thread*/ret =pthread_create(&id2,NULL, consumer,NULL);if(ret != 0){printf("consumer creation failed \n");exit(1);}pthread_join(id1,NULL);pthread_join(id2,NULL);exit(0);}程序执行结果:其中1表示已经生产出的产品,1的个数就代表已生产出的产品个数。

操作系统实验报告三大问题之生产者与消费者问题

操作系统实验报告三大问题之生产者与消费者问题操作系统实验报告三大问题之生产者与消费者问题文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]计算机操作系统实验报告题目三大经典问题之生产者与消费者问题一、课程设计的性质与任务1、加深对并发协作进程同步与互斥概念的理解。

通过编写程序实现进程同步和互斥,使学生掌握有关进程(线程)同步与互斥的原理,以及解决进程(线程)同步和互斥的算法,从而进一步巩固进程(线程)同步和互斥等有关的内容。

2、掌握进程和线程的概念,进程(线程)的控制原语或系统调用的使用。

3、了解Windows2000/XP中多线程的并发执行机制,线程间的同步和互斥。

学习使用Windows2000/XP中基本的同步对象,掌握相应的API函数。

4、培养学生能够独立进行知识综合,独立开发较大程序的能力。

5、培养提高学生软件开发能力和软件的调试技术。

6、培养学生开发大型程序的方法和相互合作的精神。

7、培养学生的创新意识。

8、培养学生的算法设计和算法分析能力。

9、培养学生对问题进行文字论述和文字表达的能力。

二、课程设计的内容及其要求在WindowsXP、Windows2000等操作系统下,使用的VC、VB、Java或C等编程语言,采用进程(线程)同步和互斥的技术编写程序实现生产者消费者问题或哲学家进餐问题或读者-写者问题或自己设计一个简单进程(线程)同步和互斥的实际问题。

要求:(1)经调试后程序能够正常运行。

(2)采用多进程或多线程方式运行,体现了进程(线程)同步互斥的关系。

(3)程序界面美观。

三、实验原理本实验要求利用PV操作实现解决生产者——消费者问题中的同步问题。

此问题描述的是一群生产者进程在生产产品并将这些产品提供给消费者进程去消费,在两者之间设置了一个具有n 个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区,消费者进程可从缓冲区中取走产品去消费,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满且尚未取出的缓冲区中投放产品,并且生产者消费者互斥使用缓冲区。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档