操作系统课程设计报告—多进程同步橘子苹果问题

更新时间:2023-11-16 07:30:02 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

操作系统课程设计报告

院(系): 计算机工程学院 专业: 计算机科学与技术专业 学生姓名: __ 班级:__ 学号:

题目: 用多进程同步方法演示“桔子-苹果”问题____ 起迄日期: _2012.07.02_--2012.07.13_ ____ 设计地点: 现代教育中心 指 导 教 师: 熊晓芸

2011—2012年度 第 2 学期 完成日期: 2012 年 7 月 13 日

一、 课程设计目的

本次实验进行操作系统课程设计的主要任务是模拟生产者和消费者的一个衍生,即

实现“橘子-苹果问题”。这个问题中有两个生产者,分别生产苹果核橘子,有两个消费者,分别消费橘子和苹果。同时,因为两个生产者和两个消费者对同一个缓冲区进行操作,所以应互斥的访问缓冲区以保证程序的正确性。本次实验的目的就是加深各个进程正确有效的对资源的访问,即同步和互斥。同时掌握信号量在互斥访问中的使用。掌握生产者和消费者问题的流程和实现方法。同时提高编程的能力、对问题的解决能力及查阅文档的能力。

二、 课程设计内容与要求

1、通过研究Linux的进程同步机制和信号量,实现特殊的生产者与消费者问题的并发控制。

2、说明:有两类生产者,一类负责生产桔子,一类负责生产苹果;有两类消费者,一类负责消费桔子,一类负责消费苹果;他们共享一个有20个存储单元的有界缓冲区,每个存储单元只能放入一种产品(桔子/苹果)。 3、设计要求:

1) 二类生产者与二类消费者数目均为20,即20个生产者负责生产桔子,20个生产者

负责生产苹果;20个消费者负责消费桔子,20个消费者负责消费苹果

2) 二类生产者的生产速度与二类消费者的消费速度均可独立在程序界面调节,在运行

中,该值调整后立即生效

3) 多个生产者或多个消费者之间必须有共享对缓冲区进行操作的函数代码,同时需要

考虑算法的效率性

4) 每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、

当前生产者与消费者的指针位置,以及生产者和消费者线程标识符

5) 采用可视化界面,可在运行过程中随时暂停,查看当前生产者、消费者以及有界缓

冲区的状态

三、 系统分析与设计

1、系统分析

1.此次任务是实现特殊生产者和消费者的演示程序,所需要处理的信息是生产者和消费者的个数,生产苹果、橘子和消费苹果、橘子的速度控制,缓冲区中橘子和苹果的个数和当前生产、消费指针的位置。

2.程序中需要处理缓冲区的动态显示、生产者和消费者的速度可以调节,生产者和消费者个数可以改变。为了实现界面的友好性,应该对用户标明清楚各个模块的作用。同时实时的对程序进行暂停和停止。演示程序中用图形显示的方法描述缓冲区的使用情况,即当前缓冲区有多少个苹果和橘子,还有生产和消费者的指针。

3.系统对外的界面如下:

可以调节橘子和苹果的生产速度和消费苹果和橘子的速度,在文本框中输入相应的速度,再按下修改按键即可实现速度的实时调节。

在苹果生产者、橘子生产者、苹果消费者、橘子消费者中实现对个数按钮的按下即可动态实时的调节生产者和消费者的个数的调节。

在界面的最下面点击开始按钮,程序开始运行,暂停按钮使程序暂停挂起,再点击则可以继续运行。停止按钮实现此次程序的演示结束。

4.此次使用java平台实现,保证了程序在各种机器的运行,只需要事前建立java的运行环境即可,便于程序的移植

5.系统界面如下:

- 1 -

动态显示区 程序速度控制区 生产者和消费者数字调节 开始、暂停、终止按键区

2、系统设计: 2.1、模块设计:

系统主模块 主界面模块 生产者控制模块 消费者控制模块块 有缓区制块 界冲控模人工智能模块

- 2 -

主界面模块 绘图 模块 动态进度条 生产者数目调节 消费者数目调节 生产者速度调节 消费者速度调节

2.2、数据结构说明:

1.缓冲区的数据结构:双端队列

说明:左端放置生产苹果的指针,右端放置生产橘子的指针。

苹果指针 缓冲区 橘子指针

2.缓冲区操作的类图,实现对缓冲区的实际操作

同步信号量 empty full 缓冲区MyStorage 苹果指针pointapple 橘子指针pointorange 互斥信号量 mutex 缓冲区状态isFull 生产苹 果 increaseapple() 生产橘子 increaseorange() 消费苹果 decreaseapple() 消费橘子 decreaseorange()

2.3、算法流程图:

1.生产苹果算法

- 3 -

申请空缓冲区

2.消费苹果算法

信号量empty大于0 N Y 线程阻塞 pointapple = pointapple+1 isFull[applepoint] = true Pool[pointapple] = 1 打印缓冲区状态 apple=apple+1 full=full+1 释放缓冲区 申请空缓冲区 full=full+1 信号量full大于0 N Y 线程阻塞 pointapple = pointapple-1 isFull[applepoint] = false Pool[pointapple] = 0 打印缓冲区状态 apple=apple-1empty=empty+1 释放缓冲区 - 4 -

本文来源:https://www.bwwdw.com/article/v5hv.html

Top