读者写者问题,操作系统课程设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

某某大学

课程设计报告课程名称:操作系统课程设计

设计题目:读者写者问题

系别:计算机系

专业:计算机科学与技术

组别:第四组

学生姓名: 某某某学号:

起止日期:

指导教师:

目录

1、需求分析 (1)

1.1 课程设计题目 (1)

1.2课程任务及要求 (1)

1.3课程设计思想 (1)

1.4软硬件运行环境及开发工具 (2)

2、概要设计 (2)

2.1程序流程图 (2)

2.2所用原理 (3)

2.2.1 并发原理 (3)

2.2.2 互斥操作原理 (4)

2.2.3 面向对象编程编程原理 (4)

2.2.4 锁机制原理 (5)

2.2.5 线程的原理 (6)

2.2.6 读者写者问题的一般应用 (6)

3、详细设计 (6)

4、调试与操作说明 (11)

5、课程设计总结与体会 (12)

6、致谢 (13)

7、参考文献 (13)

1、需求分析

1.1课程设计题目

课程设计题目:读者写者问题

1.2课程任务及要求

编写程序实现读者写者算法(读_写互斥,读_读允许,写写互斥)

给出解决方案(包括说明设计实现的原理,采用的数据结构等)

画出程序的基本结构框图和流程图

分析说明每一部分程序的的设计思路

实现源代码

按期提交完整的程序代码和可执行程序

根据要求完成课程设计报告

总结

1.3课程设计思想

读者-写者问题是一个经典的并发程序设计问题。有两组并发进程:读者和写者,共享文件F,要求:

(1)允许多个读者同时对文件执行读操作;

(2)只允许一个写者对文件执行写操作;

(3)任何写者在完成写操作之前不允许其他读者或写者工作;

(4)写者在执行写操作前,应让已有的写者和读者全部退出。

单纯使用信号量不能解决此问题,必须引入计数器readcount对读进程记数。

为了有效的解决读者写者问题,需要引进读者-写者锁,允许多名读者同时以只读的方式存取有锁保护的对象;或一位写者以写方式存取有锁保护的对象。当一名或多名读者上锁后,此时形成读锁,写者将不能访问有锁保护的对象;当锁被请求者用于写操作时,形成写锁,其他进程的读写操作必须等待。

1.4软硬件运行环境及开发工具

本课程设计在windows操作系统下,使用java语言完成的。

2、概要设计

2.1程序流程图

本系统主要有读者和写者两类对象,所以系统主要针对的是这两类对象的操作。

读者类对象的流程图如下:

图2.1 读者类对象

写者类对象的流程图如下:

图2.2 写者类对象

2.2所用原理

2.2.1 并发原理

进程的并发是指一组进程的执行在时间上重叠的,所谓的时间重叠是指一个进程执行第一条指令是在另一个进程执行完最后一条指令之前开始的。

并发的实质是处理器在几个进程之间的多路复用,并发是对有限物理资源强制行使多用户共享,消除计算机部件之间的互等现象,提高系统资源的利用率。

并发进程可能是无关的,也可能是交互的。进程的交互必须是有控制的,否则会出现不正确的计算结果。

2.2.2 互斥操作原理

互斥是指若干进程因互相争夺独占型资源而产生的竞争制约关系。

并发进程中与共享变量有关的程序段称为“临界区”,共享变量所代表的资源称为“临界资源”,临界区必须以一种相对于其他进程而言互相排斥的方式执行。如果能够保证一个进程在临界区执行时,不让另一个进程进入相同的临界区,即各进程对共享变量的访问是互斥的,那么,就不会引发与时间有关的错误。

而为了正确而有效地使用临界资源,共享变量的并发进程应遵守临界区调度的三个原则:

一次至多有一个进程进入临界区内执行;如果已有进程在临界区中,试图进入临界区的其他进程应等待;进入临界区内进程应在有限时间内退出,以便让等待队列中的一个进程进入。总结起来有三句话:互斥使用,有空让进;忙则等待,有限等待;择一而入,算法可行。

2.2.3 面向对象编程编程原理

面向对象是一种新兴的程序设计方法,或者说它是一种新的程序设计范型,其基本思想是使用对象,类,继承,封装,消息等基本概念来进行程序设计。

它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域(现实世界)中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把他们抽象地表示为系统中的对象,作为系统的基本构成单位(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的其他概念来构造系统)。这可以使系统直接地映射问题域,保持问题域中事物及其相互关系的本来面貌。

本课程设计中涉及了两个对象,因此用面向对象的语言来编程是适合的。我们这次用到了Java语言。

2.2.4 锁机制原理

为了解决读者和写者之间的同步互斥问题,在本课程设计中要用到Java 中的锁机制,这样会给编程带来很大的方便。

多线程同步的实现最终依赖锁机制。我们可以想象某一共享资源是一间屋子,每个人都是一个线程。当A希望进入房间时,他必须获得门锁,一旦A获得门锁,他进去后就立刻将门锁上,于是B,C,D...就不得不在门外等待,直到A 释放锁出来后,B,C,D...中的某一人抢到了该锁(具体抢法依赖于JVM的实现,可以先到先得,也可以随机挑选),然后进屋又将门锁上。这样,任一时刻最多有一人在屋内(使用共享资源)。 Java语言规范内置了对多线程的支持。对于Java程序来说,每一个对象实例都有一把“锁”,一旦某个线程获得了该锁,别的线程如果希望获得该锁,只能等待这个线程释放锁之后。获得锁的方法只有一个,就是synchronized关键字。

1.用锁操作原语实现互斥

为解决进程互斥进人临界区的问题,可为每类临界区设置一把锁,该锁有打开和关闭两种状态,进程执行临界区程序的操作按下列步骤进行:

①关锁。先检查锁的状态,如为关闭状态,则等待其打开;如已打开了,则将其关闭,继续执行步骤②的操作。

②执行临界区程序。

③开锁。将锁打开,退出临界区。

2.WAIT,NOTIFY,NOTIFYALL操作原语

信号量的初值可以由系统根据资源情况和使用需要来确定。在初始条件下信号量的指针项可以置为0,表示队列为空。信号量在使用过程中它的值是可变的,但只能由WAIT,SIGNAL操作来改变。设信号量为S,对S的WAIT操作记为WAIT (S),对它的SIGNAL操作记为SIGNAL(S)。

WAIT(S):顺序执行以下两个动作:

1)信号量的值减1,即S=S-1;

2)如果S≥0,则该进程继续执行;

如果 S<0,则把该进程的状态置为阻塞态,把相应的WAITCB连人该信

号量队列的末尾,并放弃处理机,进行等待(直至其它进程在S上执行

相关文档
最新文档