设计1题目进程同步(读者-写者问题)
一、问题描述与分析。
一个数据文件或记录,可被多个进程共享,我们把只要求读该文件的进程称为“reader”进程,其他进程则称为“writer进程”允许多个进程同时读一个共享对象,因为读操作不会使数据文件混乱。但不允许一个writer进程和其他reader进程或writer进程同时访问将会引起混乱。所谓读者写者问题,是指保证一个writer进程必须与其他进程互斥地访问共享对象的同步问题。
读者写者问题可以这样的描述,有一群写者和一群读者,写者在写同一本书,读者也在读这本书,多个读者可以同时读这本书,但是,只能有一个写者在写书,并且,读者必写者优先,也就是说,读者和写者同时提出请求时,读者优先。当读者提出请求时需要有一个互斥操作,另外,需要有一个信号量s来当前是否可操作。
二、设计要求和目的。
1.设计要求。
通过解决读者写者问题实现进程同步。
即(1)实现写-写互斥,(2)读-写互斥(3)读-读允许(4)写者优先2.设计目的。
l).用信号量来实现读者写者问题,掌握进程同步机制及其实现机理。(2).理解和运用信号量、pv原语、进程间的同步互斥关系等基本知识。
三、背景知识。
1.参考操作系统课本中关于进程同步这方面的知识以及结合老师上课的讲解,仔细研究利用信号量实现读写者问题。读者写者问题的定义如下:
有一个许多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空间;有一些只读取这个数据区的进程(reader)和一些只往数据区写数据的进程。
writer),此外还需要满足以下条件:
1)任意多个读进程可以同时读这个文件;(2)一次只有一个写进程可以往文件中写;
3)如果一个写进程正在进行操作,禁止任何读进程度文件。我们需要分两种情况实现该问题:
读优先:要求指一个读者试图进行读操作时,如果这时正有其他读者在进行操作,他可直接开始读操作,而不需要等待。
写优先:一个读者试图进行读操作时,如果有其他写者在等待进行写操作或正在进行写操作,他要等待该写者完成写操作后才开始读操作。
本实验主要实现的是写者优先。
2.去图书馆借了对此方面有所介绍的书籍,从网上查询解决设计过程中遇到的疑难问题,实现设计功能。
如进程的创建pcb[count] =new pcb();申请进程控制块。
pcb[count].id = count+1;pcb[count].name = 读者1";
实现创建读者进程。
四、概要设计。
1.为了实现读者和写者的读写过程,将每个读者和每个写者作为了一个单独的线程,所以设置了两个类,一个是读者类reader,一个是写者类writer.2.
为了实现读者写者之间的写-写互斥,读-写互斥,读-读允许,需要另外一个类database,类中分别用关于读者的方法和写者的方法来控制读写之间的这种关系。
1)创建读写者类。
public class reader extends thread {}创建读者类public class writer extends thread {}创建写者类。
2)分别设置写者、读者的两个方法,开始写和结束写开始读和结束读。
public synchronized int startread()开始读。
public synchronized int endreading()结束写public synchronized void startwriting()开始写public synchronized void endwriting()结束读。
方法中用读者布尔变量dbreading和写者布尔变量dbwriting控制读写者之间的关系,具体的控制过程在详细设计中会体现。
3)在操作系统总的main类中为读者写者创建进程。
pcb[count] =new pcb();申请进程控制块创建读者进程。
pcb[count].id = count+1;pcb[count].name = 读者1";
pcb[count] =new pcb();申请进程控制块创建写者进程。
pcb[count].id = count+1;pcb[count].name = 写者1";
五、详细设计。
为了实现读者和写者的读写过程,将每个读者和每个写者作为了一个单独的线程,所以设置了两个类,一个是读者类reader,一个是写者类writer.以读者类为例:一个读者的动作过程为由睡眠->等待->开始读->结束读->睡眠的一个循环过程,而一个写者的动作过程也为此。
读者调用方法napping()进行等待,调用startread()方法开始读,最后在调用endreading()方法结束读入,释放运行空间。写者同读者。
但是为了实现读者写者之间的写-写互斥,读-写互斥,读-读允许,需要另外一个类database,类中分别用关于读者的方法和写者的方法来控制读写之间的这种关系。
首先要实现睡眠的方法napping(),读者和写者在睡眠过程都应该是一样的,只是他们睡眠的时间不同,所以只需写出一个方法:public static void napping() catch (exception e) }readercount;if (readercount ==1)
return readercount;}
读结束时,计数需要读的读者数-1,然后释放出空间给需要工作的人。
public synchronized int endreading()
notifyall();释放出空间。
one reader is done, reading. count=" readercount);return readercount;
第三,编写关于写者的开始写和结束写方法,在开始写方法中,首先要将计数需要写的变量writercount+1,写者如果有读者或者有写者正在工作,那么就等待,如果没有就直接进入写,然后表示是否有写者在写的布尔变量dbwriting变为truepublic synchronized void startwriting()
结束时只需将writercount-1和dbwriting为false,然后释放出空间。
public synchronized void endwriting()
读者:请求读入,请求读入的读者数加一。
开始。是否有读者在读。等待。是。
否。是。
是否有写者请求写。否。读入。
读完,请求读入的读者-1
写者:开始。
请求写入请求写入的写者数加一。
写完,请求写入的写者-1
否。写入等待。
是。是否有人在工作。
六、结果分析。
点击“进程同步”
全部结果如下:
reader 1 is sleepingreader 3 is sleepingreader 4 is sleeping
reader 4 wants to read//reader 4请求读reader 4 is reading. count=1//reader 4正在读writer 2 is sleepingwriter 1 is sleepingreader 2 is sleeping
writer 1 wants to write//writer1请求写。
writer is waiting//实现进程互斥,writer1等待reader 2 wants to read
reader 2 is reading. count=2//rearder2可以直接读。
one reader is done, reading. count=1//一个读进程结束,正在读的进程还有一个it is reader 2 who has done reading according to count=1//告知是进程reader2结束writer is waitingreader 1 wants to readreader 1 is reading. count=2writer 2 wants to writewriter is waiting
reader 3 wants to readreader 3 is reading. count=3one reader is done, reading. count=2
it is reader 3 who has done reading according to count=2writer is waitingwriter is waiting
one reader is done, reading. count=1
it is reader 4 who has done reading according to count=1writer is waitingwriter is waiting
one reader is done, reading. count=0\\所有读进程结束,写进程writer1执行writer 2 is writing\\写-写互斥,writer2等待it is reader 1 who has done reading according to count=0writer is waiting
one writer is done, writing. count=1it is writer 2 who has done writing .writer 1 is writing
one writer is done, writing. count=0
it is writer 1 who has done writing ./所有写进程也最后结束。
七、总结。通过本次实验,我对读者-写者的过程有了清楚的认识,对互斥和同步有了更深一步的了解,在最开始的实验中,我没有正确理解好写者优先,当有写者等待时,读者就不能进入了,这样就没有实现读读允许,意识到了后,加了个if判断解决了这一问题。在j**a的线程的使用方法中,释放空间这个方法过去一直用的是notify(),但是由于一直是对单一的线程,这次实验中发现这个方法在这里不可行,所以即时查阅了资料用了notifyall()方法,总的来说,这次是操作系统的第一次实验,感觉最主要的是把脉络理清楚,写**的工作要比理清。
脉络简单。课程设计提高了我对所学知识的综合应用能力,全面检查并掌握所学的内容,培养独立思考、刻苦钻研的精神,在分析问题、解决问题的过程中,更是获得一种成功的喜悦,进而增加学习和应用的兴趣。同时也要督促自己在学习的过程中不断的完善自我,加强自己的动手操作能力,培养我的独立思考的那种思维方式。
课程设计和平时的实验课比较起来有很大的差距,实验课只是将这一章的一部分内容练习操作一遍,而课程设计需要的是他们综合起来的东西,这要更难一些。总之,每一次课程设计不仅是我们学习的好机会,而且是我们锻炼实际动手能力的平台,虽然有难度的东西总会让人很抵触,比如在课设过程中有很多郁闷的时候,一个小小的错误一不小心就花去了自己一上午的时间,所以在这个过程中能够磨练人的意志与耐心,最后感谢老师的指导与监督。
操作系统课程设计
课程设计 河北大学工商学院。装。订。线。操作系统课程设计。题目 操作系统课程设计 学院工商学院 学部信息科学与工程 专 操作系统课程设计。题目 操作系统课程设计 学院工商学院 学部信息科学与工程 专业计算机类 学号 姓名。指导教师。年 6 月 24 日。设备管理 2 2.1设计任务2 2.2设计要求...
操作系统课程设计
银行家算法模拟。系别 班级 组员 银行家算法模拟。1.课程设计目的。通过本次课程设计,加深对最经典的避免死锁的银行家算法的理解,掌握死锁形成必要条件 安全状态等概念的理解,通过用c语言编程模拟该算法,并在windows平台上实现,更好地掌握操作系统的原理及实现方法。2.任务及要求。设n为系统进程的个...
操作系统课程设计
学生实习实训报告。实习类型 操作系统课程设计 学号 0901110005 学生姓名 田兴杰 指导教师 曹春梅 专业班级 信息安全技术0901班 院 部 电子信息系 2011年 1 月 7日。实习实训成绩评定表。目录。目录3 摘要4关键字4 1.1虚拟机简介5 1.1.1 一般意义的虚拟机5 1.1....