欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    操作系统实验报告生产者消费者问题(共16页).doc

    • 资源ID:13659759       资源大小:210.50KB        全文页数:16页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    操作系统实验报告生产者消费者问题(共16页).doc

    精选优质文档-倾情为你奉上课 程 设 计 说 明 书 山 东 科 技 大 学 2014年 1 月 1 日课 程 设 计 任 务 书一、课程设计题目: 生产者消费者问题 二、课程设计主要参考资料(1)计算机操作系统(修订版)汤子瀛西安电子科技大学出版社。(2)数据结构 严蔚敏 清华大学出版社(3)操作系统概念第六版三、课程设计应解决的主要问题:(1) 了解信号量的使用 (2) 理解生产者消费者问题模型 (3) 掌握真确使用同步机制的方法 (4) 实现生产者消费者进程的互斥与同步 四、课程设计相关附件(如:图纸、软件等): 程序源代码 五、任务发出日期: 2013-12-1 课程设计完成日期: 2014-12-25 指导教师签字: 系主任签字: 指导教师对课程设计的评语成绩: 指导教师签字: 年 月 日专心-专注-专业生产者消费者问题一、设计目的1、了解信号量的使用2、加深对信号量机制的理解3、通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制.4、掌握基本的同步互斥算法,理解生产者与消费者模型5、了解多线程(多进程)的并发执行机制,线程(进程)间的同步与互斥二、设计要求1、理解生产者与消费者问题模型,掌握解决问题的算法思想2、掌握正确使用同步机制的方法 3、每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者线程的标识符. 4、 生产者和消费者各有两个以上. 5、 多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码.三、设计说明(含系统框图和(或)主要算法的流程图) 生产者流程图 消费者流程图有n个生产者和m个消费者,连接在具有k个单位缓冲区的有界环转缓冲上,故又称有界缓冲问题。其中Pi和Cj都是并发进程,只要缓冲区未满,生产者进程Pi所生产的产品就可投入缓冲区;类似地,只要缓冲区非空,消费者进程Cj就可以从缓冲区取走并消耗产品。生产者消费者问题是典型的进程同步问题,这些进程必须按照一定的生产率和消费率来访问共享缓冲区,用P、V操作解决生产者和消费者共享单缓冲区的问题,可设置两个信号量empty和full,其初值分别为1和0,empty指示能否向缓冲区放入产品,full指示能否从缓冲区取出产品。为了使其协调工作,必须使用一个信号量mutex(初值为1),以限制生产者和消费者互斥地对缓冲区进行存取,另用两个信号量empty1(初值为缓冲区大小)和full1(初值为0),以保证生产者不向已满的缓冲区中放入产品,消费者不从空缓冲区中取产品。生产者功能描述:在同一个进程地址空间内执行两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。消费者功能描述:消费者线程从缓冲区获得物品,然后释放缓冲区,当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。 在实现本程序的生产者消费者模型时,具体地通过以下同步对象实现互斥:设一个互斥量Mutex,以实现生产者在查询和保留缓冲区的下一个空位置时进行互斥。每一个生产者用一个信号量与消费者同步,通过设置Full实现,该组信号量用于表示相应产品以生产。同时用一个表示空缓冲区数目的信号量Empty进行类似的同步,指示缓冲区中是否存在空位置,以便开始生产下一个产品。 数据结构及部分函数描述类SeqSquare:对类SeqSquare的声明及其中一些函数class SeqSquarepublic:SeqSquare(int n);SeqSquare();void P(int x); /p操作void V(int x); /v操作bool IsEmpty(); /判断是否为空bool IsFull(); /判断是否已满void deca();void decb();int getSize();int getmaxSize();int gettop();int geta();int getb();protected:private:int *elements;int top,a,b,maxSize;说明:用动态整型数组*elements来代表缓冲区,不管是生产产品还是对已有产品的消费都需要访问该缓冲区。函数IsFull()用于判断缓冲区是否已满,生产者能否使用缓冲区。函数IsEmpty()用于判断缓冲区是否为空,消费者能否使用缓冲区。详细代码/ 生产者消费者1.cpp : Defines the entry point for the console application./#include "stdafx.h"#include "iostream"using namespace std;class SeqSquarepublic:SeqSquare(int n);SeqSquare();void P(int x); /p操作void V(int x); /v操作bool IsEmpty(); /判断是否为空bool IsFull(); /判断是否已满void deca();void decb();int getSize();int getmaxSize();int gettop();int geta();int getb();protected:private:int *elements;int top,a,b,maxSize;bool SeqSquare:IsEmpty() /判断是否为空return(top=-1)?true:false;bool SeqSquare:IsFull() /判断是否已满return(top>=maxSize-1)?true:false;void SeqSquare:deca()a-;void SeqSquare:decb()b-;int SeqSquare:getSize()return top+1;int SeqSquare:getmaxSize()return maxSize;int SeqSquare:gettop()return top;int SeqSquare:geta()return a;int SeqSquare:getb()return b;SeqSquare:SeqSquare(int n)top =-1;a = b =0;maxSize = n;elements = new intmaxSize;void SeqSquare:P(int x)if(IsFull()=true)a=a+1;elseelements+top = x;void SeqSquare:V(int x)if(IsEmpty()=true)b = b+1;elsex = elementstop-;void producer(SeqSquare *a) /生产者操作a->P(1);void consumer(SeqSquare *a) /消费者操作 a->V(1); SeqSquare:SeqSquare()delete elements; /缓冲区显示void showbuf(SeqSquare *a)int i=a->getSize();int main()int i,n;cout<<"请输入缓冲区大小:"<<endl;cin>>n;SeqSquare *s;s = new SeqSquare(n);while(i!=4) cout<<"请选择操作: "<<endl;cout<<"1.生产一件产品;2.消费一件产品"<<endl;cout<<"3.显示缓冲区; 4.退出系统。 "<<endl;cout<<"5.需要改变缓冲区大小! "<<endl;cin>>i;switch(i)case 1:producer(s);if (s->geta()=0)cout<<endl<<"成功生产一件商品!"<<endl<<endl;elsecout<<endl<<"没有空间供生产者生产!"<<endl<<endl;s->deca();break;case 2:consumer(s);if (s->getb()=0)cout<<endl<<"成功消费一件商品!"<<endl<<endl;elsecout<<endl<<"没有产品供消费者消费!"<<endl<<endl;break;case 3:showbuf(s);cout<<endl<<"缓冲区已占用:"<<s->getSize()<<" "<<"可用空间为:"<<(n-s->getSize()<<endl<<endl;break;case 4:cout<<endl<<"成功退出程序!"<<endl<<endl;break;case 5:cout<<endl<<"请输入缓冲区大小:"<<endl;cin>>n;s = new SeqSquare(n);cout<<endl<<"缓冲区大小已发生改变,数据已清除!"<<endl<<endl;break;default:cout<<endl<<"输入操作不正确,请重新输入!"<<endl<<endl;return 0;四、 运行结果及分析(三) 结果分析(1) 在每个程序中需要先做P,后做V,二者要成对出现,夹在二者中间的代码段就是该进程的临界区。(2) 对同步信号量full和empty的P,V操作同样必须成对出现,但它们分别位于不同的程序中。(3)无论在生产者进程中还是消费者进程中,两个P操作的次序不能颠倒:应先执行同步信号量的P操作,然后执行互斥信号量的P操作。否则可能造成进程死锁。五、 总结课程本次设计通过模拟计算机操作系统中经典的“生产者消费者问题”,巩固了我在操作系统课上所学的知识,加深了对操作系统中进程同步和互斥等问题,完成了多进程同步方法解决生产者消费者问题全部过程,结果满足设计要求。 设计过程中遇到不少困难,在反复研究老师的PPT及课本的原理后 才逐渐明晰怎样将代码实现,虽然这学期学过Java,但java不是很熟悉,因此还是选择C+语言。以前学习C+没有深入了解到线程这个概念,在学习Java的时候才知道有专门的线程类。所以我在网上也参考了其他人用C+编写尤其是关于多进程程序的设计实现。通过本次设计,我较好地掌握了通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制全过程,尤其是对多进程程序设计方法有了更深的理解,开拓了思路,锻炼了实践动手能手。

    注意事项

    本文(操作系统实验报告生产者消费者问题(共16页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开