读者与写者-操作系统课程设计实验报告.docx

上传人:龙*** 文档编号:145811 上传时间:2018-07-11 格式:DOCX 页数:21 大小:51.87KB
下载 相关 举报
读者与写者-操作系统课程设计实验报告.docx_第1页
第1页 / 共21页
读者与写者-操作系统课程设计实验报告.docx_第2页
第2页 / 共21页
读者与写者-操作系统课程设计实验报告.docx_第3页
第3页 / 共21页
读者与写者-操作系统课程设计实验报告.docx_第4页
第4页 / 共21页
读者与写者-操作系统课程设计实验报告.docx_第5页
第5页 / 共21页
点击查看更多>>
资源描述

1、操作系统课程设计 题目名称: 读者与写者 目录 问题描述 .34 系统设计 .59 源代码清单 .919 运行结果测试与分析 .20 总结与心得 .20 一、 问题描述 读者与写者问题主要是涉及到操作系统中的进程同步、互斥以及信号量机制的概念,可以有多个读者进程同时进行,但是当写者进程到来时,所有的读者进程都要进入等待状态,而且写者进程只能独立。 实现读者与写者的总体思路是使用多线程,每当一个读者到来时,如果当前没有写者进程正在进行,则立即开启一个读者线程,如果当前有写者正在进行,则此读者应当进入等待状态,直到写者进程完成,每当一个写者到来时,若此时有读者正在进行,则立即将正在进行的读者设置为

2、等待状态,开启写者进程,并且当下一个写者到来时,只能进入等待状态,除非当前写者完成。 进程同步与互斥: 进程互斥是多处理机系统中的典型间接作用,通常是两个或两个以上进程需要同时访问某个共享变量,在这个程序中此共享变量就是共享文件。我们一般将发生能够共享变量的程序段称为临界区。两个进程不能同时进入临界区,否则就会导致数据的不一致,产生与时间有关的错误。我们解决互斥问题时要遵循互斥和公平两个原则,即任意时刻只允许一个进程进入临界区,且不能让任意进程进入无限的等待。 进程同步是进程之间的直接作用。简单的理解就是,若有两个进程 A, B,若只有当 A 进程完成后 B 进程才能够启动,则说 A 进程与

3、B 进程是同步的。 实现同步与互斥有 多种机制,比如信号量、管程、会合、分布式系统,在这个程序中简单的用信号量来实现。 信号量 信号量机制是荷兰学者 Dijkstra 于 1955 提出的一种解决进程同步与互斥的有效工具在此机制中,信号量 S 是一个整数, S 大于等于零代表可供并发进程使用的资源数,当 S 小于零时表示正在等待使用临界区的进程数。 Dijkstra同时提出了对信号量操作的 PV 原语: P 原语操作动作: ( 1) 、 S 减一; ( 2) 、若 S 减一后仍大于或等于零,则进程继续进行。 ( 3) 、若 S 减一小于零,则进程被阻塞后进入与该信号量相对应的队列中,然后转进程

4、调度。 V 原语操作动 作: ( 1) 、 S 加一; ( 2) 、若 S 加一后结果大于零,则进程继续; ( 3) 、若 S 加一后结果小于或等于零,则从该信号的等待队列中唤醒一等待进程再返回原进程继续执行或转向进程调度。 PV 操作对于每一个进程来说,都只能进行一次,而且必须成对使用。在 PV执行期间不允许有中断发生。信号量机制分整型信号量机制、记录型信号量机制、and 型信号量机制以及信号量集,在这个程序中使用的是整型信号量机制。 假设共享文件是一个 JTextArea,在这个 JTextArea 中,可以向其写入文件,也可以从其中读取文件,遵循的原则是,多个读者可以同时进行, 但写者只

5、能单独进行,而且写者优先。当一个读者到来时,先判断有无写者正在进行,可用一个布尔变量 bwrite,当其为 true 时表示有写者正在进行,表示此时来到的读者只能进入等待状态。当其为 false 时,表示暂无写者正在进行,来到的读者可以立即开启。 读者到来:空闲情况下,直接开启一个读者,就是将共享文件中的内容简单的读取出,并且显示在相应读者的显示框中。当有读者正在进行时,由于多个读者可以同时进行,因此这种情况下也是立即开启一个读者进程,同时读取。当有写者正在进行时,由于写者优先,因此到来的读者必须进入等待状态 ,直到所有写者进程全部完成。一段时间后,这个读者应当完成,并且要释放资源,即共享文件

6、的被引用次数减一。 写者到来:空闲情况下,直接开启一个写者,由于写者只能单独进行,因此开启一个写者后要将共享区锁住,禁止其他读者或者写者进入。若此前有读者正在进行,则正在进行的读者马上进入等待状态,进入等待队列,立即将此写者开启,直到该写者完成,在从等待队列中拿出处于等待的读者继续。若此前有写者正在进行,则刚到的这个写者要进入等待队列。而且若后面还有读者到来,则当前写者完成后,要先判断写者等待队列是否为空,若写者等待队列为非 空,则应先唤醒处于等待状态的写者,直到写者等待队列为空,再去唤醒处于等待状态的读者。 这里要用到两个队列:读者等待队列,写者等待队列。 产生 java.lang.Ille

7、galMonitorStateException 异常:原因是没有注意notify(),notifyAll(),wait()方法的使用条件,如果当前的线程不是此对象锁的所有者,却调用该对象的 notify(),notifyAll(),wait()方法。解决方法是在调用 wait()的方法前加上 synchronized。 Synchronized:用 来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行改代码段。 一、 当两个并发线程访问同一个对象 Object 中的这个 synchronize( this)同步代码块时,一个时间内只能有一个线程得到执行,另一个线程必须等

8、待当前线程执行完这个代码块以后才能执行改代码块。 二、 一个线程访问 Object 的一个 synchronize( this)同步代码块时,另一个线程任然可以访问该 object 中的非 synchronize( this)同步代码块。 三、 当一个线程访问 object 的一个 synchronize( this)同步代码块时,其他线程对 object 中所有其他 synchronize( this)同步代码块的访问将被阻塞。 二、 系统设计 对于该程序的设计,总共设计三个类, Reader、 Writer、 ReaderWriter,其中读者与写者分别实现 Runnable 接口,每个读

9、者以及每个写者对应一个线程每当读者到来时,开启一个线程来处理。 package MyWork311; import javax.swing.JTextArea; /读者类,要传入一个整形参数,表是读者的序号, /主要是实现 Runnable 接口 public class Reader implements Runnable private int index;/ 表示读者的序号 private JTextArea comFile, noteArea, jta;/ 分别表示共享文件、通知栏、该读者对应的显示框,都由构造函数传入 private String content;/ 表示读者要读取的

10、内容 private static int count = 0;/ 记录读者数量 Thread t; public static int getCount() return count; /* * 构造函数,传入必要的参数 * * param index表示读者对应的序号 * param comFile表示共享文件栏 * param noteArea表示同时栏 * param jta表示该读者对应的显示框 */ public Reader(Thread t, int index, JTextArea comFile, JTextArea noteArea, JTextArea jta) thi

11、s.t = t; this.index = index; File = comFile; this.noteArea = noteArea; this.jta = jta; public synchronized void read() count+; noteArea.append(“读者 “ + index + “到来 .n“); content = comFile.getText();/ 获取内容 char c = content.toCharArray();/ String str = jta.getText();/ 显示框中已有的内容 for (int k = str.length(

12、); k c.length; k+) jta.append(“ + ck); try wait(1000);/ 等待 1 秒 catch (InterruptedException e) e.printStackTrace(); public synchronized void endRead() count-; noteArea.append(“读者 “ + index + “完成 .n“); tindex = null; if (t3 != null) t3.start(); else if (t4 != null) t4.start(); else if (t5 != null) t5.

13、start(); public void run() read(); endRead(); Writer 类,每当一个写者到来时,改变共享文件 package MyWork311; import javax.swing.JTextArea; /写者类 public class Write implements Runnable private int index;/表示写者的序号 private static boolean write = false;/当 write=true 时,表示有写者正在进行 private JTextArea comFile,noteArea,jta;/分别表示共

14、享文件、通知栏、该写者对应的显示框,都由构造函数传入 private String content;/表示写者要写入的内容 private static int matu = 1; private Thread t; public static int getMatu() return matu; public static boolean isWrite() return write;/返回 TRUE 时表示有写者正在写 /* * 构造函数,出入必要的参数 * param index表示写者的序号 * param comFile表示共享文件 * param noteArea表示通知栏 * p

15、aram jta表示写者对应的显示框 */ public Write(Thread t,int index,JTextArea comFile,JTextArea noteArea,JTextArea jta) this.t = t; this.index = index; File = comFile; this.noteArea = noteArea; this.jta = jta; public synchronized void write() matu-; noteArea.append(“写者 “+index+“到来 .n“); write = true; content = jt

16、a.getText();/获取要写入的内容 char c = content.toCharArray(); for(int k = 0;kc.length;k+) comFile.append(“+ck); try wait(1000); catch (InterruptedException e) e.printStackTrace(); public synchronized void endWrite() write = false;/表示写完成 noteArea.append(“写者 “+index+“完成 .n“); tindex+3 = null; if(tindex+4!=nul

17、l) tindex+4.start(); else if(t0!=null|t1!=null|t2!=null) if(t0!=null) t0.start(); if(t1!=null) t1.start(); if(t2!=null) t2.start(); matu+; notifyAll(); public void run() write(); endWrite(); 三、 源代码清单 package MyWork311; import java.awt.Color; import java.awt.Container; import java.awt.event.ActionEve

18、nt; import java.awt.event.ActionListener; import java.util.Collection; import java.util.Iterator; import java.util.Queue; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTextArea; /读者与

19、写者界面 public class ReaderWriter extends JFrame implements ActionListener private ImageIcon im1,im2; private JLabel jl1 = new JLabel(“共享文件 :“); private Container con = this.getContentPane();/ 获取容器 ,所有的组件加在这个容器上 private JTextArea comFile = new JTextArea();/ 共享文件显示区 private JTextArea noteArea = new JTex

20、tArea();/ 通知显示区 private JButton jb = new JButton6;/ 开启按钮,三个读者三个写者 private JTextArea jta = new JTextArea6;/ 6 个显示区 private JLabel jl = new JLabel6;/ 读者写者标志数组 private Reader list1 = new Reader3; private Write list2 = new Write3; Thread t = new Thread6; /* * param args */ public static void main(String

21、 args) new ReaderWriter(); public ReaderWriter() im1 = new ImageIcon(this.getClass().getResource(“开始 .JPG“); im2 = new ImageIcon(this.getClass().getResource(“暂停 .JPG“); this.setTitle(“读者与写者问题 “); this.setSize(800, 600); this.setDefaultCloseOperation(3); this.setLocationRelativeTo(null); con.setBackg

22、round(new Color(142, 142, 92); con.setLayout(null); con.add(jl1);/ 添加“共享文件”标志 jl1.setBounds(10, 2, 60, 20); con.add(comFile);/ 添加共享文件的显示区 comFile.setBounds(10, 25, 760, 150); comFile.setLineWrap(true); JScrollPane jsp = new JScrollPane(comFile); jsp.setBounds(10, 25, 760, 150); con.add(jsp); / comFi

23、le.setEditable(false);/不可编辑 for (int i = 0; i jb.length; i+) / 读者写者按钮以及读者写者显示区 jbi = new JButton(im1); jbi.addActionListener(this);/ 给按钮添加监听器 jbi.setActionCommand(“ + i); jtai = new JTextArea(); con.add(jbi); con.add(jtai); jbi.setBounds(10, 200 + i * 30, 30, 20); jtai.setBounds(100, 200 + i * 30, 670, 20);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文资料库 > 毕业论文

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。