pv操作解决生产者——消费者问题

上传人:小** 文档编号:91906996 上传时间:2019-07-03 格式:PDF 页数:17 大小:464.43KB
返回 下载 相关 举报
pv操作解决生产者——消费者问题_第1页
第1页 / 共17页
pv操作解决生产者——消费者问题_第2页
第2页 / 共17页
pv操作解决生产者——消费者问题_第3页
第3页 / 共17页
pv操作解决生产者——消费者问题_第4页
第4页 / 共17页
pv操作解决生产者——消费者问题_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《pv操作解决生产者——消费者问题》由会员分享,可在线阅读,更多相关《pv操作解决生产者——消费者问题(17页珍藏版)》请在金锄头文库上搜索。

1、- 1 - 计算机科学与技术系计算机科学与技术系 课课 程 设 计 报 告 程 设 计 报 告 课 程名 称:课 程名 称:操作系统原理 课程设计名称:课程设计名称:PV 操作解决生产者消费者问题 专业班级:专业班级:12 级网工 2 班 学 生姓 名:学 生姓 名: 学 生学 号:学 生学 号: 指 导教 师:指 导教 师: 2014 年 12 月2014 年 12 月 - 2 - 一、实验目的一、实验目的 1、了解进程 PV 操作的过程 2、了解生产者和消费者的工作过程 3、理解进程同步机构的作用和意义 二、实验内容二、实验内容 模拟 PV 操作同步机构,且用 PV 操作解决生产者消费者问

2、题。 三、实验步骤三、实验步骤 (1)任务分析 本实验要求利用 PV 操作实现解决生产者消费者问题中的同步问题。我 们先假定有一个消费者和一个生产者,它们共同享有一个缓冲区,缓冲区的大小 一定, 生产者可以生产产品放入缓冲区,消费者也可以从缓冲区中取出产品进行 消费,但是存在两种情况是不被允许的:一是缓冲区已满,消费者不在消费,生 产者就会产生等待情况并唤醒消费者进程, 直到消费者开始消费缓冲区不为满时 生产者才可以继续生产;二是缓冲区为空,生产者暂停生产时,消费者出现等待 情况并唤醒生产者进程,直到生产者继续生产,缓冲区不为空时,消费者才可以 继续消费。 本程序实现的功能是可以利用生产者进程

3、进行生产, 同时消费者进程也能进 行消费,但是必须满足同步的条件才可以允许,否则将提示缓冲区满无法进行生 产或者缓冲区空无法进行消费的错误,故程序应该具有判断的功能。若结束当前 的生产者消费者进程, 将会提示此次进程中生产消费者分别生产了和消费的 产品数目,并统计缓冲区中剩余的产品数目,最后才结束。 (2)概要设计 本函数主要用到生产者函数RP-ProceducerThread(void*p)来实现缓冲区产品数 量的增加, 消费者函数用RP-ConsumerThread(void*p)来实现缓冲区产品的减少。 并用到了CreateThread函数来创建生产者消费者线程, 利用线程的句柄以及创建

4、 线程是立刻运行的特点来进行生产消费操作。 通过random随机函数来随机控制生 - 3 - 产者消费者进程。随机数0执行生产者线程,随机数1执行生产者线程。至于PV 算法的实现是利用buffer_empty和buffer_full来进行控制,buffer_empty的值 可以看做资源量,只有空的数值大于0才可以进行生产,buffer_full的数值与 buffer_empty的值有对应的关系,利用buffer_full来控制消费的进行。最后, 在缓冲区操作临界资源PC_Buffer来说利用 EnterCriticalSection(/等待共享资源 LeaveCriticalSection(/

5、释放共享资源来进行缓冲区操作的控 制。 总之当程序读入测试文件中的数据时,便根据读入的字符时C还是P创造相应 的进程,在分配EMPTY或者FULL资源,然后等待共享资源PC_Buffer,得到后便进 行操作。最后读入所有的数据,完成所有进程的操作。 (3) 详细设计 1、做出如下定义 public class Test2 extends JFrame / 面板 1 - 4 - private JPanel panel1 = new JPanel(); / 面板 2 private JPanel panel2 = new JPanel(); private JPanel panel3 = new

6、 JPanel(); / 线程 1 private static Thread threadWQ1; / 线程 2 private static Thread threadRQ1; / 文本域,可编辑多行文字的 public static JTextArea textarea;/ 可以编辑多行 / 文本框,只能编辑一行 public static JTextField textbox;/ 只可以编辑一行 / 滚动条 public static JScrollPane scrollpane;/ 滚动条 / 进度条 public JProgressBar progressbar = new JPr

7、ogressBar();/ 进度条 / 队列 Queue Q = new Queue(); / 实例化生产者 Producer wQ1 = new Producer(Q); / 实例化消费者 Consumer rQ1 = new Consumer(Q); / 接口 public interface putmsg public void output(String msg, JTextArea textaera, JProgressBar jbr); public void buffer(JTextField number); public Test2() / 设置窗口大小 setSize(60

8、0, 600); / 设置窗口的位置,距离左上角(100,100) setLocation(100, 100); / 设置默认关闭,右上角的的叉关闭 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); / 调用函数 layoutPanel2() textbox = new JTextField(“10“, 2); layoutPanel2(); / 设置布局方式为边界布局,就是上下左右中也可以说东南西北中 setLayout(new BorderLayout(); - 5 - / 将面板 1 放在下(南) add(panel1, BorderLayo

9、ut.SOUTH); / 将面板 2 放在下(北) add(panel2, BorderLayout.WEST); 2. CreateThread 函数创建一个在调用进程的地址空间中执行的线程。此函数为 API 函数,用于创建生产者消费者进程。 3.生产者消费者函数 public synchronized void produce(Message message) / 实现生产的函数 / 唤醒消费者的 this.notifyAll(); / 判断队列中是否生产满了 while (queue.size() = 10) output(Thread.currentThread().getName()

10、 + “ 生产队列满!等 待中“+“n“, textarea, progressbar); try / 满了就等待,生产者进程等待 this.consume(); this.wait(); catch (InterruptedException e) e.printStackTrace(); / 将生产的放入队列 queue.add(message); output(Thread.currentThread().getName() + “正在生产“ + message.getContent() + “ ,当前个数:“ + getCount()+“n“, textarea, progressba

11、r); public synchronized void consume() / 实现消费的函数 / 唤醒生产者 this.notifyAll(); / 判断队列是否为空 while (queue.size() = 0) - 6 - output(Thread.currentThread().getName() + “ 消费队列空!等 待中“+“n“, textarea, progressbar); try output(“等待生产“, textarea, progressbar); / 消费者等待 wait(); output(“结束等待!“, textarea, progressbar);

12、 catch (InterruptedException e) e.printStackTrace(); 4其它API函数 1)Sleep函数对于指定的时间间隔挂起当前的执行线程。 格式:VOID Sleep(DWORD dwMilliseconds ); 2)随机数操作决定生产消费 int num = new Random().nextInt(2); if(num = 0) threadWQ1 = new Thread(wQ1, “thread-wQ1“);/ 实例化另一个线程 threadRQ1 = new Thread(rQ1, “thread-rQ1“); Q.maxMessageNu

13、m = 100;/ 设置队列长队 threadWQ1.start(); textarea.append(“n 生产者线程已开始运行“ + “n“); threadRQ1.start(); else threadWQ1 = new Thread(wQ1, “thread-wQ1“);/ 实例化另一个线程 threadRQ1 = new Thread(rQ1, “thread-rQ1“); threadRQ1.start(); textarea.append(“n 消费者线程已开始运行“ + “n“); threadWQ1.start(); (4)调试分析 该程序总体上来看比较简单,在调试过程中只

14、要注意一些小问题,则不会出 现问题了,除了少许语法错误外,控制好程序的走向,则逻辑错误亦可避免;程 序的总体思路很清晰,最主要的就是要实现两个条件判断,即缓冲区满的时候不 允许生产者进行生产,若缓冲区空的话,则不进行消费者进行消费;在生产操作 - 7 - 和消费操作之间进行相应的判断,正好符合 PV 信号量,先做 P 操作,若满足, 则执行此进程,若不满足,则阻塞此进程,并做相应的 V 操作,即唤醒其对应的 进程,从而很好的解决了生产者消费者问题; 生产者-消费者问题的缓冲区操作限制: 1)生产者-消费者互斥使用缓冲区; 2)生产者-消费者同步之一:生产者线程先把产品加入到缓冲区,消费者线程才

15、 能从缓冲区取出产品。 3)生产者-消费者同步之二:消费者线程从缓冲区取出产品后,生产者线程才能 把产品再加入到缓冲区。 4)缓冲区满时,生产者进程需唤醒消费者进程,缓冲区空时,消费者进程需唤 醒生产者进程。 (5)测试结果 产生随机数1消费者进程先开始执行 产生随机数0生产者进程先开始执行 - 8 - 缓冲池满,唤醒消费者 缓冲池空,唤醒生产者 - 9 - - 10 - (6)使用说明 在测试数据文件中输入数据,编译程序,运行程序,可得到数据的输出。 四、实验总结四、实验总结 本实验要求模拟 PV 操作同步机构,来解决生产者消费者问题,生产者 消费者问题简单点说就是:在一个规格一定的缓冲区中

16、,生产者可以生产产 品放入缓冲区中,消费者也可以从缓冲区中取出产品,但是存在两种死锁情况, 第一件是缓冲区为空时,暂停生产开始消费;第二件是缓冲区为满时,暂停消费 开始生产。 故在做相应的生产消费操作时就需要进行判断, 到底能不能做此操作, 这便是同步机制,通过设置一对信号量,来对其操作进行合法性判断和控制,达 到两个过程可以准确无误的执行。 整个程序只需要一个子函数即可完成上述所有的功能,根据测试数据文件 - 11 - (PCdata.txt)中第一列的字符做相应的操坐,若是 P,则是生产操作,生产者 生产一个产品并送入缓冲区;若是 C,则是消费操作,消费者从缓冲区取出一个 产品进行消费;当进程全部运行结束后,则结束次程序。 通过这个实验, 我们学会了很多, 我们学会了团队合作分工, 在实验过程中, 我们各自负责各自的任务,在遇到不懂得问题的时候大

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号