《读写问题在操作系统课程设计中的应用.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()+writerCount;while(dbReading=truedbWriting=true)/*假如有读者在读或者有写者在写,那么写者进行等待*/try(System.out.println(Writeriswaiting);wait();)catch(Exceptione)System.out.println(e.loString();dbWriting=true;/*有