生产者消费者问题设计与实现

生产者消费者问题设计与实现
生产者消费者问题设计与实现

操作系统课程设计任务书

学院计算机与信息工程专业计算机科学与技术课程名称操作系统题目生产者消费者问题设计

与实现

完成期限自2015年6月23日至2015年6月29日共1周

内容及任务一、项目的目的

1.理生产者消费者问题基本概念和工作原理,以及实现技术;

2.理解并掌握生产者消费者问题相关算法,以及它的实现方法;

3.掌握在eclipse环境下,系统开发的基本步骤和方法;

4.掌握在eclipse环境下,设计和开发一个简单的生产者消费者问题系统来模拟操作系统中生产者消费者问题。

二、项目任务的主要内容和要求

1.精读并理解和掌握生产者消费者问题;

2.编写程序来模拟生产者消费者问题的实现;

3.编写应用程序测试生产者消费者问题,并显示结果。

三、项目设计(研究)思路

本课程设计的基本思路是,首先理解和掌握生产者消费者问题的基本思想和原理,然后根据理解的基本思想和原理编程实现生产者消费者问题,最后通过数据分析生产者消费者问题。

四、具体成果形式和要求

成果:生产者消费者问题程序语言实现;设计说明书。

要求:编写好的生产者消费者问题程序能够正确启动运行;设计说明书规范、合理。

进度安排

起止日期工作内容2015.6.23至2015.6.24熟悉相关内容

2015.6.25至2015.6.26 系统设计和实现

2015.6.27至2015.6.29 系统实现和撰写相关文档

主要参考资料1.《计算机操作系统》汤子瀛哲凤屏汤小丹主编西安电子科技大学出版社.

2.《计算机操作系统概论》陈宏杨忠耀主编重庆邮电大学出版社.

3.《计算机操作系统基本知识》廖成崔阳主编电子工业出版社.

4.《操作系统实现与设计》陆刚望能主编电子工业出版社.

5.《java程序语言设计》丁振凡主编,薛清华副主编清华大学出版社.

指导教师

意见

(签字):年月日

系(教研室)

主任意见

(签字):年月日

目录

1.选题背景 (1)

2.设计思路 (1)

3.过程讨论 (1)

4.结果分析 (7)

5.结论 (8)

参考文献 (9)

致谢 (10)

附录 (10)

指导教师评语................................................. 错误!未定义书签。成绩评定 ........................................................ 错误!未定义书签。

1.选题背景

生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品。解决生产者/消费者问题的方法可分为两类:(1)采用某种机制保护生产者和消费者之间的同步;(2)在生产者和消费者之间建立一个管道。第一种方式有较高的效率,并且易于实现,代码的可控制性较好,属于常用的模式。第二种管道缓冲区不易控制,被传输数据对象不易于封装等,实用性不强。因此本文只介绍同步机制实现的生产者/消费者问题。

同步问题核心在于:如何保证同一资源被多个线程并发访问时的完整性。常用的同步方法是采用信号或加锁机制,保证资源在任意时刻至多被一个线程访问。Java语言在多线程编程上实现了完全对象化,提供了对同步机制的良好支持。在Java中一共有四种方法支持同步,其中前三个是同步方法,一个是管道方法。

2.设计思路

2.1.生产者—消费者问题是一种同步问题的抽象描述。

2.2计算机系统中的每个进程都可以消费或生产某类资源。当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。

2.3而当某个进程释放资源时,则它就相当一个生产者

3.过程论述

首先,生产者和消费者可能同时进入缓冲区,甚至可能同时读/写一个存储单元,将导致执行结果不确定。这显然是不允许的。所以,必须使生产者和消费者互斥进入缓冲区。即某时刻只允许一个实体(生产者或消费者)访问缓冲区,生产者互斥消费者和其他任何生产者。

其次,生产者不能向满的缓冲区写数据,消费者也不能在空缓冲区中取数据,即生产者与消费者必须同步。当生产者产生出数据,需要将其存入缓冲区之前,首先检查缓冲区中是否有“空”存储单元,若缓冲区存储单元全部用完,则生产者必须阻塞等待,直到消费者取走一个存储单元的数据,唤醒它。若缓冲区内有“空”存储单元,生产者需要判断此时是否有别的生产者或消费者正在使用缓冲区,若是有,则阻塞等待,否则,获得缓冲区的使用权,将数据存入缓冲区,释放缓冲区的使用权。消费者取数据之前,首先检查缓冲区中是否存在装有数据的存储单元,若缓冲区为“空”,则阻塞等待,否则,判断缓冲区是否正在被使用,若正被使用,若正被使用,则阻塞等待,否则,获得缓冲区的使用权,进入缓冲

区取数据,释放缓冲区的使用权。

3.1系统流程图

3.1.1生产者流程图:

3.1.2消费者流程图:

3.1.3主程序流程图:

3.1.4生产者:ProducerThread

//定义生产者线程

class ProducerThread implements Runnable {

int productNo = 0; //产品编号

int id; //生产者ID

public ProducerThread(int id){

this.id = id;

}

public void run(){

while(isRun){

productNo++; //生产产品

buffers.put(productNo, id); //将产品放入缓冲队列

try{

Thread.sleep(1000);

}catch(Exception e){

e.printStackTrace();

}

}

}

}

3.1.5消费者 ConsumerThread

//定义消费者线程

class ConsumerThread implements Runnable {

int id; //消费者ID

public ConsumerThread(int id){

this.id = id;

}

public void run(){

while(isRun){

buffers.get(id); //从缓冲队列中取出产品

try{

Thread.sleep(1000);

}catch(Exception e){

e.printStackTrace();

}

}

}

}

3.1.6缓冲区Buffer

class Buffer {

JTextArea ta;

static final int productBufferNum = 10; //缓冲单元数

ProductBuffer pBuffer[] = new ProductBuffer[productBufferNum]; //缓冲队列

int in = 0; //缓冲单元指针,用于放产品get()

int out = 0; //缓冲单元指针,用于取产品put()

int consumeProductNo; //记录消费产品的编号

int usedBufferNum = 0; //记录缓冲队列已使用的缓冲单元个数

public Buffer (JTextArea ta){

this.ta = ta;

//初始化

for(int j=0; j

pBuffer[j] = new ProductBuffer();

}

for(int i=0; i

pBuffer[i].product = -1;

pBuffer[i].hasProduct = false;

}

}

//取产品

public synchronized void get(int id){

//缓冲队列空则等待

if(usedBufferNum <= 0){

try{

super.wait();

}catch(Exception e){

e.printStackTrace();

}

}

consumeProductNo = pBuffer[out].product; //取出产品

pBuffer[out].product = 0; //清空缓冲单元

pBuffer[out].hasProduct = false; //置"无产品"标识

usedBufferNum--;

//输出本次取产品后缓冲队列的情况

ta.append("消费者"+id+"将产品"+consumeProductNo+"从缓冲单元"+out+"取出,缓冲队列状态如下:\n");

printBuffer();

out=(out+1)%productBufferNum; //更新指针

//唤醒等待线程

super.notify();

}

//放产品

public synchronized void put(int productNo, int id){

//缓冲队列满则等待

if(usedBufferNum == productBufferNum){

try{

super.wait();

}catch(Exception e){

e.printStackTrace();

}

}

pBuffer[in].product = productNo; //放产品

pBuffer[in].hasProduct = true; //置“有产品”标识

usedBufferNum++;

///输出本次放入产品后,缓冲队列的情况

ta.append("生产者"+id+"将产品"+productNo+"放入缓冲单元"+in+",缓冲队列状态如下:\n");

printBuffer();

in=(in+1)%productBufferNum; //更新指针

//唤醒等待线程

super.notify();

}

//打印缓冲队列当前情况

private void printBuffer(){

ta.append(" 缓冲单元编号产品编号缓冲单元状态\n");

for(int i=0; i

ta.append("\t"+i+"\t"+pBuffer[i].product+"\t"+pBuffer[i].hasProdu ct+"\n");

}

}

}

/*

一个缓冲单元

*/

class ProductBuffer {

int product; //存放产品编号

boolean hasProduct; //标识该缓冲区是否有产品,true有产品,false 无产品

}

3.1.7图形界面createUI

public void createUI()

{

JFrame frame = new JFrame("生产者消费者");

JPanel panel = new JPanel(new BorderLayout());

//ta.setBackground(Color.blue);

JScrollPane scrPane = new JScrollPane(ta);

panel.add(scrPane, BorderLayout.CENTER);

JButton button = new JButton("停止");

button.addActionListener(this);

panel.add(button, BorderLayout.SOUTH);

panel.setBackground(Color.BLUE);

frame.add(panel);

frame.setVisible(true);

frame.setSize(1000,500);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

3.1.8事件驱动actionPerformed

//按钮响应事件

public void actionPerformed(ActionEvent e){

isRun = false; //控制线程结束

System.out.println("停止");

}

4.结果分析

运行主程序得到一个GUI窗口,在文本域中输出结果,一共10个缓冲单元,三个生产者随机生产产品依次从0编号的缓冲区放入产品,消费者按照生产的先后顺序消费产品。

当缓冲单元有产品时,状态栏显示true,否则显示false。并且当消费者取走产品后,产品编号会变成0.

5.结论

这次生产者与消费者之间的关系的实验我用Java语言编写的,用关键字synchronized来实现多个线程同步,用继承Thread来将生产者线程与消费者线程实例化。其实,在做这个实验之前我的Java语言编程老师讲过这些知识,正好可以巩固Java的一些知识。我还学过C++语言,这是大一下学期学的事了,我想要实现书上的P、V操作可以用C++语言来编写。总之,通过该实验我更加清楚的认识到生产者与消费者这个经典问题实际上是线程同步问题的抽象描述,即计算机系统中的每个进程都可以消费(使用)或生产(释放)数据,进程

释放数据相当于生产者,使用数据相当于消费者。

从Java 的多线程机制出发, 研究了操作系统中经典的同步问题—生产者消费者问题, 提出了两种解决此问题的模型, 及其Java 解决方案。提出的两个模型充分利用了Java 中面向对象和管程机制, 模拟了操作系统中进程同步的经典问题—生产者消费者问题。在第一个模型中, 我们按照生产者消费者问题典型的解决方案给出了Java 解决模型; 在第二个模型中, 我们分析了信号量mutex 在问题中所起的作用, 并为了提高缓冲区读写的效率, 提出了将信号量mutex 分为两个分别控制生产者和消费者的信号量,并讨论了此方案的可行性。

参考文献

[1]《计算机操作系统》汤子瀛哲凤屏汤小丹主编西安电子科技大学出版社

[2]《计算机操作系统概论》陈宏杨忠耀主编重庆邮电大学出版社

[3]《计算机操作系统基本知识》廖成崔阳主编电子工业出版社

[4]《操作系统实现与设计》陆刚望能主编电子工业出版社

[5]《java程序语言设计》丁振凡主编,薛清华副主编清华大学出版社

致谢

本组全体成员在此向所有关心我们的及帮助我们的老师和同学们致以最真诚的感谢。在本次毕业设计中,尤其要感谢杨传健老师,对我们的课程设计时刻的关注,当我们遇到困难时给了我们很大的帮助,交给了我们团队的合作理念,使得我们能够按时完成这次的课程设计。

学生签名:填表日期:年月日

附录

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

//import Producer_and_Customer.ConsumerThread;

//import Producer_and_Customer.ProducerThread;

/*

* 定义临界资源:缓冲队列

* */

class Buffer {

JTextArea ta;

static final int productBufferNum = 10; //缓冲单元数

ProductBuffer pBuffer[] = new ProductBuffer[productBufferNum]; //缓冲队列

int in = 0; //缓冲单元指针,用于放产品get()

int out = 0; //缓冲单元指针,用于取产品put()

int consumeProductNo; //记录消费产品的编号

int usedBufferNum = 0; //记录缓冲队列已使用的缓冲单元个数

public Buffer (JTextArea ta){

this.ta = ta;

//初始化

for(int j=0; j

pBuffer[j] = new ProductBuffer();

}

for(int i=0; i

pBuffer[i].product = -1;

pBuffer[i].hasProduct = false;

}

}

//取产品

public synchronized void get(int id){

//缓冲队列空则等待

if(usedBufferNum <= 0){

try{

super.wait();

}catch(Exception e){

e.printStackTrace();

}

}

consumeProductNo = pBuffer[out].product; //取出产品

pBuffer[out].product = 0; //清空缓冲单元

pBuffer[out].hasProduct = false; //置"无产品"标识

usedBufferNum--;

//输出本次取产品后缓冲队列的情况

ta.append("消费者"+id+"将产品"+consumeProductNo+"从缓冲单元"+out+"取出,缓冲队列状态如下:\n");

printBuffer();

out=(out+1)%productBufferNum; //更新指针

//唤醒等待线程

super.notify();

}

//放产品

public synchronized void put(int productNo, int id){

//缓冲队列满则等待

if(usedBufferNum == productBufferNum){

try{

super.wait();

}catch(Exception e){

e.printStackTrace();

}

}

pBuffer[in].product = productNo; //放产品

pBuffer[in].hasProduct = true; //置“有产品”标识

usedBufferNum++;

///输出本次放入产品后,缓冲队列的情况

ta.append("生产者"+id+"将产品"+productNo+"放入缓冲单元"+in+",缓冲队列状态如下:\n");

printBuffer();

in=(in+1)%productBufferNum; //更新指针

//唤醒等待线程

super.notify();

}

//打印缓冲队列当前情况

private void printBuffer(){

ta.append(" 缓冲单元编号产品编号缓冲单元状态\n");

for(int i=0; i

ta.append("\t"+i+"\t"+pBuffer[i].product+"\t"+pBuffer[i].hasProdu ct+"\n");

}

}

}

/*

一个缓冲单元

*/

class ProductBuffer {

int product; //存放产品编号

boolean hasProduct; //标识该缓冲区是否有产品,true有产品,false 无产品

}

/*

* 生产者消费者问题实现(可以有多个生产者消费者)

* */

public class Producer_and_Customer implements ActionListener{ private JPanel jp[]=new JPanel[10];

boolean isRun = true; //用于控制线程结束

JTextArea ta = new JTextArea();

Buffer buffers = new Buffer(ta); //缓冲队列

static final int producerNum = 3; //生产者个数

static final int consumerNum = 3; //消费者个数

ProducerThread proThread[] = new ProducerThread[producerNum];

ConsumerThread conThread[] = new ConsumerThread[consumerNum];

Thread producer[] = new Thread[producerNum];

Thread consumer[] = new Thread[consumerNum];

public Producer_and_Customer(){

createUI();

//createNewUI();

//创建多个生产者和消费者线程并开始执行

for(int i=0; i

proThread[i] = new ProducerThread(i+1);

producer[i] = new Thread(proThread[i]);

producer[i].start();

}

for(int j=0; j

conThread[j] = new ConsumerThread(j+1);

consumer[j] = new Thread(conThread[j]);

consumer[j].start();

}

}

private void createNewUI() {

JFrame frame=new JFrame("Leo");

}

//创建界面

public void createUI()

{

JFrame frame = new JFrame("生产者消费者");

JPanel panel = new JPanel(new BorderLayout());

//ta.setBackground(Color.blue);

JScrollPane scrPane = new JScrollPane(ta);

panel.add(scrPane, BorderLayout.CENTER);

JButton button = new JButton("停止");

button.addActionListener(this);

panel.add(button, BorderLayout.SOUTH);

panel.setBackground(Color.BLUE);

frame.add(panel);

frame.setVisible(true);

frame.setSize(1000,500);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }

//按钮响应事件

public void actionPerformed(ActionEvent e){

isRun = false; //控制线程结束

System.out.println("停止");

}

public static void main(String args[]){

Producer_and_Customer producerConsumer = new

Producer_and_Customer();

}

//定义生产者线程

class ProducerThread implements Runnable {

int productNo = 0; //产品编号

int id; //生产者ID

public ProducerThread(int id){

this.id = id;

}

public void run(){

while(isRun){

productNo++; //生产产品

buffers.put(productNo, id); //将产品放入缓冲队列

try{

Thread.sleep(1000);

}catch(Exception e){

e.printStackTrace();

}

}

}

}

//定义消费者线程

class ConsumerThread implements Runnable {

int id; //消费者ID

public ConsumerThread(int id){

this.id = id;

}

public void run(){

while(isRun){

buffers.get(id); //从缓冲队列中取出产品

try{

Thread.sleep(1000);

}catch(Exception e){

e.printStackTrace();

}

}

}

}

}

指导教师评语

成绩评定

指导教师签名:填表日期:年月日

生产者与消费者问题(Java)

package Table; public class Message { public static int id; public String content; public String getContent() { return content; } public void setContent(String content) { this.content = content; } public int getId() { return id; } public void setId(int id) { Message.id = id; } } package Table; import java.util.ArrayList; import java.util.List; public class Queue { List queue = new ArrayList(); /** 队列中message对象的最大值,默认为10 */ int maxMessageNum = 10; public synchronized void produce(Message message) { /**synchronized为关键字,表示在任何一个线程要访问缓冲区时都会 检查有无其他线程访问此段内容,有的话则等待,无的话则直接访问**/ this.notifyAll(); while (queue.size() == maxMessageNum) { System.out.println(Thread.currentThread().getName() + "the desk is full, and the chef want to relax"); try { this.wait(); } catch (InterruptedException e) { e.printStackTrace();

生产者-消费者模型的多线程实验指导

一、预备知识 ●有 C 语言基础 ●掌握在 Linux 下常用编辑器的使用 ●掌握Linux下的程序编译过程 ●学习pthread库函数的使用 ●掌握共享锁和信号量的使用方法 ●掌握make和makefile工具编译程序 二、实验设备及工具 硬件:PC机P entium500以上,硬盘40G以上, 内存大于128M。 软件:PC机操作系统REDHAT LIN UX9.0 三、实验流程 生产者写入缓冲区和消费者从缓冲区读数的具体流程,生产者首先要获得互斥锁,并且判断写指针+1 后是否等于读指针,如果相等则进入等待状态,等候条件变量notfull;如果不等则向缓冲区中写一个整数,并且设置条件变量为notempty,最后释放互斥锁。消费者线程与生产者线程类似。流程图如下: 生产者-消费者实验源代码结构流程 四、实验源代码:

#include #include #include #include "pthread.h" #define BUFFER_SIZE 16 /* 设置一个整数的圆形缓冲区*/ structprodcons { int buffer[BUFFER_SIZE]; /* 缓冲区数组*/ pthread_mutex_t lock; /* 互斥锁*/ intreadpos, writepos; /* 读写的位置*/*/ pthread_cond_tnotempty; /* 缓冲区非空信号*/ pthread_cond_tnotfull; /*缓冲区非满信号*/ }; /*--------------------------------------------------------*/ /*初始化缓冲区*/ voidinit(structprodcons * b) { pthread_mutex_init(&b->lock, NULL); pthread_cond_init(&b->notempty, NULL); pthread_cond_init(&b->notfull, NULL); b->readpos = 0; b->writepos = 0; } /*--------------------------------------------------------*/ /* 向缓冲区中写入一个整数*/ void put(structprodcons * b, int data) { pthread_mutex_lock(&b->lock);/*获取互斥锁*/ /*等待缓冲区非满*/ while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) { printf("wait for not full\n"); pthread_cond_wait(&b->notfull, &b->lock);/*等待状态变量b->notfull,不满则跳出阻塞*/ } /*写数据并且指针前移*/ b->buffer[b->writepos] = data; b->writepos++; if (b->writepos>= BUFFER_SIZE) b->writepos = 0; /*设置缓冲区非空信号*/ pthread_cond_signal(&b->notempty); /*设置状态变量*/ pthread_mutex_unlock(&b->lock); /*//释放互斥锁*/

操作系统课程设计用多进程同步方法解决生产者消费者问题

操作系统课程设计 用多进程同步方法解决生产者-消费者问题 系别:计科系 专业: 计算机科学与技术 班级:04 级 4 班 学号:0410******* 姓名:苏德洪 时间:2006-7-7—2006-7-14

目录 一、题目: (3) 二、设计目的: (3) 三、总体设计思想概述: (3) 四、说明: (3) 五、设计要求: (3) 六、设计方案: (3) 七、流程图: (5) 八、运行结果 (7) 九、源程序 (11) 十、总结 (18) 十一、参考文献 (20)

一、题目: 用多进程同步方法解决生产者-消费者问题。 二、设计目的: 通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。 三、总体设计思想概述: 1、生产者—消费者问题是一种同步问题的抽象描述。 2、计算机系统中的每个进程都可以消费或生产某类资源。当系统中某一进程使用某一 资源时,可以看作是消耗,且该进程称为消费者。 3、而当某个进程释放资源时,则它就相当一个生产者。 四、说明: 有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数。 五、设计要求: 1、每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前 指针位置和生产者/消费者线程的标识符。 2、生产者和消费者各有两个以上。 3、多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码。 六、设计方案: 通过一个有界缓冲区(用数组来实现,类似循环队列)把生产者和消费者联系起来。假定生产者和消费者的优先级是相同的,只要缓冲区未满,生产者就可以生产产品并将产品送入缓冲区。类似地,只要缓冲区未空,消费者就可以从缓冲区中去走产品并消费它。 应该禁止生产者向满的缓冲区送入产品,同时也应该禁止消费者从空的缓冲区中取出产品,这一机制有生产者线程和消费者线程之间的互斥关系来实现。 为解决生产者/消费者问题,应该设置两个资源信号量,其中一个表示空缓冲区的数目,用g_hFullSemaphore表示,其初始值为有界缓冲区的大小SIZE_OF_BUFFER;另一个表示缓冲区中产品的数目,用g_hEmptySemaphore表示,其初始值为0。另外,由于有界缓冲区是一个临界资源,必须互斥使用,所以还需要再设置一个互斥信号量g_hMutex,起初值为1。

生产者与消费者

重庆交通大学 《计算机操作系统》课程设计报告 班级:计软专业 2013 级 2 班 姓名: 学号: 课程设计题目:生产者/消费者与FCFS 所属课程:计算机操作系统 实验室(中心):语音大楼801 指导教师:刘洋 完成时间: 2015 年 12 月 5 日 信息科学与工程学院课程设计成绩单

课程名称:计算机操作系统指导教师:刘洋

重庆交通学院信息科学与工程学院课程设计任务书

生产者/消费者与FCFS 一、内容提要 操作系统是计算机的核心软件,是计算机专业学生的专业必修课。进程同步问题是计算机操作系统中的重点内容,而生产者-消费者问题是进程同步问题中的经典,它是计算机中相互合作进程关系的一种抽象,该问题具有很大的代表性和使用价值。 在计算机系统中,很多问题都可以归结为生产者与消费者问题,提别是在通讯和控制系统中。因此,对该类问题的研究是非常必要的。一般而言,我们把提供给某种资源的进程(线程)称之为生产者,二吧消耗资源的进程(线程)称之为消费者。在大多数情况下,生产者和消费者的数目都是多于一个的。下面以多个进程(线程)共享一有界缓冲池为例来说明。 如图,左端箭头表示生产者,右端箭头表示消费者,设P 1、P 2 、…、P K 是k 个想缓冲池装入数据的进程(线程)(生产者)C 1、C 2 、…、C m 是m个冲缓冲池 中取出数据进行处理的进程(线程)(消费者),假设对任何P i 每次向缓冲区 中申请一空白缓冲区,并把数据装入其中;而对于常见的情况是任何C i 每次都从缓冲池中取出一满缓冲区的内容,并进行相应的处理,并把缓冲区清空。而每次生产者装入数据和消费者取出数据都是相同的(这是最常见的情况)。针对以上进程(线程)通信,如不对生产者进程(线程)和消费者(线程)的操作进行限制,则可能破坏数据的完整性。一种情况是一个生产者进程(线程)正在装入数据到缓冲区时,另外的生产者进程(线程)可能同时把数据写入相同区域,造成数据破坏,另一种情况是一个生产者进程(线程)正在装入数据到缓冲区时,另外的消费者进程(线程)可能读入该区域数据,由于数据未写完,从而造成消

生产者消费者问题模拟实现(z)

生产者-消费者实验 1.1实验目的和要求 1.1.1实验目的 操作系统的基本控制和管理控制都围绕着进程展开,其中的复杂性是由于支持并发和并发机制而引起的。自从操作系统中引入并发程序设计后,程序的执行不再是顺序的,一个程序未执行完而另一个程序便已开始执行,程序外部的顺序特性消失,程序与计算不再一一对应。并发进程可能是无关的,也可能是交互的。然而,交互的进程共享某些变量,一个进程的执行可能会影响其他进程的执行结果,交互的并发进程之间具有制约关系、同步关系。其中典型模型便是生产者-消费者模型。 本实验通过编写和调试生产者-消费者模拟程序,进一步认识进程并发执行的实质,加深对进程竞争关系,协作关系的理解,掌握使用信号量机制与P、V操作来实现进程的同步与互斥。 1.1.2实验要求 1.用高级语言编写一个程序,模拟多个生产者进程和多个消费者进程并发执行,并采用信号量机制与P、V操作实现进程间同步与互斥。 2.撰写实验报告,报告应包含以下内容: (1)实验目的; (2)实验内容; (3)设计思路; (4)程序流程图; (5)程序中主要数据结构和函数说明; (6)带注释的源程序代码; (7)程序运行结果及分析; (8)实验收获与体会。 1.2预备知识 1.2.1生产者—消费者问题 生产者—消费者问题表述如下:如图3.1所示,有n个生产者和m个消费者,连接在具

有k个单位缓冲区的有界环状缓冲上,故又称有界缓冲问题。生产者不断生成产品,只要缓冲区未满,生产者进程pi所生产的产品就可投入缓冲区;类似的,只要缓冲区非空,消费者进程cj就可以从缓冲区取走并消耗产品。 图 3.1 生产者—消费者问题示意图 著名的生产者—消费者问题(producer-consumer problem)是计算机操作系统中并发进程内在关系的一种抽象,是典型的进程同步问题。在操作系统中,生产者进程可以是计算进程、发送进程,而消费者进程可以是打印进程、接收进程等,解决好生产者—消费者问题就解决了一类并发进程的同步问题。 操作系统实现进程同步的机制称为同步机制,它通常由同步原语组成。不同的同步机制采用不同的同步方法,迄今已设计出多种同步机制,本实验采用最常用的同步机制:信号量及PV操作。 1.2.2信号量与PV操作 1965年,荷兰计算机科学家E.W.Dijkstra提出新的同步工具——信号量和PV操作,他将交通管制中多种颜色的信号灯管理方法引入操作系统,让多个进程通过特殊变量展开交互。一个进程在某一关键点上被迫停止直至接收到对应的特殊变量值,通过这一措施任何复杂的进程交互要求均可得到满足,这种特殊变量就是信号量(semaphore)。为了通过信号量传送信号,进程可利用P和V两个特殊操作来发送和接收信号,如果协作进程的相应信号仍未到达,则进程被挂起直至信号到达为止。 在操作系统中用信号量表示物理资源的实体,它是一个与队列有关的整型变量。具体实现时,信号量是一种变量类型,用一个记录型数据结构表示,有两个分量:一个是信号量的值,另一个是信号量队列的指针。信号量在操作系统中主要用于封锁临界区、进程同步及维护资源计数。除了赋初值之外,信号量仅能由同步原语PV对其操作,不存在其他方法可以检查或操作信号量,PV操作的不可分割性确保执行的原子性及信号量值的完整性。利用信号量和PV操作即可解决并发进程竞争问题,又可解决并发进程协作问题。 信号量按其用途可分为两种:公用信号量,联系一组并发进程,相关进程均可在此信号量上执行PV操作,用于实现进程互斥;私有信号量,联系一组并发进程,仅允许此信号量所拥有的进程执行P操作,而其他相关进程可在其上执行V操作,初值往往为0或正整数,多用于并发进程同步。

生产者消费者问题设计与实现

操作系统课程设计任务书

目录

1.选题背景 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品。解决生产者/消费者问题的方法可分为两类:(1)采用某种机制保护生产者和消费者之间的同步;(2)在生产者和消费者之间建立一个管道。第一种方式有较高的效率,并且易于实现,代码的可控制性较好,属于常用的模式。第二种管道缓冲区不易控制,被传输数据对象不易于封装等,实用性不强。因此本文只介绍同步机制实现的生产者/消费者问题。 同步问题核心在于:如何保证同一资源被多个线程并发访问时的完整性。常用的同步方法是采用信号或加锁机制,保证资源在任意时刻至多被一个线程访问。Java语言在多线程编程上实现了完全对象化,提供了对同步机制的良好支持。在Java中一共有四种方法支持同步,其中前三个是同步方法,一个是管道方法。 2.设计思路 .生产者—消费者问题是一种同步问题的抽象描述。 计算机系统中的每个进程都可以消费或生产某类资源。当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。 而当某个进程释放资源时,则它就相当一个生产者 3.过程论述 首先,生产者和消费者可能同时进入缓冲区,甚至可能同时读/写一个存储单元,将导致执行结果不确定。这显然是不允许的。所以,必须使生产者和消费者互斥进入缓冲区。即某时刻只允许一个实体(生产者或消费者)访问缓冲区,生产者互斥消费者和其他任何生产者。 其次,生产者不能向满的缓冲区写数据,消费者也不能在空缓冲区中取数据,即生产者与消费者必须同步。当生产者产生出数据,需要将其存入缓冲区之前,首先检查缓冲区中是否有“空”存储单元,若缓冲区存储单元全部用完,则生产者必须阻塞等待,直到消费者取走一个存储单元的数据,唤醒它。若缓冲区内有“空”存储单元,生产者需要判断此时是否有别的生产者或消费者正在使用缓冲区,若是有,则阻塞等待,否则,获得缓冲区的使用权,将数据存入缓冲区,释放缓冲区的使用权。消费者取数据之前,首先检查缓冲区中是否存在装有数据的存储单元,若缓冲区为“空”,则阻塞等待,否则,判断缓冲区是否正在被使用,

LabVIEW程序设计模式(五)—生产者消费者模式(2)_VI的可重入性(Reentrant Execution)

LabVIEW程序设计模式(五)—生产者/消费者模式(2)_VI的可重入性(Reentrant Execution) LabVIEW程序设计2009-05-19 17:06:34 阅读698 评论0 字号:大中小订阅 在介绍VI的动态调用之前有必要对LabVIEW在执行VI过程中的规则有个大致的了解。众所周知,LabVIEW是通过VI的文件名(VI Name)来表示独立的VI的,并不是VI的路径。因此,LabVIEW不允许具有相同名字的VI同时载入内存中,即使这些VI存储在不同的路径中。 在前面曾经提到,LabVIEW本身就是一种多线程设计的语言。那么当同一背面板中放置两个VI的实例时代码应该如何执行呢?在图29中,右侧是测试VI运行的时间,左侧是Wait.vi的具体实现代码,仅仅是等待一定的秒数。那么在右侧的VI中,输出的Time是多少呢?是3秒还是2秒? 图29 Reentrant Execution 打开VI的Highlight调试工具,可以看出两个Wait.vi实例的调用并不是同时执行的,而是依次按顺序执行的,至于哪一个实例先执行是不确定的。这是由于LabVIEW本身是并行设计的,从理论上而言,两个VI的实例是同步执行的,但是如果两个Wait.vi实例同时执行必定会产生参数赋值紊乱,因为LabVIEW只允许内存中存在一个名称的VI。因此,此时Time的输出结果是3秒。 如果在实际使用中需要这样的应用该如何解决呢?LabVIEW提供了VI的可重入技术,打开Wait.vi,单击按键,选择图30所示的Reentrant execution 选项。此时再次运行Time的输出结果是2秒。从Highlight的运行过程来看,两个Wait.vi实例是同时执行的,因此总的运行时间就是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.程序结构图:

实验1:生产者消费者问题

福建农林大学金山学院实验报告 系(教研室):专业:计算机科学与技术年级: 实验课程:生产者与消费者实验姓名:学号: 实验室号:1#608 计算机号:实验时间:指导教师签字:成绩: 实验1:生产者消费者问题 一、实验目的 生产者消费者问题是操作系统中经典的同步和互斥问题。通过实验,要求学生掌握两者之间的同步信号量和互斥信号量的使用,更深刻了解临界资源、同步和互斥的概念。 二、实验要求 1.一组生产者通过一个具有N个缓冲区的缓冲池循环不断地向一组消费者提供产 品。 2.建一个队列, 队列的长度由n记录, 定义两个指针, 分别指向队列的头和尾消 费者从头指针读取数据,每读取一个数据把n--,生产者把数据写入尾指针, 每写入一个数据就n++,当n=N的时候生产者暂停写入数据。 3.注意:缓冲池队列,用互斥锁保护。 三、实验内容和原理 1.分别画出生产者和消费者的流程图

2.针对生产者和消费者问题,可以分为哪几种情况,使用了哪些原语?分别代表 什么意思?过程如何?阐述哪些进程之间存在同步,哪些进程之间存在互斥。 3.缓冲区是否为临界资源?是否可以循环使用?通过什么来实现?举例说明(可 画图) 四、实验环境 1. 硬件:PC机; 2. 软件:Windows操作系统、。 五、算法描述及实验步骤 #include <> #include const unsigned short SIZE_OF_BUFFER = 10; unsigned short ProductID = 0; unsigned short ConsumeID = 0;

unsigned short in = 0; unsigned short out = 0; int g_buffer[SIZE_OF_BUFFER]; bool g_continue = true; HANDLE g_hMutex; HANDLE g_hFullSemaphore; HANDLE g_hEmptySemaphore; DWORD WINAPI Producer(LPVOID); DWORD WINAPI Consumer(LPVOID); int main() { g_hMutex = CreateMutex(NULL,FALSE,NULL); g_hFullSemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL); g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL); const unsigned short PRODUCERS_COUNT = 3; const unsigned short CONSUMERS_COUNT = 1; const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE hThreads[PRODUCERS_COUNT]; DWORD producerID[CONSUMERS_COUNT]; DWORD consumerID[THREADS_COUNT]; for (int i=0;i

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

操作系统课程设计 一.实验目标 完成N个生产者和M个消费者线程之间的并发控制,N、M不低于30,数据发送和接收缓冲区尺寸不小于20个(每个产品占据一个)。 其中生产者线程1、3、5、7、9生产的产品供所有奇数编号的消费者线程消费,只有所有奇数编号的消费者线程都消费后,该产品才能从缓冲区中撤销。 其中生产者线程2、4、6、8、10生产的产品所有偶数编号的消费者线程都可消费,任一偶数编号消费者线程消费该消息后,该产品都可从缓冲区中撤销。 其中11-20号生产者线程生产的产品仅供对应编号的消费者线程消费。 其他编号生产者线程生产的产品可由任意的消费者线程消费。 每个生产线程生产30个消息后结束运行。如果一个消费者线程没有对应的生产者线程在运行后,也结束运行。所有生产者都停止生产后,如果消费者线程已经

没有可供消费的产品,则也退出运行。 二.实验原理 2.1原理 生产者与消费者线程采用posix互斥锁机制进行互斥进入各自的代码段,只有采用互斥锁临界区代码段才可以不被打扰的执行;同步机制采用的是posix条件变量pthread_cond_wait和pthraed_cond_signal进行同步的。 线程间的通信采用的是共享内存机制。(注:所有的共享内存块是在进程里建立的,线程只需链接上各自的共享内存块即可,每一块共享内存的大小是100). 在这里共享内存设置成一个100的数组。 具体实施:(1)为1.3.5.7.9建立一个共享内存1号,1.3.5.7.9生产者线程生产的产品都放入这块共享内存缓冲区,所有奇数的消费者线程要消费的话,只需在消费者线程中链接上这块共享内存,就可以直接消费1.3.5.7.9生产者线程生产的产品。 (2)为2.4.6.8.10建立一块共享内存2号。2.4.6.8.10生产的产品都放入2号共享内存缓冲区,所有的偶数的消费者线程只要链接上2号缓冲区,就可以消费2.4.6.8.10生产的产品。当偶数消费者线程消费产品后,产品即可从缓冲区撤销,方法是在消费线程里将消费的产品在共享内存数组里置0。 (3)为11--20的每一对生产者消费者线程建立一块共享内存,编号11--20. 11--20号的消费者线程能链接各自的共享内存缓冲区或奇数或偶数共享内存缓冲区,即11--20号的生产者生产的产品只能被对应的消费者消费而11-20的奇数消费者可以消费缓冲区1的产品,偶数消费者可消费缓冲区2的产品。 (4)为21--30号的生产者消费者线程只建立一块共享内存21号,21--30号生产者生产的产品都放入21号缓冲区,所有的消费者线程只要链接上21号共享内存,就可以消费21--30号生产者生产的产品。 用于控制线程是否结束的方法是:设置一个全局变量t,在生产者线程里进行t++,在生产者线程里当t达到10时(注:为了很好的测试程序,本应该在生产者生产30个产品时菜结束线程,这里设置成了10),就break跳出while()循环,这样线程自然就终止。同样在消费者线程里,当t达到10时,这里不用t++,就跳出while()循环,消费者线程自然就终止。这样设计满足了,当生产者生产30个产品时就终止生产者线程,生产者线程终止消费者线程也得终止的要求。 生产者从文件so.txt读取数据进行生产,这个文件里的数据是一连串的字符从a--z的组合,没有空格或其他字符。文件内容的格式没有特殊要求。

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

实验报告五 ——生产者和消费者问题 姓名:丛菲学号:20100830205 班级:信息安全二班一、实习内容 ?1、模拟操作系统中进程同步和互斥 ?2、实现生产者和消费者问题的算法实现 二、实习目的 ?1、熟悉临界资源、信号量及PV操作的定义与物理意义 ?2、了解进程通信的方法 ?3、掌握进程互斥与进程同步的相关知识 ?4、掌握用信号量机制解决进程之间的同步与互斥问题 ?5、实现生产者-消费者问题,深刻理解进程同步问题 三、实习题目 ?在Linux操作系统下用C实现经典同步问题:生产者—消费者,具体要求如下: (1)一个大小为10的缓冲区,初始状态为空。 (2)2个生产者,随机等待一段时间,往缓冲区中添加数据,若缓冲区已满,等待消 费者取走数据之后再添加,重复10次。 (3)2个消费者,随机等待一段时间,从缓冲区中读取数据,若缓冲区为空,等待生 产者添加数据之后再读取,重复10次。 ?提示 本实验的主要目的是模拟操作系统中进程同步和互斥。在系统进程并发执行异步推进的过程中,由于资源共享和进程间合作而造成进程间相互制约。进程间的相互制约有两种不同的方式。 (1)间接制约。这是由于多个进程共享同一资源(如CPU、共享输入/输出设备)而引起的,即共享资源的多个进程因系统协调使用资源而相互制约。 (2)直接制约。只是由于进程合作中各个进程为完成同一任务而造成的,即并发进程各自的执行结果互为对方的执行条件,从而限制各个进程的执行速度。 生产者和消费者是经典的进程同步问题,在这个问题中,生产者不断的向缓冲区中写入数据,而消费者则从缓冲区中读取数据。生产者进程和消费者对缓冲区的操作是互斥,即当前只能有一个进程对这个缓冲区进行操作,生产者进入操作缓冲区之前,先要看缓冲区是否已满,如果缓冲区已满,则它必须等待消费者进程将数据取出才能写入数据,同样的,消费者进程从缓冲区读取数据之前,也要判断缓冲

生产者与消费者实验报告

生产者和消费者实验报告 【实验目的】 1.加深对进程概念的理解,明确进程和程序的区别。 2.进一步认识并发执行的实质。 3.验证用信号量机制实现进程互斥的方法。 4.验证用信号量机制实现进程同步的方法。 【实验要求】 用c语言编程搭建“生产者和消费者”经典进程通信问题的环境。要求程序运行时,按任意键停止,显示当前系统的各个参数的值。提交实验报告,以及相关程序列表。打包成附件上传。 【实验环境】 Visual C++6.0 【实验内容】 1.了解经典同步问题“生产者和消费者” 生产者与消费者可以通过一个环形缓冲池联系起来,环形缓冲池由几个大小相等的缓冲块组成,每个缓冲块容纳一个产品。每个生产者可不断地每次往缓冲池中送一个生产产品,而每个消费者则可不断地每次从缓冲池中取出一个产品。指针i和指针j分别指出当前的第一个空缓冲块和第一个满缓冲块。 2.分析和理解 (1)既存在合作同步问题,也存在临界区互斥问题 合作同步:当缓冲池全满时,表示供过于求,生产者必须等待,同时唤醒消费者;当缓冲池全空时,表示供不应求,消费者应等待,同时唤醒生产者。 互斥:缓冲池显然是临界资源,所在生产者与消费都要使用它,而且都要改变它的状态。 (2)基于环形缓冲区的生产者与消费者关系形式描述: 公用信号量mutex:初值为1,用于实现临界区互斥 生产者私用信号量empty:初值为n,指示空缓冲块数目 消费者私用信号量full:初值为0,指示满缓冲块数目 整型量i和j初值为0,i指示首空缓冲块序号,j指示首满缓冲块序号 (3)PV原语 var mutex,empty,full:semaphore; i,j:integer;buffer:array[0...n-1] of item; i:=j:=1; Procedure producer; begin while true do begin

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

计算机与信息学院 《操作系统与编译原理联合课程设计报告》 专题:操作系统部分 学生姓名: 学号: 专业班级: 指导教师: 2014 年 7 月

一、设计目标 多进程/线程编程:生产者-消费者问题。设置两类进程/线程,一类为生产者,一类为消费者;建立缓冲区的数据结构;随机启动生产者或消费者;显示缓冲区状况;随着进程/线程每次操作缓冲区,更新显示。 二、设计思路 1.开发平台:Visual C++6.0 2.设计思路: 若干个生产者和若干个消费者共享一个有界缓冲区,生产者生产产品,消费者消费产品。消费者进程与生产者进程随机切换。生产者将产品生产出来后,存放到缓冲区中的空闲位置并将此缓冲区的标识置为满,若此时无空缓冲区,则进行等待。消费者将标识为满的缓冲区中的产品取出,进行消费并将该缓冲区的标志位置为空,若此时无满的缓冲区,则进行等待。 由于消费者与生产者共享缓冲区资源,且缓冲区资源属于互斥资源,所以生产者和消费者需要按照一定的规则访问缓冲区,访问规则如下: (1)当一个消费者访问缓冲区时其他消费者不允许访问缓冲区,同样的,当一个生产者访问缓冲区时其他生产者也不能访问缓冲区。 (2)当消费者访问缓冲区资源时生产者不能访问,反之,当生产者访问缓冲区资源时消费者不能访问。 (3)当缓冲区中无产品时,消费者不能访问;当缓冲区已满时,生产者不能访问缓冲区。 生产者与消费者问题伪代码如下: VAR mutex, empty, full: semaphore := 1, n, 0 ; in,out: integer := 0, 0 ; Buffer: array [0..n-1] of item ; Parbegin Producer: begin repeat produce an item in nextp; wait(empty); wait(mutex); Buffer(in) := nextp; in := (in + 1) mod n; signal(mutex); signal(full); until false end Consumer: begin repeat

计算机操作系统课程设计源代码《生产者---消费者问题源代码》

生产者 --- 消费者问题源代 码》 #include #include #include #include #include #include #include #include #include #include #define NUM_THREADS_P 5 #define NUM_THREADS_C 5 #define MAX_BUFFER 20 #define RUN_TIME 20 int buffer[MAX_BUFFER]; /* 定义数据为生产者 */ /* 定义数据为消费者 */ /* 定义数据为缓存区 */ /* 定义运行时间 */ /* 定义最大缓存区 */ */ pthread_t threads_p[NUM_THREADS_P]; /* 声明生产者线程 */ pthread_t threads_c[NUM_THREADS_C]; /* 声明消费者线程 */ FILE* fd; void *producer_thread(void *tid); void *consumer_thread(void *tid); /* void showbuf(); /* 声明 showbuf 方法 */ void handler(){ int i; /* 定义 i*/ for(i=0;i

1实验1:生产者消费者问题

1实验1:生产者消费者问 题 -标准化文件发布号:(9556-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII

福建农林大学金山学院实验报告 系(教研室):专业:计算机科学与技术年级: 实验课程:生产者与消费者实验姓名:学号: 实验室号:1#608 计算机号:实验时间:指导教师签字:成绩: 实验1:生产者消费者问题 一、实验目的 生产者消费者问题是操作系统中经典的同步和互斥问题。通过实验,要求学生掌握两者之间的同步信号量和互斥信号量的使用,更深刻了解临界资源、同步和互斥的概念。 二、实验要求 1.一组生产者通过一个具有N个缓冲区的缓冲池循环不断地向一组消费者提供 产品。 2.建一个队列, 队列的长度由n记录, 定义两个指针, 分别指向队列的头和尾消费 者从头指针读取数据,每读取一个数据把n--,生产者把数据写入尾指针, 每写 入一个数据就n++,当n=N的时候生产者暂停写入数据。 3.注意:缓冲池队列,用互斥锁保护。 三、实验内容和原理 1.分别画出生产者和消费者的流程图

2.针对生产者和消费者问题,可以分为哪几种情况,使用了哪些原语分别代表什 么意思过程如何阐述哪些进程之间存在同步,哪些进程之间存在互斥。 3.缓冲区是否为临界资源是否可以循环使用通过什么来实现举例说明(可画图) 四、实验环境 1. 硬件:PC机; 2. 软件:Windows操作系统、。 五、算法描述及实验步骤 #include <> #include const unsigned short SIZE_OF_BUFFER = 10; unsigned short ProductID = 0; unsigned short ConsumeID = 0; unsigned short in = 0;

生产者消费者问题设计与实现

操作系统课程设计任务书 学院计算机与信息工程专业计算机科学与技术课程名称操作系统题目生产者消费者问题设计 与实现 完成期限自2015年6月23日至2015年6月29日共1周 内容及任务一、项目的目的 1.理生产者消费者问题基本概念和工作原理,以及实现技术; 2.理解并掌握生产者消费者问题相关算法,以及它的实现方法; 3.掌握在eclipse环境下,系统开发的基本步骤和方法; 4.掌握在eclipse环境下,设计和开发一个简单的生产者消费者问题系统来模拟操作系统中生产者消费者问题。 二、项目任务的主要内容和要求 1.精读并理解和掌握生产者消费者问题; 2.编写程序来模拟生产者消费者问题的实现; 3.编写应用程序测试生产者消费者问题,并显示结果。 三、项目设计(研究)思路 本课程设计的基本思路是,首先理解和掌握生产者消费者问题的基本思想和原理,然后根据理解的基本思想和原理编程实现生产者消费者问题,最后通过数据分析生产者消费者问题。 四、具体成果形式和要求 成果:生产者消费者问题程序语言实现;设计说明书。 要求:编写好的生产者消费者问题程序能够正确启动运行;设计说明书规范、合理。 进度安排 起止日期工作内容2015.6.23至2015.6.24熟悉相关内容 2015.6.25至2015.6.26 系统设计和实现 2015.6.27至2015.6.29 系统实现和撰写相关文档

主要参考资料1.《计算机操作系统》汤子瀛哲凤屏汤小丹主编西安电子科技大学出版社. 2.《计算机操作系统概论》陈宏杨忠耀主编重庆邮电大学出版社. 3.《计算机操作系统基本知识》廖成崔阳主编电子工业出版社. 4.《操作系统实现与设计》陆刚望能主编电子工业出版社. 5.《java程序语言设计》丁振凡主编,薛清华副主编清华大学出版社. 指导教师 意见 (签字):年月日 系(教研室) 主任意见 (签字):年月日

生产者和消费者问题

课程设计 题目生产者和消费者问题学院计算机科学与技术 专业 班级 姓名 指导教师吴利军 2013 年 1 月16 日

课程设计任务书 学生姓名: 指导教师:吴利军工作单位:计算机科学与技术学院题目: 进程同步模拟设计——生产者和消费者问题 初始条件: 1.预备内容:阅读操作系统的进程管理章节内容,对进程的同步和互斥,以及信号量机制度有深入的理解。 2.实践准备:掌握一种计算机高级语言的使用。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写 等具体要求) 1.模拟用信号量机制实现生产者和消费者问题。 2.设计报告内容应说明: ⑴需求分析; ⑵功能设计(数据结构及模块说明); ⑶开发平台及源程序的主要部分; ⑷测试用例,运行结果与运行情况分析; ⑸自我评价与总结: i)你认为你完成的设计哪些地方做得比较好或比较出色; ii)什么地方做得不太好,以后如何改正; iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训); iv)完成本题是否有其他方法(如果有,简要说明该方法); 时间安排: 设计安排一周:周1、周2:完成程序分析及设计。 周2、周3:完成程序调试及测试。 周4、周5:验收、撰写课程设计报告。 (注意事项:严禁抄袭,一旦发现,一律按0分记) 指导教师签名:年月日 系主任(或责任教师)签名:年月日

生产者-消费者问题(the producer-consumer problem) 1.需求分析 1.1问题描述: 一组生产者向一组消费者提供消息,它们共享一个有界缓冲区n,生产者向其中投放消息,消费者从中取得消息。 1.2规则: ?对于生产者进程:产生一个数据,当要送入缓冲区时,要检查缓冲区是否已满,若 未满,则可将数据送入缓冲区,并通知消费者进程;否则,等待; ?对于消费者进程:当它去取数据时,要看缓冲区中是否有数据可取,若有则取走一 个数据,并通知生产者进程,否则,等待。 ?缓冲区是个临界资源,因此,诸进程对缓冲区的操作程序是一个共享临界区,所以, 还有个互斥的问题。 1.3信号灯设置: 两个同步信号灯-- empty :表示空缓冲区的数目,初值为有界缓冲区的大小n; full :表示满缓冲区(即信息)的数目,其初值为0; 一个互斥信号灯-- mutex:互斥信号灯,初值为1。 1.4同步描述: 1.5程序描述: main( ) { int full=0;/* 满缓冲区的数目 */ int empty=n;/* 空缓冲区的数目 */ int mutex=1;/* 对有界缓冲区进行操作的互斥信号灯*/ cobegin p1 ( );p2( );

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

课程设计报告 课程名称:操作系统 专业____________ 计算机科学与技术__________ 学生姓名____________________________________ 班级_______________________________________ 学号_______________________________________ 指导教师____________________________________ 完成日期___________________________________ 信息工程学院

题目:生产者-消费者问题的模拟实现 一、设计目的 本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。 二、设计内容 (1)概述 设计目的:通过研究Linux的进程机制和信号量实现生产者消费者问题的并发控制。 说明:有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数。 设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者县城的标识符。(2)生产者和消费者各有两个以上。(3)多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码。 (2)设计原理 通过一个有界缓冲区把生产者和消费者联系起来。假定生产者和消费者的优先级是相同的,只要缓冲区未满,生产者就可以生产产品并将产品送入缓冲区。类似地,只要缓冲区未空,消费者就可以从缓冲区中取走产品。应该禁止生产者向满的缓冲区送入产品,同时也应该禁止消费者从空的缓冲区中取出产品,这一机制有生产者线程和消费者线程之间的互斥关系来实现。与计算打印两进程同步关系相同,生产者和消费者两进程P和C之间应满足下列两个同步条件: ①只有在缓冲池中至少有一个缓冲区已存入消息后,消费者才能从中提取信息, 否则消费者必须等待。 ②只有缓冲池中至少有一个缓冲区是空时,生产者才能把消息放入缓冲区,否则生产者必 须等待。 为了满足第一个同步条件,设置一个同步信号量full,它代表的资源是缓冲区满, 它的初始值为0,它的值为n时整个缓冲池满。这个资源是消费者类进程C所有,C进 程可以申请该资源,对它施加P操作,而C进程的合作进程生产者进程P对它施加V操作。同样为了满足第二个同步条件,设置另一个同步信号量empty,它代表的资源是缓 冲空区,它的初始值为n,表示缓冲池中所有缓冲区空。信号量full表示可用缓冲区数量,信号

相关文档
最新文档