生产者消费者课设报告_第1页
生产者消费者课设报告_第2页
生产者消费者课设报告_第3页
生产者消费者课设报告_第4页
生产者消费者课设报告_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、 课程设计目的进行操作系统课程设计主要是在学习操作系统课程的基础上,在完成操作系统各部分实验的基础上,对操作系统的整体进行一个模拟,通过实践加深对各个部分的管理功能的认识,还能进一步分析各个部分之间的联系,最后达到对完整系统的理解。同时,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。二、 课程设计内容与要求模拟仿真“生产者-消费者”问题的解决过程及方法。通过研究Linux的进程机制和信号量,实现生产者消费者问题的并发控制。设计要求:1) 生产者与消费者均有二个以上。2) 生产者和消费者进程的数目在程序界面上可调,在运行时可随时单个增加与减少生产者与消费者。3) 生产者的生产速度与消费者的消费速度均可在程序界面调节,在运行中,该值调整后立即生效。4) 多个生产者或多个消费者之间必须有共享对缓冲区进行操作的函数代码。 5) 每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前生产者与消费者的指针位置,以及生产者和消费者线程标识符。 6) 采用可视化界面,可在运行过程中随时暂停,查看当前生产者、消费者以及有界缓冲区的状态。 生产者与消费者问题是经典进程同步问题的典型代表之一。该课程设计通过了解进程间的两种制约关系,从而理解信号量机制;通过对实例的分析和讨论,理解信号量机制实现进程的同步及互斥的方法;通过对经典进程同步问题的剖析,初步掌握运用信号量解决进程同步问题的方法。本系统的功能是根据输入的生产者进程和消费者进程(缓冲区设为了固定大小20),动态显示生产者进程从生产“产品”到放入缓冲区,消费者进程从缓冲区中取“产品”的整个过程,同时,系统也显示了整个过程中缓冲池中临界资源的变化情况。三、 系统分析与设计1、 系统分析在操作系统中, 线程有时被称为轻量级进程, 是CPU 使用的基本单位, 它与属于同一进程的其他进程共享其他代码段、数据段和其他操作系统资源。在Java 中, 线程的建立有两种方法: 继承Thread 类和实现Runnable 接口。其中, 采用实现Runnable 接口建立线程的好处是允许同时继承其他类从而实现多继承,并且在Java 中, 可采用synchronized 或Object 类的方法wait( ), notify( ), notifyAll( )来实现多线程同步。Java 多线程同步机制的实现是基于管程(Monitor)机制,在Java 中每个对象都包含一把同步锁( 管程对象) 和一个线程等待集合, 当对象生成时它们随之自动生成。线程等待集的初值为空, 同步锁的初始状态为开锁状态。 只有当对象object 的同步锁处于开锁状态时, 对象object 的synchronized 方法或以对象为同步参数的synchronized 块( 以下简称synchronized 方法( 块) ) 才允许访问对象object。当线程thread1 运行对象object 的synchronized方法( 块) 时, 首先需object 的同步锁锁上, thread1将object 上锁成功后才继续执行synchronized 方法( 块) 内语句。当synchronized 方法( 块) 正常结束或异常退出时, 同步锁解锁动作自动执行。Object 类的方法wait( ), notify( )和notifyAll( )可实现线程间的通信。当线程thread1 调用object.wait( )时, 则thread1 停止执行, 将thread1 加入object 的线程等待集, 并解锁其上锁的所有对象同步锁; 当线程thread2 调用object.notify( )时, 从object 的线程等待集中随机移出一个线程thread3 ( 在Java 语言规范中没有规定选择移出线程的算法, 由JVM实现时决定) 去参与线程调度。多个生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有20个存储单元的缓冲区,生产者进程将它所生产的产品放入缓冲区中;消费者进程可从缓冲区中取走产品去消费。利用信号量机制来实现多进程(生产者进程和消费者进程)对缓冲区(临界资源)的互斥访问。设置多进程的共享变量为临界资源,同时给它设置一个互斥信号量,多进程利用互斥信号量来完成对临界资源的互斥访问(当信号量为某个值是允许进程访问,否则则不允许进程访问),从而确保共享数据的正确性。2、 系统设计: 1) 生产者- 消费者问题的提出并发程序在设计上是有困难, 其中最大的问题是进程或者线程间的同步问题, 而生产者消费者问题是最经典的问题之一, 其描述如下: 有n 个生产者和m 个消费者, 连接在一个有k 个单位缓冲区的有界环形缓冲上, pi、cj 都是并发进程, 只要缓冲区未满, 生产者pi 生产的产品就可以投入缓冲区; 类似地, 只要缓冲区不空, 消费者进程cj 就可以从缓冲区取走并消耗产品。 2) 生产者- 消费者问题的解决模型与Java 实现在下面的Java 应用程序中, 生产者线程向缓冲区中写数据, 消费者从缓冲区中读数据, 这样, 在这个程序中同时运行的多个线程竞争同一个缓冲区资源。类Producer 是生产者模型, 其中的run( )方法中定义了生产者线程所做的操作, 循环地将生产的“产品”放入缓冲区中, 每次生产完后, 调用sleep( )方法睡眠一段随机时间, 以给其他线程执行的机会。类Consumer是消费者模型, 循环地消费“产品”, 从缓冲区中取出数据, 每次执行完消费操作后, 调用sleep( )方法睡眠一段随机时间, 以给其他线程执行的机会。同时靠着信号量:mutex、empty、full 来同步多个生产者消费者之间的操作, 表1 列出了各个类在模型中所起到的作用。在Windows中,常见的同步对象有:信号量(Semaphore)、互斥量(Mutex) 。使用这些对象都分为三个步骤,一是创建或者初始化;接着请求该同步对象,随即进入临界区,这一步对应于互斥量的上锁;最后释放该同步对象,这对应于互斥量的解锁。这些同步对象在主进程中创建,在其子线程中都可。2、1模块设计:模式还需要有一个缓冲区处于生产者和消费者之间,作为一个中介。生产者把数据放入缓冲区,而消费者从缓冲区取出数据。大概的结构如下图。生产者流程图:阻塞为空否无空缓冲区空缓冲区是结 束 解 锁缓冲区已满,请等待生产者生产产品 放入缓冲区对缓冲区加锁消费者流程图:阻塞为空否无满缓冲区满缓冲区是结 束 解 锁没有产品可消费,请等待消费者消费缓冲区内的产品对缓冲区加锁函数关系图:OSProject()函数Producer()函数Consumer()函数OSProject.formBufferPool类缓冲区wait_metux(),signal_metux()供生产者和消费者共享!2、2数据结构说明: (1)Producer类:声明并创建了Producer类, 定义了生产者的操作。 类Producer 是生产者模型, 其中的run( )方法中定义了生产者线程所做的操作, 循环地将生产的“产品”放入缓冲区中, 每次生产完后, 调用sleep( )方法睡眠一段随机时间, 以给其他线程执行的机会。(2)Consumer类:声明并创建了Consumer类,定义了消费者的操作。类Consumer是消费者模型, 循环地消费“产品”, 从缓冲区中取出数据, 每次执行完消费操作后, 调用sleep( )方法睡眠一段随机时间, 以给其他线程执行的机会。(3)两个互斥量:Full_Control:当缓冲区满时迫使生产者等待。 提供信号量full的P V 操作及其阻塞队列,及消费者阻塞队列。 Empty_Control:当缓冲区空时迫使消费者等待。提供信号量full的P V 操作及其阻塞队列,及消费者阻塞队列。 (4)BufferPool类:声明并创建了BufferPool类,定义了缓冲区的操作。提供基本数据结构、信号量mutex的P V操作及其阻塞队列。 有界缓冲区内设有20个存储单元,放入取出的产品设定为1-20个整数。对缓冲区的生产和消费操作都是互斥访问,设有互斥量mutex用来实现这个功能。(5)在实现本程序的消费生产模型时,具体地通过如下同步对象实现互斥:一个互斥量mutex,以实现生产者在查询和保留缓冲区内的下一个空位置时进行互斥。(6)程序中用到的类及每个的属性和方法: 2、3算法流程图:生产一条数据等待资源,阻塞是否可用存储单元 无 无被唤醒 有存入一条数据full数据单元加1,唤醒一个消费者生产者算法是否有数据单元 否等待资源,阻塞 有取走一条数据被唤醒empty数据单元加1,唤醒一个生产者消费数据消费者算法等待访问临界资源的线程置管程为开锁状态管程状态 locked unlocked获得管程释放管程临界资源 缓冲区算法四、模块调试与系统测试1、模块调试l 输入的形式:输入生产者、消费者的个数及速度l 输出的形式:以文本框输出的形式动态展现生产者生产和消费者消费的全过程。l 程序所能达到的功能:本系统的功能是根据输入的生产者进程和消费者进程以及缓冲区的大小,动态显示生产者进程从生产“产品”到放入缓冲区,消费者进程从缓冲区中取“产品”的整个过程,同时,系统也显示了整个过程中缓冲区中临界资源的变化情况。2、系统测试l 测试方法:黑盒测试法黑盒测试(Blackbox Testing,又称为功能测试或数据驱动测试)是把测试对象看作一个黑盒子。利用黑盒测试法进行动态测试时,需要测试软件产品的功能,不需测试软件产品的内部结构和处理过程。黑盒测试试图发现以下类型的错误:1) 功能错误或遗漏;2) 界面错误;3) 数据结构或外部数据库访问错误;4) 性能错误;5) 初始化或终止错误; 测试技术:单元测试 单元测试应用背景:它是从开发者的角度来编写的,用于确保类的每个特定方法成功执行一系列特定的任务。每一个测试都要保证对于给定的一个已知的输入应该得到所期望的输出。l 测试数据:生产者和消费者的个数初始为0,演示过程中逐个增加进程的个数和随 时改变生产者和消费者的速度。l 测试报告:测试结果如下:测试说明测试名称用多线程同步演示生产者消费者程序测试目的模拟仿真“生产者-消费者”问题的解决过程及方法测试技术单元测试测试方法黑盒测试测试用例测试内容程序各个功能实现水平测试步骤单个增加进程数目输入合法速度改变速度测试数据生产者加1消费者加13000,2000500,600预期结果程序正确运行生产消费者按输入速度执行速度明显改变测试结果与预期相符与预期相符与预期相符测试用例测试内容缓冲区存储单元变化测试步骤更改进程的数目输入合法速度改变速度测试数据进程加减1300,20003000,200预期结果缓冲区存储正常变化缓冲区存储饱和缓冲区变空测试结果与预期相符与预期相符与预期相符 3、调试分析:根据用户的实际要求对系统进行初始化并执行程序,其操作的一般流程:系统初始化(设置进程数和缓冲区的大小)、生产者生产资源并存放在缓冲区中、消费者从缓冲区中取资源和消耗资源。不足和缺陷:此程序不便于对较大的数据量的生产者消费者问题进行测试,主要由于设计上的对系统处理的数据量的限制,例如本系统初始化方面设计时将缓冲区大小限制了固定大小。没有对其中的生产者和消费者设置优先级,在生产者和消费者进程中只是以采用synchronized方法,随机的确保每个进程都能够执行,不能满足用户某些优先进程的特殊要求。五、用户手册1、使用的平台是:MyEclipse8.5 Swing/MetisseMyEclipse8.5具有如下优势:1、 快速开发新突破2、 创建杰出的用户体验3、 跨越开发周期的协作4、 采用统一整合的方式处理数据5、 体验全新的web开发工具6、 将数据库功能整合到应用程序生命周期的管理中7、 下载地址:/tool/myeclipse/17872.html、2、不需要安装但需要配置文件。下面是我的安装步骤:1解压MyEclipse8.5;解压的时候需要记住解压目录;2 选择工作环境;3. 配置文件前先确认安装jdk;4 建立目录E:AndroideclipseMyEclipse;5本程序是用Java语言编写的,在MyEclipse8.5集成开发环境中运行的。在使程序时,进行运行该程序。程序即进入运行阶段。3、 程序运行效果图:初始化界面及各种功能按钮:初始生产与消费的结果: 速度改变后生产与消费的结果:缓冲区为满时的状态缓冲区为空时的状态六、程序清单生产者:Producerpublic void run() while (count !=bp.BUFFER_SIZE) ec.wait_empty(); / 等待有空的缓冲区可用bp.wait_mutex(); / 等待缓冲区可用/ 生产产品放入缓冲区bp.bufferbp.in = i;count+;/ 生产者线程使用的下一个缓冲区索引System.out.println( 生产者 + number + 放入了 + i + 个产品);System.out.println(此时缓冲区内有 + count + 个产品);bp.signal_mutex();/ 释放缓冲池,唤醒可能存在的生产者或消费者线程fc.signal_full();/ 可用的缓冲区数量加1, 唤醒可能存在的消费者线程try int Pspeed =OSProject.PSpeed;sleep(Pspeed);/ 让线程等待一段时间再运行, 为了模拟而用 catch (InterruptedException e) System.out.println(缓冲区已满,等待消费者消费产品.);消费者 Consumer public void run() while(p.count!=0)fc.wait_full();/ 等待有装有“产品”的缓冲区可用bp.wait_mutex();/ 等待缓冲池可用/ 消费“产品”System.out.println( 消费者+number+取出了 + i+个产品);p.count-;System.out.println(此时缓冲区内有+p.count+个产品);/ 消费者线程使用的下一个缓冲区索引bp.signal_mutex();/ 释放缓冲池,唤醒可能存在的生产者或消费者线程ec.signal_empty();/ 可用的空缓冲区数量加1, 唤醒可能存在的生产者线程try int Cspeed =OSProject.CSpeed;sleep(Cspeed);/ 让线程等待一段时间再运行, 为了模拟而用 catch (InterruptedException e) System.out.println(缓冲区已空,等待生产者生产产品.); 缓冲区BufferPoolpublic static final int BUFFER_SIZE = 20;/ 设置缓冲池buffer 的互斥信号量及池中空数据缓冲区、可消费的数据缓冲区的初值public static int mutex = 1, empty = BUFFER_SIZE, full = 0;public int in = 0, out = 0;public int buffer = new intBUFFER_SIZE;public synchronized void wait_mutex() mutex-;if (mutex 0) / 其他线程正在使用缓冲池buffertry wait(); / 在本pool的阻塞队列中等待 catch (InterruptedException e) public synchronized void signal_mutex() mutex+;if (mutex = 0)notify();/ 唤醒本pool的阻塞队列中的其他等待使用缓冲池buffer 的线程两个信号量控制Empty_Controlpublic synchronized void wait_empty() BufferPool.empty-;if (BufferPool.empty 0)try wait(); catch (InterruptedException e) public synchronized void signal_empty() BufferPool.empty+;if (BufferPool.empty = 0)notify();Full_Controlpublic synchronized void wait_full() BufferPool.full-;if (BufferPool.full 0)try wait(); catch (InterruptedException e) public synchronized void signal_full() BufferPool.full+;if (BufferPool.full = 0)notify();七、体会与自我评价通过此次课程设计过程,使我通过实际实践来更加了解计算机操作系统的知识,至少比以前更加了解生产者消费者问题,应该不会出现题不会做的现象,特别是通过做“生产者消费者”经典同步问题,对进程的运行方式、以及如何确保计算机操作系统既保持同步又保持互斥的对临界资源的访问来同时进行多任务工作。通过对信号量以及管程机制的引入,使得对临界资源的 使用更加有效,多任务的准确性得以保证。从Java 的多线程机制出发, 研究了操作系统中经典的同步问题生产者消费者问题, 提出了两种解决此问题的模型, 及其Java 解决方案。提出的两个模型充分利用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论