课程设计说明书
题目 生产者消费者算法模拟
院 系: 计算机科学工程
专业班级: 信息安全(xxxx)班
学 号:
学生姓名: xxxx
指导教师: xxxx
2013年 xx月 xx 日
xxxx学课程设计(文)务书
计算机 院系 计算机 教研室
学 号
20113xxxxx
学生姓名
xxxx
专业(班级)
xxxxx
设计题目
生产者消费者算法模拟
设
计
技
术
参
数
(1)系统作业进程数目
(2)系统资源种类数目
(3)系统作业进程类资源需求数目
(4)系统作业进程已分配资源数目
设
计
求
(1)检查系统安全状态:根系统作业进程类资源需求数目已分配资源数目等计算否存安全序列
(2)检查系统否继续某进程资源分配请求
工
作
量
求设计说明书字数3000字
工
作
计
划
201211251126 根课程设计求查找相关资料完成需求分析
201211261127 进行系统概设计
201211271128 进行系统详细设计源代码书写
201311291130 系统进行调试分析写出课程设计报告
参
考
资
料
[1] Cay SHorstmannGary Cornell编著JAVA核心技术 卷 I北京:机械工业出版社2008
[2] 郑莉编著Java语言程序设计(第二版)北京:清华学出版社2011
[3] 吕国英等编著算法设计分析北京:清华学出版社2009
[4] 马军等编软件工程项目案例实践指导 北京:清华学出版社2013
[5] 汤子瀛等编著 计算机操作系统西安:西安电子科技学出版社2011
指导教师签字
教研室签字
2012年xx月xx日
指导教师评语:
成绩:
指导教师:
年 月 日
xxxx学课程设计(文)成绩评定表
目录
1问题描述 1
11目 1
12设计求 1
2需求分析 1
3 概设计 1
31程序流程图 1
4 详细设计 2
41程序框架 2
411生产者消费者父类 2
412 生产者类 5
413 消费者类 6
414 程序入口 6
42基算法分析 7
421 wait(mutex)signal()数值信号 7
422 isBufferEmpty()isBufferFull()信号 7
423 produce()存数方法consume()取数方法 8
5 调试分析 10
51启动生产者线程测试结果分析 10
52启动消费者线程测试结果分析 11
6 户手册 11
7 测试结果 12
8 设计体会 13
参考文献 13
附录 13
1问题描述
11目
掌握信号方法PV操作定义掌握PV操作实现进程间步互斥方法加深进程步互斥概念理解
12设计求
设计程序进程创建三子进程三子进程生产者进程两消费者进程求:
l 父子进程父进程创建享存储区进行通信生产者进程数组中十数值发送5缓区组成享存中
l 两消费者进程轮流接收输出十数值时两消费者进程读出数值进行累加求
l 考虑生产者进程生产速度消费者进程速度
2需求分析
生产者消费者问题著名进程步问题然进程间步必涉进程间互斥通信问题问题解决着强现实意义现实意义类计算机中界资源互斥享生产者消费者计算机界资源访问程序户界资源印机磁带机等设备
3 概设计
31程序流程图
说明:图31 程序流程图示首先生产者消费者线程创建便访问缓区生产者缓区没线程访问缓区未满生产数存放缓区中条件没满足生产者线程进入阻塞状态消费者样需缓区没线程访问时求缓区未空缓区取数中条件满足样进入阻塞状态
生产者线程创建
消费者阻塞
生产者缓区放入数
否
否线程访问缓区
否
消费者生产者阻塞
缓区否满
否
否线程访问缓区
缓区否空
否
消费者线程创建
生产者阻塞
消费者缓区中取数
图31 程序流程图
4 详细设计
41程序框架
411生产者消费者父类
public class SuperThread extends JPanel{
定义缓区读写锁
private Lock bufferLock
享缓区
public static IntBuffer buffer IntBufferallocate(5)
生产者数组
public int array[] {1569811131073}
生产者执行次数
public static int count 0
两生产者取出数累加
public static int consumerSum 0
记录消费者取数次数
public static int consumerCount 0
存放缓区中取数
private static int consumerData
定义线程名
public String nameString
线程互斥信号值 0 表示生产者进程值 1 表示消费者进程
public static int mutex 0
* 构造函数 *
public SuperThread(String name){
完成变量初始化
}
* 获线程名 *
public String getNameString() {
return nameString
}
* 设置线程名 *
public void setNameString(String nameString) {
thisnameString nameString
}
* 获互斥信号 *
public static int getMutex() {
return mutex
}
* 设置互斥信号 *
public static void setMutex(int mutex) {
SuperThreadmutex mutex
}
* 判断否线程访问缓区没线程进行加锁 *
public boolean wait(int mutex){
if (mutex 1) {
return false
}else {
return true
}
}
* 释放进程操作完成信号实质修改mutex信号值 *
public static void signal(){
mutex 0
}
* 判断缓区否空 *
public boolean isBufferEmpty(){
根缓区中否0存判断否空
0数5空反空
}
* 判断缓区否满 *
public boolean isBufferFull(){
根缓区中否0存判断否空
0数0满反满
}
* 消费数缓区中取数 *
public void consume(){
if (wait(mutex) && isBufferEmpty()) {判断否访问缓区
加锁
bufferLocklock()
try {
设置互斥信号
缓区取数
取数缓区置0
释放互斥信号
}finally{
解锁
bufferLockunlock()
}
}
}
* 消费者取缓区数*
public int getBufferData(int index){
完成取数操作
return data
}
* 生产数缓区中存数*
public void produce(){
if (wait(mutex) && isBufferFull()) {判断否访问缓区
bufferLocklock()加锁
try{
设置互斥信号
缓区存数
释放互斥信号
}finally{
解锁
bufferLockunlock()
}
}
}
* 生产者公缓区放数*
public void putBufferData(int index){
完成想缓区存数操作
}
}
412 生产者类
public class Producer extends SuperThread implements Runnable{
生产者休眠时间
private int producerDelay
* 生产者构造函数 *
public Producer(String name) {
super(name)
}
* 获生产者休眠时间 *
public int getProducerDelay() {
return producerDelay
}
* 设置生产者休眠时间*
public void setProducerDelay(int producerDelay) {
thisproducerDelay producerDelay
}
* 线程中run函数线程启动时默认调函数*
@Override
public void run() {
线程启动缓区存数操作
}
}
413 消费者类
public class Consumer extends SuperThread implements Runnable {
* 消费者休眠时间 *
private int consumerDelay
* 消费者构造函数 *
public Consumer(String name) {
super(name)
}
* 获消费者休眠时间 *
public int getConsumerDelay() {
return consumerDelay
}
* 设置消费者休眠时间 *
public void setConsumerDelay(int consumerDelay) {
thisconsumerDelay consumerDelay
}
* 线程中run函数线程启动时默认调函数 *
@Override
public void run() {
while (true) {
线程启动缓区取数操作
}
}
414 程序入口
函数 main(String[] args) {
生产者消费者象定义producerconsumer1consumer2
设置休眠参数100020002500
创建线程producerThreadconsumer1Threadconsumer2Thread
启动线程producerThreadstart()consumer1Threadstart()
consumer2Threadstart()
}
42基算法分析
421 wait(mutex)signal()数值信号
数值信号wait(mutex)通整型值mutex设置表示缓区否已访问具体程:线程需访问缓区时先确定wait(mutex)信号值mutex值1wait(mutex)真便进行步操作mutex值0wait(mutex)真该线程阻塞线程完成缓区访问需调signal()信号信号值mutex进行释放释放mutex值1便线程够访问缓区wait(mutex)signal()代码:
public boolean wait(int mutex){wait(mutex)信号
if (mutex 1) {
return false
}else {
return true
}
}
public static void signal(){signal()信号
mutex 0
}
422 isBufferEmpty()isBufferFull()信号
述wait(mutex)信号足控制线程间步互斥必须isBufferEmpty()isBufferFull()两信号生产者信号isBufferFull()判断缓区否满wait(mutex)型号值真isBufferFull()信号值真时生产者线程缓区进行存数操作否阻塞等机会消费者样辅助信号isBufferEmpty()判断缓区否空缓区空wait(mutex)真消费者缓区进行取数操作isBufferEmpty()isBufferFull()代码:
public boolean isBufferEmpty(){判断缓区否空
int count 0
for (int i 0 i < buffercapacity() i++) {
if (bufferget(i) 0) {根缓区中0数判断缓
区0数5(缓区容量5)空 反空
count ++
}
}
if (count 5) {
return true
}else {
return false
}
}
public boolean isBufferFull(){判断缓区否满
int count 0
for (int i 0 i < buffercapacity() i++) {
if (bufferget(i) 0) {根缓区中0数判断缓
区0数5(缓区容量5) 满反满
count ++
}
}
if (count < 5) {
return false
}else {
return true
}
}
423 produce()存数方法consume()取数方法
produce()方法生产者条件满足情况缓区进行存数操作条件wait(mutex)true && isBufferFull()true消费者调consume()方法样满足样条件:wait(mutex)true && isBufferEmpty()trueproduce()consume()方法代码:
* 生产数缓区中存数*
public void produce(){
if (wait(mutex) && isBufferFull()) {
bufferLocklock()该程序段加锁防止线程访问缓区
try{
setMutex(1)线程互斥信号值mutex设置1互斥
int index 0
for (int i 0 i < buffercapacity() i++){寻找存数位置
if (bufferget(i) 0) {
index i
break
}
}
putBufferData(index)缓区中存入数
signal()释放互斥信号mutex设置0
}finally{
bufferLockunlock()解锁
}
}
}
* 消费数缓区中取数 *
public void consume(){
if (wait(mutex) && isBufferEmpty()) {
bufferLocklock()该程序段加锁防止线程访问缓区
try {
setMutex(1)线程互斥信号值mutex设置1互斥
int index 0存放序查找第0数摆
int i
for (i 0 i < buffercapacity() i++) {序查找第 0数
if (bufferget(i) 0) {
index i
break
}else if(bufferget(4) > 0){缓区满情况
index 5
}
}
consumerData getBufferData(index1)取数
consumerCount ++
if (consumerCount < 2 ) {
consumerSum consumerSum + consumerData计算两次取数
if (consumerCount 2) {
Systemoutprintln(消费者取数:+consumerSum)
consumerSum 0
consumerCount 0
}
}
bufferput(index1 0)已取数缓区重新置0
consumerPrintBufferData()输出取数缓区
signal()释放互斥信号mutex设置0
}finally{
bufferLockunlock()解锁
}
}
}
5 调试分析
51启动生产者线程测试结果分析
没启动生产者线程缓区空导致isBufferEmpty()信号真消费者线程访问缓区取数测试结果图51:
图51启动生产者线程测试结果
52启动消费者线程测试结果分析
没启动消费者启动生产者缓区未满前生产者直缓区生产数直缓区满止没消费者消费数缓区满生产者缓区生产数测试结果图52:
图52启动消费者线程测试结果
6 户手册
编写语言:JAVA
运行环境:Windows XP78 + MyElipse + JDK17
7 测试结果
根分启动生产者线程启动消费者线程分析结果正确结果出知生产者消费者算法模拟成功面出完整代码运行结果部分图片图717273:
图71
图72
图73
8 设计体会
操作系统门课程课程中讲线程必定会提生产者消费者问题问题够模拟线程间步异步线程间通信易学生理解线程关系联系
次课程设计中通编写代码实现生产者消费者算法中算法思想体现通信号函数控制线程执行算法编写程中遇许问题断调试查阅资料解决线程更深解明白操作系统通种机制实现线程间条紊执行
想说进入学学期课程设计家分组方式完成课程设计题目设计程中出现问题组员间交流讨时效时问题解决想点生活工作中会帮助
参考文献
[1] Cay SHorstmannGary Cornell编著JAVA核心技术 卷 I北京:机械工业出版社2008
[2] 郑莉编著Java语言程序设计(第二版)北京:清华学出版社2011
[3] 吕国英等编著算法设计分析北京:清华学出版社2009
[4] 马军等编软件工程项目案例实践指导 北京:清华学出版社2013
[5] 汤子瀛等编著 计算机操作系统西安:西安电子科技学出版社2011
附录
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档