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

上传人:夺命阿水 文档编号:1128084 上传时间:2024-03-22 格式:DOCX 页数:23 大小:97.01KB
返回 下载 相关 举报
读写问题在操作系统课程设计中的应用.docx_第1页
第1页 / 共23页
读写问题在操作系统课程设计中的应用.docx_第2页
第2页 / 共23页
读写问题在操作系统课程设计中的应用.docx_第3页
第3页 / 共23页
读写问题在操作系统课程设计中的应用.docx_第4页
第4页 / 共23页
读写问题在操作系统课程设计中的应用.docx_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《读写问题在操作系统课程设计中的应用.docx》由会员分享,可在线阅读,更多相关《读写问题在操作系统课程设计中的应用.docx(23页珍藏版)》请在课桌文档上搜索。

1、票票大学课程设计汇报课程名称:操作系统亍果程设计设计题目:读者写者问题系别:计算机系专业:计算机科学与技术组别:第四组学生姓名:某某某学号:起止日期:指导教师: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 课程设计题目课程设

2、计题目:读者写者问题1.2 课程任务及规定编写程序实现读者写者算法(读一写互斥,读读容许,写写互斥)给出处理方案(包括阐明设计实现的原理,采用的数据构造等)画出程序的基本构造框图和流程图分析阐明每一部分程序00设计思绪实现源代码按期提交完整的程序代码和可执行程序根据规定完毕课程设计汇报总结1.3 课程设计思想读者-写者问题是一种经典B并发程序设计问题。有两组并发进程:读者和写者,共享文献F,规定:(D容许多种读者同步对文献执行读操作;(2)只容许一种写者对文献执行写操作;(3)任何写者在完毕写操作之前不容许其他读者或写者工作;(4)写者在执行写操作前,应让己经有0写者和读者所有退出。单纯使用信

3、号量不能处理此问题,必须引入计数器readcount对读进程记数。为了有效的处理读者写者问题,需要引进读者-写者锁,容许多名读者同步以只读0方式存取有锁保护的J对象;或一位写者以写方式存取有锁保护的对象。当一名或多名读者上锁后,此时形成读锁,写者将不能访问有锁保护的对象;当锁被祈求者用于写操作时,形成写锁,其他进程的读写操作必须等待。1.4 软硬件运行环境及开发工具本课程设计在WindoWS操作系统下,使用java语言完毕的。2、概要设计2.1 程序流程图本系统重要有读者和写者两类对象,因此系统重要针对的是这两类对象的操作。读者类对象的流程图如下:图2.1读者类对象写者类对象的流程图如下:图2

4、.2写者类对象2.2 所用原理2.2.1 并发原理进程的并发是指一组进程的执行在时间上重叠的,所谓的时间重叠是指一种进程执行第一条指令是在另一种进程执行完最终一条指令之前开始的。并发的实质是处理器在几种进程之间B多路复用,并发是对有限物理资源强制行使多顾客共享,消除计算机部件之间的互等现象,提高系统资源0运用率。并发进程也许是无关B,也也许是交互的。进程的交互必须是有控制日勺,否则会出现不对00计算成果。2.2.2 互斥操作原理互斥是指若干进程因互相争夺独占型资源而产生的竞争制约关系。并发进程中与共享变量有关的程序段称为“临界区”,共享变量所代表0资源称为“临界资源”,临界区必须以一种相对于其

5、他进程而言互相排斥0方式执行。假如可以保证一种进程在临界区执行时,不让另一种进程进入相似B临界区,即各进程对共享变量B访问是互斥B,那么,就不会引起与时间有关的错误。而为了对的而有效地使用临界资源,共享变量的并发进程应遵守临界区调度的三个原则:一次至多有一种进程进入临界区内执行;假如已经有进程在临界区中,试图进入临界区的其他进程应等待;进入临界区内进程应在有限时间内退出,以便让等待队列中B一种进程进入。总结起来有三句话:互斥使用,有空让进;忙则等待,有限等待;择一而入,算法可行。2.2.3 面向对象编程编程原理面向对象是一种新兴0程序设计措施,或者说它是一种新0程序设计范型,其基本思想是使用对

6、象,类,继承,封装,消息等基本概念来进行程序设计。它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽量运用人类的自然思维方式,强调直接以问题域(现实世界)中的事物为中心来思索问题,认识问题,并根据这些事物B本质特点,把他们抽象地表达为系统中B对象,作为系统B基本构成单位(而不是用某些与现实世界中的事物有关比较远,并且没有对应关系的其他概念来构造系统)。这可以使系统直接地映射问题域,保持问题域中事物及其互相关系的本来面貌。本课程设计中波及了两个对象,因此用面向对象的语言来编程是适合的J。我们这次用到了JaVa语言。2.2.4 锁机制原理为了处理读者和写者之间的同步互斥问

7、题,在本课程设计中要用到Java中的锁机制,这样会给编程带来很大的以便。多线程同步的实现最终依赖锁机制。我们可以想象某一共享资源是一间屋子,每个人都是一种线程。当A但愿进入房间时,他必须获得门锁,一旦A获得门锁,他进去后就立即将门锁上,于是B,C,D.就不得不在门外等待,直到A释放锁出来后,B,C,D.中B某一人抢到了该锁(详细抢法依赖于JVMB实现,可以先到先得,也可以随机挑选),然后进屋又将门锁上。这样,任一时刻最多有一人在屋内(使用共享资源)。Java语言规范内置了对多线程的支持。对于JaVa程序来说,每一种对象实例均有一把“锁”,一旦某个线程获得了该锁,别时线程假如但愿获得该锁,只能等

8、待这个线程释放锁之后。获得锁0措施只有一种,就是SynChrOniZed关键字。1 .用锁操作原语实现互斥为处理进程互斥进人临界区0问题,可为每类临界区设置一把锁,该锁有打开和关闭两种状态,进程执行临界区程序B操作按下列环节进行:关锁。先检查锁的状态,如为关闭状态,则等待其打开;如已打开了,则将其关闭,继续执行环节的操作。执行临界区程序。开锁。将锁打开,退出临界区。2 .WAIT,NOTIFY,NoTIFYALL操作原语信号量的初值可以由系统根据资源状况和使用需要来确定。在初始条件下信号量B指针项可以置为0,表达队列为空。信号量在使用过程中它0值是可变时,但只能由WA11,SlGNAL操作来变

9、化。设信号量为S,对S的WAlT操作记为WAIT(三),对它的SlGNAL操作记为SlGNAL(三)oWAIT(三):次序执行如下两个动作:1)信号量0值减L即S=S1;2)假如S20,则该进程继续执行;假如S0来实现读写互斥於J,同步容许读读同步;而写者是靠判断dbreading=truedbwriting=true来实现读写互斥和写写互斥叽读写等待是随机0,运用0是math,random。函数程序代码如下:classDatabase/*读者写者公用的资源Database类*/privatestaticfinalintNAP_TIME=5;privateintreaderCount;/记录目

10、前的读者个数*/privateintWriterCount;/*记录目前的写者个数*/privatebooleandbReading;/*显示与否有读者在读*/privatebooleandbWriing;/*显示与否有写者在写*/publicDatabase()/*构造函数*/super();FeaderCount=O;WriterCount=O;dbReading=false;dbWriting=false;/TODOAuto-generatedconstructorstubpublicstaticvoidnapping()(intsleepTime=(int)(NAP_TIME*Math

11、.random();try(Thread.sleep(sleepTime*1000);)catch(Exceptione)e.printStackTrace();)publicsynchronizedintstartRead()while(writerCount0)*假如有写者在写,那么读者进行等待*/trySystem.out.println(readeriswaiting1);wait();Icatch(Exceptione)System.out.println(e.loString();e.printStackTrace();)+readerCount;if(readerCount=l)

12、/*假如有读者读,则设置读状态为true*/dbReading=true;1returnreaderCount;)publicsynchronizedintendReading()-readerCount;if(readerCount=0)*假如没有有读者读,则设置读状态为false*/dbReading=false;)notifyA11();/*释放所有等待的线程System.out.println(,onereaderisdonereading.Count=+readerCount);returnreaderCount;)publicsynchronizedvoidsta11Writing

13、()+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=

14、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(

15、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);)1cla

16、ssWriterextendsThread*建立写者类*/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();Syst

17、em.out.println(Writer,+writerNum+iswriting);Database.napping();ServenendWritingO;System.out.println(ItisWriter+writerNum+whohasdonewriting.,);)1publicclassDatabaseServerpublicDatabaseServerOsuer();Ipublicstaticvoidmain(Stringargs)Databasedb=newDatabase();*建立四个读者对象和两个写者对象*/Readerrl=newReader(Ldb);Rea

18、derr2=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:reader1issleepingreader2iss

19、leepingreader3issleepingWriter1issleepingreader4issleepingWriter2issleepingWriter1wantstowriteWriter2wantstowriteWriteriswaitingWriter1iswritingreader3wantstoreadreaderiswaitingreader4wantstoreadreaderiswaitingreader2wantstoreadreaderiswaitingonewriterisdonewriting.Count=IItisWriter1whohasdonewritin

20、g.Writer1issleepingreaderiswaitingreaderiswaitingreaderiswaitingWriter2iswritingonewriterisdonewriting.Count=OItisWriter2whohasdonewriting.reader2isreading.Count=3reader4isreading.Count=2reader3isreading.Count=IWriter2issleepingonereaderisdonereading.Count=2Itisreader3whohasdonereadingaccordingtocou

21、nt=2reader3issleepingXekaX=X1.avrv=q1图4.1读者写者成果上图中0成果阐明:按照读者1、读者2、读者3、写者1、读者4、写者2的次序进入,最终B执行成果按写者1、写者2、读者2、4、3、10次序进行。GeneralOutputConfiguration:reader1issleepingreader3issleepingreader2issleepingWriter1issleepingreader3wantstoreadreader3isreading.Count=Ireader4issleepingWriter2issleepingreader1want

22、storeadreader1isreading.Count三2Writer2wantstowriteWriteriswaitingreader4wantstoreadreaderiswaitingWriter1wantstowriteWriteriswaitingreader2wantstoreadonereaderisdonereading.Count=IreaderiswaitingWriteriswaitingreaderiswaitingWriteriswaitingItisreader1whohasdonereadingaccordingtocount=1reader1issleep

23、ingonereaderisdonereading.Count=OItisreader3whohasdonereadingaccordingtocount=Oreader3issleepingWriter2iswritingreaderiswaitingWriteriswaitingreaderiswaitingreader1wantstoreadreaderiswaitingreader3wantstoreadreaderiswaiting图4.2读者写者成果二上图中B成果阐明:按照读者1、读者3、读者2、写者1B次序进入,最终的执行成果按读者3、读者1、写者2的次序进行。5、课程设计总结与

24、体会通过集体的努力,这次课程设计基本上可以完毕功能了,读一写互斥,读.读容许,写写互斥可以实现了,不过还存在某些局限性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总成绩教研室审核意见:教研室主任签字:教学院(系)审核意见:主任签字:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号