您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 生产者消费者课设报告
1一、课程设计目的进行操作系统课程设计主要是在学习操作系统课程的基础上,在完成操作系统各部分实验的基础上,对操作系统的整体进行一个模拟,通过实践加深对各个部分的管理功能的认识,还能进一步分析各个部分之间的联系,最后达到对完整系统的理解。同时,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。二、课程设计内容与要求模拟仿真“生产者-消费者”问题的解决过程及方法。通过研究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方法(块)时,首先需object2的同步锁锁上,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)。使用这些对象都分为三个步骤,一是创建或者初始化;接着请求该同步对象,随即进入临界区,这一步对应于互斥量的上锁;最后释放该同步对象,这对应于互斥量的解锁。这些同步对象在主进程中创建,在其子线程中都可。32、1模块设计:模式还需要有一个缓冲区处于生产者和消费者之间,作为一个中介。生产者把数据放入缓冲区,而消费者从缓冲区取出数据。大概的结构如下图。生产者流程图:空缓冲区阻塞为空是否对缓冲区加锁无空缓冲区缓冲区已满,请等待生产者生产产品放入缓冲区结束解锁4消费者流程图:函数关系图:OSProject()函数Producer()函数Consumer()函数OSProject.formBufferPool类缓冲区wait_metux(),signal_metux()供生产者和消费者共享!满缓冲区阻塞为空是否对缓冲区加锁无满缓冲区没有产品可消费,请等待消费者消费缓冲区内的产品结束解锁52、2数据结构说明:(1)Producer类:声明并创建了Producer类,定义了生产者的操作。类Producer是生产者模型,其中的run()方法中定义了生产者线程所做的操作,循环地将生产的“产品”放入缓冲区中,每次生产完后,调用sleep()方法睡眠一段随机时间,以给其他线程执行的机会。(2)Consumer类:声明并创建了Consumer类,定义了消费者的操作。类Consumer是消费者模型,循环地消费“产品”,从缓冲区中取出数据,每次执行完消费操作后,调用sleep()方法睡眠一段随机时间,以给其他线程执行的机会。(3)两个互斥量:Full_Control:当缓冲区满时迫使生产者等待。提供信号量full的PV操作及其阻塞队列,及消费者阻塞队列。Empty_Control:当缓冲区空时迫使消费者等待。提供信号量full的PV操作及其阻塞队列,及消费者阻塞队列。(4)BufferPool类:声明并创建了BufferPool类,定义了缓冲区的操作。提供基本数据结构、信号量mutex的PV操作及其阻塞队列。有界缓冲区内设有20个存储单元,放入取出的产品设定为1-20个整数。对缓冲区的生产和消费操作都是互斥访问,设有互斥量mutex用来实现这个功能。(5)在实现本程序的消费生产模型时,具体地通过如下同步对象实现互斥:一个互斥量mutex,以实现生产者在查询和保留缓冲区内的下一个空位置时进行互斥。(6)程序中用到的类及每个的属性和方法:62、3算法流程图:无无有生产者算法否有消费者算法生产一条数据是否可用存储单元存入一条数据full数据单元加1,唤醒一个消费者等待资源,阻塞被唤醒是否有数据单元empty数据单元加1,唤醒一个生产者取走一条数据消费数据等待资源,阻塞被唤醒7lockedunlocked缓冲区算法四、模块调试与系统测试1、模块调试输入的形式:输入生产者、消费者的个数及速度输出的形式:以文本框输出的形式动态展现生产者生产和消费者消费的全过程。程序所能达到的功能:本系统的功能是根据输入的生产者进程和消费者进程以及缓冲区的大小,动态显示生产者进程从生产“产品”到放入缓冲区,消费者进程从缓冲区中取“产品”的整个过程,同时,系统也显示了整个过程中缓冲区中临界资源的变化情况。2、系统测试测试方法:黑盒测试法黑盒测试(Black—boxTesting,又称为功能测试或数据驱动测试)是把测试对象看作一个黑盒子。利用黑盒测试法进行动态测试时,需要测试软件产品的功能,不需测试软件产品的内部结构和处理过程。黑盒测试试图发现以下类型的错误:1)功能错误或遗漏;2)界面错误;3)数据结构或外部数据库访问错误;4)性能错误;5)初始化或终止错误;测试技术:单元测试单元测试应用背景:它是从开发者的角度来编写的,用于确保类的每个特定方法成功执行一系列特定的任务。每一个测试都要保证对于给定的一个已知的输入应该得到所期望的输出。测试数据:生产者和消费者的个数初始为0,演示过程中逐个增加进程的个数和随时改变生产者和消费者的速度。等待访问临界资源的线程管程状态获得管程释放管程置管程为开锁状态临界资源8测试报告:测试结果如下:测试说明测试名称用多线程同步演示生产者消费者程序测试目的模拟仿真“生产者-消费者”问题的解决过程及方法测试技术单元测试测试方法黑盒测试测试用例测试内容程序各个功能实现水平测试步骤单个增加进程数目输入合法速度改变速度测试数据生产者加1消费者加13000,2000500,600预期结果程序正确运行生产消费者按输入速度执行速度明显改变测试结果与预期相符与预期相符与预期相符测试用例测试内容缓冲区存储单元变化测试步骤更改进程的数目输入合法速度改变速度测试数据进程加减1300,20003000,200预期结果缓冲区存储正常变化缓冲区存储饱和缓冲区变空测试结果与预期相符与预期相符与预期相符3、调试分析:根据用户的实际要求对系统进行初始化并执行程序,其操作的一般流程:系统初始化(设置进程数和缓冲区的大小)、生产者生产资源并存放在缓冲区中、消费者从缓冲区中取资源和消耗资源。不足和缺陷:此程序不便于对较大的数据量的生产者消费者问题进行测试,主要由于设计上的对系统处理的数据量的限制,例如本系统初始化方面设计时将缓冲区大小限制了固定大小。没有对其中的生产者和消费者设置优先级,在生产者和消费者进程中只是以采用synchronized方法,随机的确保每个进程都能够执行,不能满足用户某些优先进程的特殊要求。五、用户手册1、使用的平台是:MyEclipse8.5Swing/MetisseMyEclipse8.5具有如下优势:1、快速开发新突破2、创建杰出的用户体验3、跨越开发周期的协作4、采用统一整合的方式处理数据5、体验全新的web开发工具6、将数据库功能整合到应用程序生命周期的管理中7、下载地址:、2、不需要安装但需要配置文件。下面是我的安装步骤:1.解压MyEclipse8.5;解压的时候需要记住解压目录;2.选择工作环境;3.配置文件前先确认安装jdk;4.建立目录E:\Android\eclipse\MyEclipse;5.本程序是用Java语言编写的,在MyEclipse8.5集成开发环境中运行的。在使程序时,进行运行该程
本文标题:生产者消费者课设报告
链接地址:https://www.777doc.com/doc-1845727 .html