1、 1 设计设计 1 1 题目题目 进程同步(读者进程同步(读者- -写者问题)写者问题) 一、一、问题描述与分析问题描述与分析 一个数据文件或记录, 可被多个进程共享, 我们把只要求读该文件的进程 称为“Reader”进程,其他进程则称为“Writer 进程”允许多个进程同时读 一个共享对象,因为读操作不会使数据文件混乱。但不允许一个 Writer 进程 和其他Reader进程或Writer进程同时访问将会引起混乱。 所谓读者写者问题, 是指保证一个 writer 进程必须与其他进程互斥地访问共享对象的同步问题。 读者写者问题可以这样的描述, 有一群写者和一群读者, 写者在写同一本 书,读者也
2、在读这本书,多个读者可以同时读这本书,但是,只能有一个写者 在写书,并且,读者必写者优先,也就是说,读者和写者同时提出请求时,读 者优先。当读者提出请求时需要有一个互斥操作,另外,需要有一个信号量 S 来当前是否可操作。 二、二、设计要求和目的设计要求和目的 1.设计要求设计要求 通过解决读者写者问题实现进程同步。 即(1)实现写-写互斥,(2)读-写互斥(3)读-读允许(4)写者优先 2. 设计设计目的目的 (l).用信号量来实现读者写者问题,掌握进程同步机制及其实现机理。 (2).理解和运用信号量、PV 原语、进程间的同步互斥关系等基本知识。 三三、背景知识背景知识 1.参考操作系统课本中
3、关于进程同步这方面的知识以及结合老师上课的 讲解,仔细研究利用信号量实现读写者问题。读者写者问题的定义如下:有一 个许多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空间; 有一些只读取这个数据区的进程(Reader)和一些只往数据区写数据的进程 2 (Writer),此外还需要满足以下条件: (1) 任意多个读进程可以同时读这个文件; (2) 一次只有一个写进程可以往文件中写; (3) 如果一个写进程正在进行操作,禁止任何读进程度文件。 我们需要分两种情况实现该问题: 读优先: 要求指一个读者试图进行读操作时, 如果这时正有其他读者在进 行操作,他可直接开始读操作,而不需要等待。
4、写优先: 一个读者试图进行读操作时, 如果有其他写者在等待进行写操作 或正在进行写操作,他要等待该写者完成写操作后才开始读操作。 本实验主要实现的是写者优先。 2.去图书馆借了对此方面有所介绍的书籍, 从网上查询解决设计过程中遇 到的疑难问题,实现设计功能。 如进程的创建 pcbCount = new PCB();/申请进程控制块 pcbCount.Id = Count+1; pcbCount.Name = “读者 1“; sequnce.add(pcbCount); Count+; 实现创建读者进程 四、四、概要设计概要设计 1. 为了实现读者和写者的读写过程,将每个读者和每个写者作为了一个
5、单独 的线程,所以设置了两个类,一个是读者类 Reader,一个是写者类 Writer. 2. 为了实现读者写者之间的写-写互斥,读-写互斥,读-读允许,需要另外一个 类 Database,类中分别用关于读者的方法和写者的方法来控制读写之间的这 种关系. (1)创建读写者类 3 public class Reader extends Thread 创建读者类 public class Writer extends Thread 创建写者类 (2)分别设置写者、读者的两个方法,开始写和结束写开始读和结束读 public synchronized int startRead()开始读 public
6、 synchronized int endReading()结束写 public synchronized void startWriting()开始写 public synchronized void endWriting()结束读 方法中用读者布尔变量dbReading和写者布尔变量dbWriting控制读写者之间 的关系,具体的控制过程在详细设计中会体现 (3)在操作系统总的 main类中为读者写者创建进程。 pcbCount = new PCB();/申请进程控制块 创建读者进程 pcbCount.Id = Count+1; pcbCount.Name = “读者 1“; sequnce.add(pcbCount); Count+; pcbCount = new PCB();/申请进程控制块 创建写者进程 pcbCount.Id = Count+1; pcbCount.Name = “写者 1“; sequnce.add(pcbCount); Count+; 五、五、详细设计详细设计