生产者消费者课设报告

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

一、课程设计目的

进行操作系统课程设计主要是在学习操作系统课程的基础上,在完成操作系统各部分实验的基础上,对操作系统的整体进行一个模拟,通过实践加深对各个部分的管理功能的认识,还能进一步分析各个部分之间的联系,最后达到对完整系统的理解。同时,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。

二、课程设计内容与要求

模拟仿真“生产者-消费者”问题的解决过程及方法。

通过研究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) 。使用这些对象都分为三个步骤,一是创建或者初始化;接着请求该同步对象,随即进入临界区,这一步对应于互斥量的上锁;最后释放该同步对象,这对应于互斥量的解锁。这些同步对象在主进程中创建,在其子线程中都可。

相关文档
最新文档