欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOCX文档下载  

    读写问题在操作系统课程设计中的应用.docx

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

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

    读写问题在操作系统课程设计中的应用.docx

    票票大学课程设计汇报课程名称:操作系统亍果程设计设计题目:读者写者问题系别:计算机系专业:计算机科学与技术组别:第四组学生姓名:某某某学号:起止日期:指导教师:1、需求分析11.1课程设计题目11.2课程任务及规定11.3课程设计思想11.4软硬件运行环境及开发工具22、概要设计22.1程序流程图22.2所用原理42.2.1并发原理42.2.2互斥操作原理52.2.3面向对象编程编程原理52.2.4锁机制原理62.2.5线程的原理72.2.6读者写者问题日勺一般应用83、详细设计84、调试与操作阐明175、课程设计总结与体会186、道谢197、参照文献191、需求分析1.1 课程设计题目课程设计题目:读者写者问题1.2 课程任务及规定编写程序实现读者写者算法(读一写互斥,读读容许,写写互斥)给出处理方案(包括阐明设计实现的原理,采用的数据构造等)画出程序的基本构造框图和流程图分析阐明每一部分程序00设计思绪实现源代码按期提交完整的程序代码和可执行程序根据规定完毕课程设计汇报总结1.3 课程设计思想读者-写者问题是一种经典B¾并发程序设计问题。有两组并发进程:读者和写者,共享文献F,规定:(D容许多种读者同步对文献执行读操作;(2)只容许一种写者对文献执行写操作;(3)任何写者在完毕写操作之前不容许其他读者或写者工作;(4)写者在执行写操作前,应让己经有0写者和读者所有退出。单纯使用信号量不能处理此问题,必须引入计数器readcount对读进程记数。为了有效的处理读者写者问题,需要引进读者-写者锁,容许多名读者同步以只读0方式存取有锁保护的J对象;或一位写者以写方式存取有锁保护的对象。当一名或多名读者上锁后,此时形成读锁,写者将不能访问有锁保护的对象;当锁被祈求者用于写操作时,形成写锁,其他进程的读写操作必须等待。1.4 软硬件运行环境及开发工具本课程设计在WindoWS操作系统下,使用java语言完毕的。2、概要设计2.1 程序流程图本系统重要有读者和写者两类对象,因此系统重要针对的是这两类对象的操作。读者类对象的流程图如下:图2.1读者类对象写者类对象的流程图如下:图2.2写者类对象2.2 所用原理2.2.1 并发原理进程的并发是指一组进程的执行在时间上重叠的,所谓的时间重叠是指一种进程执行第一条指令是在另一种进程执行完最终一条指令之前开始的。并发的实质是处理器在几种进程之间B多路复用,并发是对有限物理资源强制行使多顾客共享,消除计算机部件之间的互等现象,提高系统资源0运用率。并发进程也许是无关B,也也许是交互的。进程的交互必须是有控制日勺,否则会出现不对0¾0计算成果。2.2.2 互斥操作原理互斥是指若干进程因互相争夺独占型资源而产生的竞争制约关系。并发进程中与共享变量有关的程序段称为“临界区”,共享变量所代表0资源称为“临界资源”,临界区必须以一种相对于其他进程而言互相排斥0方式执行。假如可以保证一种进程在临界区执行时,不让另一种进程进入相似B¾临界区,即各进程对共享变量B¾访问是互斥B¾,那么,就不会引起与时间有关的错误。而为了对的而有效地使用临界资源,共享变量的并发进程应遵守临界区调度的三个原则:一次至多有一种进程进入临界区内执行;假如已经有进程在临界区中,试图进入临界区的其他进程应等待;进入临界区内进程应在有限时间内退出,以便让等待队列中B¾一种进程进入。总结起来有三句话:互斥使用,有空让进;忙则等待,有限等待;择一而入,算法可行。2.2.3 面向对象编程编程原理面向对象是一种新兴0程序设计措施,或者说它是一种新0程序设计范型,其基本思想是使用对象,类,继承,封装,消息等基本概念来进行程序设计。它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽量运用人类的自然思维方式,强调直接以问题域(现实世界)中的事物为中心来思索问题,认识问题,并根据这些事物B¾本质特点,把他们抽象地表达为系统中B对象,作为系统B¾基本构成单位(而不是用某些与现实世界中的事物有关比较远,并且没有对应关系的其他概念来构造系统)。这可以使系统直接地映射问题域,保持问题域中事物及其互相关系的本来面貌。本课程设计中波及了两个对象,因此用面向对象的语言来编程是适合的J。我们这次用到了JaVa语言。2.2.4 锁机制原理为了处理读者和写者之间的同步互斥问题,在本课程设计中要用到Java中的锁机制,这样会给编程带来很大的以便。多线程同步的实现最终依赖锁机制。我们可以想象某一共享资源是一间屋子,每个人都是一种线程。当A但愿进入房间时,他必须获得门锁,一旦A获得门锁,他进去后就立即将门锁上,于是B,C,D.就不得不在门外等待,直到A释放锁出来后,B,C,D.中B¾某一人抢到了该锁(详细抢法依赖于JVMB¾实现,可以先到先得,也可以随机挑选),然后进屋又将门锁上。这样,任一时刻最多有一人在屋内(使用共享资源)。Java语言规范内置了对多线程的支持。对于JaVa程序来说,每一种对象实例均有一把“锁”,一旦某个线程获得了该锁,别时线程假如但愿获得该锁,只能等待这个线程释放锁之后。获得锁0措施只有一种,就是SynChrOniZed关键字。1 .用锁操作原语实现互斥为处理进程互斥进人临界区0¾问题,可为每类临界区设置一把锁,该锁有打开和关闭两种状态,进程执行临界区程序B¾操作按下列环节进行:关锁。先检查锁的状态,如为关闭状态,则等待其打开;如已打开了,则将其关闭,继续执行环节的操作。执行临界区程序。开锁。将锁打开,退出临界区。2 .WAIT,NOTIFY,NoTIFYALL操作原语信号量的初值可以由系统根据资源状况和使用需要来确定。在初始条件下信号量B¾指针项可以置为0,表达队列为空。信号量在使用过程中它0值是可变时,但只能由WA11,SlGNAL操作来变化。设信号量为S,对S的WAlT操作记为WAIT(三),对它的SlGNAL操作记为SlGNAL(三)oWAIT(三):次序执行如下两个动作:1)信号量0¾值减L即S=S1;2)假如S20,则该进程继续执行;假如S<0,则把该进程B状态置为阻塞态,把对应B¾WAITCB连人该信号量队列的末尾,并放弃处理机,进行等待(直至其他进程在S上执行SlGNAL操作,把它释放出来为止)。SIGNAL(三):次序执行如下两个动作2.2.5 线程的原理线程是进程中的实体,一种进程可以拥有多种线程,一种线程必须有一种父进程。线程不拥有系统资源,只有运行必须的某些数据构造;它与父进程的其他线程共享该进程所拥有日勺所有资源。线程可以创立和撤销线程,从而实现程序的并发执行。一般,线程具有就绪、阻塞和运行三种基本状态。2.2.6 读者写者问题日勺一般应用读者写者是经典的并发程序设计问题,它的措施可以普遍用于多线程B¾同步互斥问题,对于共享资源出现B¾问题做出了很好B¾处理,使得事物并发的效率更高,类似的问题尚有生产者-消费者问题,剪发师问题等等。3、详细设计本次课程设计采用的是java语言编写,因此要用到类,包括读者类和写者类,它们都是继承的线程Thread类,在主程序中创立类对象(读者对象和写者对象),用线程来实现并发读者类对象和写者类对象B¾公共属性包括:privatestaticfinalintNAP_TIME=5;privateintreaderCount;privateintWriterCount;privatebooleandbReading;privatebooleandbWriting;通过NAP_TIME调整线程随机休息时间通过readercount和writercount来记录读者和写者线程0¾个数通过dbreading和dbwriting来判断读者和写者的状态,其中读者是靠判断writercount>0来实现读写互斥於J,同步容许读读同步;而写者是靠判断dbreading=truedbwriting=true来实现读写互斥和写写互斥叽读写等待是随机0¾,运用0¾是math,random。函数程序代码如下:classDatabase/*读者写者公用的资源Database类*/privatestaticfinalintNAP_TIME=5;privateintreaderCount;/"记录目前的读者个数*/privateintWriterCount;/*记录目前的写者个数*/privatebooleandbReading;/*显示与否有读者在读*/privatebooleandbWriing;/*显示与否有写者在写*/publicDatabase()/*构造函数*/super();FeaderCount=O;WriterCount=O;dbReading=false;dbWriting=false;/TODOAuto-generatedconstructorstubpublicstaticvoidnapping()(intsleepTime=(int)(NAP_TIME*Math.random();try(Thread.sleep(sleepTime*1000);)catch(Exceptione)e.printStackTrace();)publicsynchronizedintstartRead()while(writerCount>0)*假如有写者在写,那么读者进行等待*/trySystem.out.println("readeriswaiting'1);wait();Icatch(Exceptione)System.out.println(e.loString();e.printStackTrace();)+readerCount;if(readerCount=l)/*假如有读者读,则设置读状态为true*/dbReading=true;1returnreaderCount;)publicsynchronizedintendReading()-readerCount;if(readerCount=0)*假如没有有读者读,则设置读状态为false*/dbReading=false;)notifyA11();/*释放所有等待的线程System.out.println(,onereaderisdonereading.Count="+readerCount);returnreaderCount;)publicsynchronizedvoidsta11Writing()+writerCount;while(dbReading=truedbWriting=true)/*假如有读者在读或者有写者在写,那么写者进行等待*/try(System.out.println("Writeriswaiting");wait();)catch(Exceptione)System.out.println(e.loString();dbWriting=true;/*有写者在写,则设置写状态为true*/)publicsynchronizedvoidendWriting()-WriterCount;*由于每次只有一种写者在写,因此结束写操作后写者个数一定为0*/dbWriting=false;/*没有写者写,则设置写状态为false*/System.out.println(',onewriterisdonewriting.Count="+writerCount);notifyA11();*释放所有等待的线程*/classReaderextendsThread(*建立读者类*/privateDatabaseserver;privateintreaderNum;publicReader(intr,Databasedb)super();readerNum=r;server=db;)publicvoidrun()intc;while(true)System.out.println("reader"+readerNum+"issleeping");Database.napping();System.out.println("reader"+readerNum+"wantstoread");c=server.startRead();System.out.println("reader"+readerNum+"isreading.Count="+c);Database.napping();c=sen,er.endRcading();System.out.println(,'Itisreader"+readerNum+whohasdonereadingaccordingtocount=',+c);)1classWriterextendsThread*建立写者类*/privateDatabaseserver;privateintwrilerNum;publicWriter(intw,Databasedb)supcr();writerNum=w;server=db;publicvoidrun()while(true)System.out.println("Writer"+writerNum+"issleeping");Database.napping();System.out.println("Writer,'+writerNum+"wantstowrite");server.slartVriting();System.out.println("Writer',+writerNum+"iswriting");Database.napping();ServenendWritingO;System.out.println("ItisWriter+writerNum+"whohasdonewriting.,');)1publicclassDatabaseServerpublicDatabaseServerOsuer();Ipublicstaticvoidmain(Stringargs)Databasedb=newDatabase();*建立四个读者对象和两个写者对象*/Readerrl=newReader(Ldb);Readerr2=newReader(2,db);Readerr3=newReader(3,db);Readerr4=newReader(4,db);Writerwl=newWriter(Ldb);Writerw2=newWriter(2,db);rl.starl();r2.start();r3.start();wl.start();r4.start();w2.start();4、调试与操作阐明由于读写等待是随机日勺因此也许出现多中状况,读写日勺次序也许会不一样样,如下是几种不一样的运行成果:GeneralOutputConfiguration:<Default>reader1issleepingreader2issleepingreader3issleepingWriter1issleepingreader4issleepingWriter2issleepingWriter1wantstowriteWriter2wantstowriteWriteriswaitingWriter1iswritingreader3wantstoreadreaderiswaitingreader4wantstoreadreaderiswaitingreader2wantstoreadreaderiswaitingonewriterisdonewriting.Count=IItisWriter1whohasdonewriting.Writer1issleepingreaderiswaitingreaderiswaitingreaderiswaitingWriter2iswritingonewriterisdonewriting.Count=OItisWriter2whohasdonewriting.reader2isreading.Count=3reader4isreading.Count=2reader3isreading.Count=IWriter2issleepingonereaderisdonereading.Count=2Itisreader3whohasdonereadingaccordingtocount=2reader3issleepingXekaX=X1.av'¥r>>v>=q1图4.1读者写者成果上图中0成果阐明:按照读者1、读者2、读者3、写者1、读者4、写者2的次序进入,最终B执行成果按写者1、写者2、读者2、4、3、10次序进行。GeneralOutputConfiguration:<Default>reader1issleepingreader3issleepingreader2issleepingWriter1issleepingreader3wantstoreadreader3isreading.Count=Ireader4issleepingWriter2issleepingreader1wantstoreadreader1isreading.Count三2Writer2wantstowriteWriteriswaitingreader4wantstoreadreaderiswaitingWriter1wantstowriteWriteriswaitingreader2wantstoreadonereaderisdonereading.Count=IreaderiswaitingWriteriswaitingreaderiswaitingWriteriswaitingItisreader1whohasdonereadingaccordingtocount=1reader1issleepingonereaderisdonereading.Count=OItisreader3whohasdonereadingaccordingtocount=Oreader3issleepingWriter2iswritingreaderiswaitingWriteriswaitingreaderiswaitingreader1wantstoreadreaderiswaitingreader3wantstoreadreaderiswaiting图4.2读者写者成果二上图中B¾成果阐明:按照读者1、读者3、读者2、写者1B¾次序进入,最终的执行成果按读者3、读者1、写者2的次序进行。5、课程设计总结与体会通过集体的努力,这次课程设计基本上可以完毕功能了,读一写互斥,读.读容许,写写互斥可以实现了,不过还存在某些局限性B地方,例如不可以实现读者优先或者写者优先,也许出现长时间等待日勺状况,在这次课程设计后,我们会继续努力将功能完善。这次我们的收获就是懂得了使用Java这样的面向对象的语言来实现线程同步互斥问题,懂得了JaVa中的锁机制,这对后来的编程有很大的协助,同步也深入加深了对操作系统此类问题的理解。6、道谢感谢一学期来老师给我们的J教导,让我们对操作系统有了整体的理解,这对我们后来0学习有很大的协助,对于这次课程设计,老师也给了我们充足0支持和理解,是您对我们B¾指导协助我们可以顺利的完毕这次课程设计。7、参照文献1费翔林,骆斌.操作系统教程(第4版)M.北京:高等教育出版社,2023.2李尊朝,苏军.JaVa语言程序设计(第二版)M.中国铁道出版社,2023.指导教师评语:指导教师签名:年月日成绩评估项目权重成绩1、设计过程中出勤、学习态度等方面0.12、设计技术水平0.43、安全程度及可操作程度0.24、设计汇报书写及图纸规范程度0.3总成绩教研室审核意见:教研室主任签字:教学院(系)审核意见:主任签字:

    注意事项

    本文(读写问题在操作系统课程设计中的应用.docx)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

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




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开