生产者与消费者算法模拟课程设计


    


    课程设计说明书



    题目 生产者消费者算法模拟





    院 系: 计算机科学工程
    专业班级: 信息安全(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)户传

    《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
    该内容是文档的文本内容,更好的格式请下载文档

    下载文档到电脑,查找使用更方便

    文档的实际排版效果,会与网站的显示效果略有不同!!

    需要 2 香币 [ 分享文档获得香币 ]

    下载文档

    相关文档

    用多线程同步方法解决生产者消费者问题操作系统课程设计

    题 目用多线程同步方法解决生产者-消费者问题(Producer-Consumer Problem)学 院计算机科学与技术学院专 业软件工程班 级姓 名 ...

    3年前   
    485    0

    操作系统课程设计银行家算法的模拟实现

    操作系统课程设计报告专业计算机科学与技术学生姓名班级学号指导教师完成日期信息工程学院题目: 银行家算法的模拟实现 一、设计目的本课程设计是学习完“操作系统原理”课程后进...

    3年前   
    682    0

    数据结构和算法课程设计题目

    XX大学课程设计课程名称: 数 据 结 构 与 算 法院(部)名 称: 信息与计算科学学院组长姓名学号 同组人员姓名指导教师姓名: 设 计 时 间: 2010.6.7-...

    11个月前   
    376    0

    操作系统课程设计编程序模拟银行家算法

    课程设计报告书 课程名称: 操作系统原理 题 目: 编程序模拟银行家算法 系 名: 信息工程系 专业班级: ...

    3年前   
    724    0

    进程调度算法的实现计算机操作系统课程设计

    题目2 进程调度算法的实现2.1 题目的主要研究内容及预期达到的目标(1)设计进程控制块; (2)设计多个进程队列; (3)设计多个进程(≥20); (4)动态生成时间片、执行时间和优先级,...

    3年前   
    580    0

    数据结构课程设计报告最小生成树Kruskal算法

    计算机科学与技术系课程设计报告 2014-2015学年第二学期课程数据结构课程设计名称Kruskal算法求最小生成树学生姓名 学号 专业班级 软件工程指导教师 2014年X月题目:设计...

    1年前   
    203    0

    操作系统课程设计磁盘调度算法

    操作系统课程设计磁盘调度算法目 录1 课程设计目的及要求……………………………………………………12 相关知识…………………………………………………………………13 ...

    3年前   
    547    0

    操作系统课程设计银行家算法报告

    《操作系统--银行家算法》课程设计报告姓 名: 学 号: 班 级:计科班 ...

    3年前   
    615    0

    操作系统课程设计磁盘调度算法

    《计算操作系统》课程设计报告 姓名: ...

    3年前   
    461    0

    合工大页面置换算法操作系统课程设计报告

    计算机与信息学院《操作系统综合设计》报告设计题目:页面置换算法学生姓名:学 号:专业班级:计算机科学与技术班2015 年 X月一、设计题目 3二、开发环境与工具 3三、设计原理 31....

    3年前   
    556    0

    《操作系统 银行家算法》课程设计报告

    《操作系统--银行家算法》课程设计报告姓 名: 学 号: 班 级: 计科班 ...

    3年前   
    808    0

    银行家算法《操作系统》课程设计报告

    《操作系统》课程设计报告课题: 银行家算法 专业计算机科学与技术学生姓名班级计算机学号指导教师信息工程...

    3年前   
    695    0

    银行消费者模拟试题

    银行消费者模拟试题 单选题 1、《个人贷款管理暂行办法》规定,贷款人应建立有效的个人贷款全流程管理机制,制订贷款管理制度及每一贷款品种的操作规程,明确相应贷款对象和范围,实施(),建立贷款...

    11年前   
    9754    0

    首次适应算法最佳适应算法

    姓名:学号:实验名称:进程调度模拟实验 实验目的:了解动态分区存储管理方式中的数据结构和分配算法,加深对动态分区存储管理方式及其实现技术的理解。实验内容:#include<iostream.h...

    3年前   
    1624    0

    算法与数据结构的商品货架管理课程设计报告(还有程序源代码)

    课程设计课 程: 算法与数据结构 题 目: 商品货架管理 专 业: 计算机类 班 级: ...

    1年前   
    322    0

    粒子群算法(优化算法)毕业设计论文

     毕 业 论 文 题 目 粒子群算法及其参数设置 专 业 信息与计算科学 班 级 ...

    5年前   
    1464    0

    银行业务模拟与离散事件模拟课程设计

     工学系课程设计报告设 计 题 目:银行业务模拟与离散事件模拟 系 别:工学系 专 业 (方 向): ...

    4年前   
    714    0

    先进生产者发言稿

    先进生产者发言稿  王树明同志是中国网络通信集团公司吉林省长春市通信分公司的一名工程师。1982年9月,他因一次意外事故导致身体高位截瘫。20多年来,他忍受着常人难以忍受的痛苦,坚守工作岗位,...

    8年前   
    440    0

    概率统计、算法

    1. 统计1. 如图是样本容量为200的频率分布直方图.根据此样本的频率分布直方图估计,样本数据落在[6,10)内的频数为_____ 642. 甲、乙两名同学在五次考试中数学成绩统计用茎叶图表...

    10年前   
    805    0

    模拟PID调节器的设计课程设计

    模拟PID调节器的设计第一章 引言PID是Proportional-Integral-Derivational的缩写,分别指比例、积分、微分。在工业过程控制的发展史上,PID控制是历史上最悠...

    1年前   
    296    0

    文档贡献者

    文***享

    贡献于2021-07-03

    下载需要 2 香币 [香币充值 ]
    亲,您也可以通过 分享原创文档 来获得香币奖励!
    下载文档

    该用户的其他文档