操作系统多线程同步与互斥课程设计报告_第1页
操作系统多线程同步与互斥课程设计报告_第2页
操作系统多线程同步与互斥课程设计报告_第3页
操作系统多线程同步与互斥课程设计报告_第4页
操作系统多线程同步与互斥课程设计报告_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、燕山大学课程设计说明书课程设计名称:操作系统题目: 多道程序缓冲区协调操作 TOC o 1-5 h z 班级 : 14计算机科学与技术1 班开发小组名称:砺剑编码小组课题负责人:刘课题组成员:刘14 计算机 1 班 A14 计算机1 班B14 计算机 1 班 B14 计算机1 班C课题开发日期:2016.12.19-2016.12.301.概述目的通过运用操作系统基本原理,解决进程同步控制;实现多道程序缓冲区协调操作设计, 了解多线程的创建,运行原理;通过信号量机制的运用了解各线程间的协调工作机制;通过界面编程,熟练掌握可视化编程工具的能力;独立完成项目的需求分析和总体设计、详细设计,提升软件

2、工程能力。主要完成的任务如下图1所示,有多个PUT操作要不断循环地向 Buffer1送字符数据,有Move1操作不 断地将Buffer1的数据取到 Buffer2 , Move2操作不断地将 Buffer1的数据取到 Buffer3 , 有多个GETB作要不断地从 Buffer2和Buffer3 中取数据。PUT MOVE GET每次操作一 个数据,为了在操作的过程中要保证数据不丢失 ,每个Buffer每次只能接受一个 PU似一个 Move或一个Get。运用进程同步和互斥机制设计一个多道程序完成上述操作。图1 Buffer操作基本功能要求:(1)可以随机产生字符数据,由 put操作将数据放入

3、Buff , buffer中容量单位是字符;(2)提供良好图形界面,显示 Buffer的操作过程,可以暂停和继续系统的执行;(3)可以设定各Buffer的容量、PUT GET Move操作的个数;(4)可以设定PUT GET Move操作的速度;(5)实时显示每个Buffer中已放入的数据和数据个数,当前 Buffer中数据的个数和数据的内容,空闲Buffer的空间的个数;(6)实时显示线程、进程所处于等待(阻塞)状态的个数;(7)程序运行结束,显示汇总数据,如:总的运行时间;Buffer中数据的个数;已放入BUFFER 的数据个数;已取出的数据个数;平均每个buffer中的数据个数。(8)能

4、够将每次的实验输入和实验结果存储起来,下次运行时或以后可查询。使用的开发工具操作系统: Window10开发语日:Java开发环境:NetBeans IDE 8.1解决的主要问题(1)界面的设计;(2)界面显示各个 bufer的模拟put字符,move字符和get字符操作;(3)线程间的同步和互斥问题;(4)各个线程状态的控制;(5)设置的速度、容量等参数的传递问题。.使用的基本概念和原理线程线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。线程基本上 是轻量级的进程,它负责在单个程序里执行多任务。多线程通常由操作系统负责多个线程的调度和执行。多线程是这样一种机制, 它允许在程

5、序中并发执行多个指令流, 每个指令流都称为一个线程, 彼此间互相独立。线程又称为轻量级进 程,它和进程一样拥有独立的执行控制,由操作系统负责调度。信号量信号量是一个在一定范围内变化的整形数据,用来表示一种临界资源, 线程通过信号量的值来确定自己的状态是执行还是挂起,各线程间也是通过信号量机制来协调运行顺序一起完成任务。同步与互斥(1)进程同步进程同步是进程之间直接的制约关系, 是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系进程间的直接制约关系来源于他们之间的合作。(2)进程互斥进程互斥是进程之间的间接制约关系。当一个进程进入临

6、界区使用临界资源时,另一个进程必须等待。只有当使用临界资源的进程退出临界区后,这个进程才会解除阻塞状态。.总体设计基本的技术路线本课程设计使用面向对象的编程语言Java ,应用Java的多线程编程技术,模拟各个缓冲区之间的动作。软件的总体结构、模块关系、总体流程3.2.1总体结构3.2.2模块关系本课程设计共创建 8个类,可分为三个模块分别是界面模块,共享资源模块和Runnable接口类模块。8个类分别为主界面类Main_win ,结果统计输出界面 Result_win ,共享资源类 BUFFER以及实现 Runnable 接口的 5 个类:BUFFER_PUTBUFFERT_MOVEUFFE

7、RTH_MOVE BUFFERT_GETBUFFERTH_GET各模块关系可用下图表示图3模块关系3.2.3总体流程创立的线程(1)据BUFFER_PUT类建立的线程体 bufferl ,通过bufferl建立两个线程t11、t12,模拟 多个put操作。(2)据 BUFFERT_MOVE 类建立的线程体buffer2 ,通过 buffer2建立两个线程 t2,模拟move2操作。(3)据BUFFERTH_MOVE 类建立的线程体 buffer3 ,通过buffe3建立两个线程t3,模拟 move3操作。(4)据 BUFFERT_GET 类和 BUFFERTH_GET 类建立的线程体 buff

8、er4、buffer5 通过 buffer4、 buffer5建立4线程t41、t42, t51、t52模拟多个get操作。.详细设计主要类Main_win 类(1)成员变量s:布尔型,用于控制系统的暂停,继续等;starttime:loog型,开始运行的系统时间;endtime:loog型,结束时的系统时间gotime:loog型,运行总时间(2)成员方法main(String args):主函数beginActionPerformed(): 处理开始按钮的方法 endActionPerformed(): 处理结束按钮的方法 setokActionPerformed(): 处理参数设置开始按

9、钮的方法 timeActionPerformed(): 处理暂停按钮的方法 cotinueActionPerformed(): 处理继续按钮的方法 datasaveActionPerformed(): 处理保存数据按钮的方法 ( 3)主要构件JTextArea:see1、see2、see3,用于显示模拟 3个 buffer 的 put, move, get动作;JButton:begin 、 end 、 setok 、 time 、 cotinue、 datasave;JTextField: empty1 、 empty2、 empty3、 full1 、 full2 、 full3 ,实时显

10、示各个buffer 已用或剩余空间;JTextField:room1、room2、room3, ms2、ms3, gs2、gs3,用于设置各个参数。4.1.2BUFFER 类( 1)成员变量或对象:private final char buffer1 = new charMain_win.r1栈1的空间由设定的参数决定private final char buffer2 = new charMain_win.r2栈2的空间由设定的参数决定栈 3 的空间由设定的参数决定用作角标或指针private final char buffer3 = new charMain_win.r3 public i

11、nt index1 = 0,index2=0,index3=0;private int EmptyFirst,EmptySecond,EmptyThird 剩余空间 private static int fullFirst,fullSecond,fullThird 当前字符数private static int putnum1=0,putnum2=0,putnum3=0 共放入数量private static int getnum1=0,getnum2=0,getnum3=0 共取出数量static FileWriter data static BufferedWriter datawrite

12、rstatic String da=new String1000数据保存所用变量、对象static String x=new StringMain_win.r1static String y=new StringMain_win.r2static String z=new StringMain_win.r3由于buffer i口为char,不能添加到 JTextField、JTextArea,而String类型能,所以设置 String口类型数组,经转化使char转化为String型,以将字符添加到各个JTextField、JTextArea。( 2)成员方法具体实现各同步互斥动作的synch

13、ronized 成员方法:put()、 move1()、 move2()、 get2()、get3();模拟过程显示到主界面的成员方法:showPush1()、 showPush2()、 showPush3()、 showPop1()、showPop2()、 showPop3();显示数据到统计结果界面的resulewin() 方法 ;保存数据的datasave(访法。Runnable 接口类Runnable 接口类有五个,分另为:BUFFER_PUT、BUFFERT_MOVE、BUFFERTH_MOVE、 BUFFERT_GET 和 BUFFERTH_GET 类。每个类中成员对象有priva

14、te BUFFER buff 用于调用 BUFFER 类中的synchronized成员方法,以及使用 BUFFER类中共享的变量,实现进程同步与互斥。Resulr_win 类主要构件:JTextArea resultarea显示最终统计结果。进程操作所用原语sleep():导致当前的线程等待,直到其他线程调用此对象的notify方法或notifyAll方法唤醒。wait():在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。该线程不丢失任何监视器的所属权notify():选择一个wait状态线程进行通知,并使它获得该对象上的锁。BUFFER模块内部流程Put线程run()BUFFER.p

15、ut()run()showPush1()产生字符BUFFER.get(),pwZshowPush|2: 3()Buffer2 或 3 减少howPop2、3() 一个字符 showPop1()字符显示在主界面+ Buffer1中一个字 符消失,Buffer2 或3增加一个字符字符显示在主界面字符显示在主界面图5 BUFFER内部流程. 核心代码BUFFER 类由于move(), get()各有两组,此处只给出一组的代码;showPush(),showPop()函数共三组,三组类似,因此这里也只给出一组。package javaapplication7;import java.awt.*;imp

16、ort java.awt.event.*;import static javaapplication7.Result_win.resultarea;import javax.swing.*;import java.io.*;/* autho* r a101269*/class BUFFER栈的空间由设定的参数决定 栈的空间由设定的参数决定 栈的空间由设定的参数决定private final char buffer1 = new charMain_win.r1;/ private final char buffer2 = new charMain_win.r2;/ private final c

17、har buffer3 = new charMain_win.r3;/ static String x=new StringMain_win.r1;static String y=new StringMain_win.r2;static String z=new StringMain_win.r3;public int index1 = 0,index2=0,index3=0;private int EmptyFirst,EmptySecond,EmptyThird;/ 剩余空间private static int fullFirst,fullSecond,fullThird;/ 当前字符数p

18、rivate static int putnum1=0,putnum2=0,putnum3=0; / 共放入数量 private static int getnum1=0,getnum2=0,getnum3=0; / 共取出数量 static FileWriter data;/ 数据保存static BufferedWriter datawriter;public synchronized void put()char c=a;对c初始化boolean suspended=Main_win.s;/suspended 为 TRUE 则等待,为FALSE 执行if (suspended = tru

19、e)try this.wait();catch (InterruptedException e) if(index1 = buffer1.length)/ 堆栈已满,不能压栈trythis.wait();/ 等待,直到有数据出栈 catch(InterruptedException e)if(index1=0&index1buffer1.length-1)this.notify();/ 通知其他线程把数据出栈,唤醒一个wait 的线程c = (char)(Math.random()*26 + A);/随机产生26 个字母buffer1index1 = c;/ 数据入栈xindex1=Strin

20、g.valueOf(c);fullFirst=index1+1;EmptyFirst=buffer1.length-fullFirst;showPush1(c,index1);/ 调用界面显示入栈程序Main_win.full1.setText(String.valueOf(fullFirst);/int 转 StringMain_win.empty1.setText(String.valueOf(EmptyFirst);history.his.append(buffer1 put 进字符 :+xindex1+n);index1+;/ 指针向上移动 putnum1+;public synchr

21、onized void move2()boolean suspended=Main_win.s;if (suspended = true)try this.wait();catch (InterruptedException e) if(index1=buffer2.length-1)/ 堆栈无数据或满,不能出栈try this.wait();/ 等待其他线程把数据入栈catch(InterruptedException e)if(index10&index1=0&index20&index2=buffer2.length)this.notify();/ 通知其他线程入栈index2-;cha

22、r c = buffer2index2;yindex2=String.valueOf(c);fullSecond=index2;EmptySecond=buffer2.length-fullSecond;showPop2(c,index2);/ 调用界面显示出栈程序Main_win.full2.setText(String.valueOf(fullSecond);/int 转 StringMain_win.empty2.setText(String.valueOf(EmptySecond);history.his.append(buffer2 中字符 +yindex2+ 被 getn); ge

23、tnum2+;public static void showPush1(char c,int index)/字符显示在主界面String s=String.valueOf(c);Main_win.see1.append(s+n);public static void showPop1(char c,int index) int i;xindex=;Main_win.see1.setText();for(i=0;i=index;i+) if(xi!=)Main_win.see1.append(xi+n);/see1 置空后重新添加原来除move 掉的字符 public static void r

24、esulewin()/最后运行时间,放入取出数目等显示在Result_winResult_win.resultarea.setText();Result_win.resultarea.append( 运行总时间:+ Main_win.gotime+ms+n);Result_win.resultarea.append(buffer1Result_win.resultarea.append(buffer1Result_win.resultarea.append(buffer1Result_win.resultarea.append(buffer2Result_win.resultarea.appe

25、nd(buffer2Result_win.resultarea.append(buffer2Result_win.resultarea.append(buffer3Result_win.resultarea.append(buffer3Result_win.resultarea.append(buffer3 放入总数:+String.valueOf(putnum1)+n);取出总数:+String.valueOf(getnum1)+n);目前数目:+String.valueOf(fullFirst)+n);放入总数:+String.valueOf(putnum2)+n);取出总数:+Strin

26、g.valueOf(putnum2)+n);目前数目:+String.valueOf(fullSecond)+n);放入总数:+String.valueOf(putnum3)+n);取出总数:+String.valueOf(putnum3)+n);目前数目:+String.valueOf(fullThird)+n);public static void datasave()/ 保存数据tryFile f=new File(C:Usersa101269Desktop,datasave.txt);data=new FileWriter(f);datawriter = new BufferedWri

27、ter(data);String str=history.his.getText();datawriter.append(str);datawriter.flush();datawriter.close();data.close();catch (IOException e) Runnable 接口类Runnable 接口类有五个,分别为: BUFFER_PUT 、 BUFFERT_MOVE 、 BUFFERTH_MOVE 、BUFFERT_GET 和 BUFFERTH_GET 类。各个类类似,因此此处只给出BUFFER_PUT 类的BUFFER 线程代码。class BUFFER_PUT i

28、mplements Runnable/ private BUFFER buff;/ 生成的字母都保存到同步堆栈中int i;public BUFFER_PUT(BUFFER a)buff = a;public void run()for(i=0;i200;i+)buff.put();/ 把字母入栈tryThread.sleep(int)(Main_win.p1);/ 每产生一个字母后线程就随即睡眠一段时间catch(InterruptedException e) /suspended 为 TRUE 等待,即暂停Mainwin 类package javaapplication7;import j

29、ava.awt.*;import java.awt.event.*;import javax.swing.*;/* author a101269*/public class Main_win extends javax.swing.JFrame /* Creates new form Bufferwin*/static int p1,m2,m3,g2,g3,r1,r2,r3;static boolean s = false;static long starttime;static long endtime;static long gotime;public Main_win() setTitl

30、e( 生产者消费者问题);initComponents();private void beginActionPerformed(java.awt.event.ActionEvent evt) new history().setVisible(true);starttime=System.currentTimeMillis();see1.setText();see2.setText();see3.setText();full1.setText();full2.setText();full3.setText();empty1.setText();empty2.setText();empty3.se

31、tText();waitnum.setText();BUFFER buff = new BUFFER();Runnable buffer1 = new BUFFER_PUT(buff);Runnable buffer2 = new BUFFERT_MOVE(buff);Runnable buffer3 = new BUFFERTH_MOVE(buff);Runnable buffer4 = new BUFFERT_GET(buff);Runnable buffer5 = new BUFFERTH_GET(buff);Thread t11 = new Thread(buffer1);Thread

32、 t12 = new Thread(buffer1);Thread t2 = new Thread(buffer2);Thread t3 = new Thread(buffer3);Thread t41 = new Thread(buffer4);Thread t42 = new Thread(buffer4);Thread t51 = new Thread(buffer5);Thread t52 = new Thread(buffer5);t11.start();t12.start();t2.start();t3.start();t41.start();t51.start();t42.sta

33、rt();t52.start();/ TODO add your handling code here:private void endActionPerformed(java.awt.event.ActionEvent evt) s = true;endtime=System.currentTimeMillis();gotime=endtime-starttime;BUFFER buff = new BUFFER();new Result_win().setVisible(true);/ TODO add your handling code here: buff.resulewin();/

34、 结束,显示运行结果private void datasaveActionPerformed(java.awt.event.ActionEvent evt) BUFFER buff = new BUFFER();buff.datasave();JOptionPane.showMessageDialog(this, 保 存 成 功 ,JOptionPane.W ARNING_MESSAGE);/ TODO add your handling code here:private void setokActionPerformed(java.awt.event.ActionEvent evt) if

35、(ps1.getText().equals()|ms2.getText().equals()|ms3.getText().equals()|gs2.getText().equals()|gs3.getText().equals()|room1.getText().equals()|room2.getText().equals()|room3.getText().equals()JOptionPane.showMessageDialog(this, 有 未 填 项 , 提 醒 ,JOptionPane.WARNING_MESSAGE);elser1 = Integer.parseInt(room

36、1.getText();r2 = Integer.parseInt(room2.getText();r3 = Integer.parseInt(room3.getText();p1 = Integer.parseInt(ps1.getText();m2 = Integer.parseInt(ms2.getText();m3 = Integer.parseInt(ms3.getText();g2 = Integer.parseInt(gs2.getText();g3 = Integer.parseInt(gs3.getText();JOptionPane.showMessageDialog(th

37、is, 设 置 成 功 ,JOptionPane.W ARNING_MESSAGE);/ 参数设置/ / TODO add your handling code here:private void timeActionPerformed(java.awt.event.ActionEvent evt) s = true;/ TODO add your handling code here:/ 暂停private void cotinueActionPerformed(java.awt.event.ActionEvent evt) s = false; / TODO add your handli

38、ng code here:/继续public static void main(String args) java.awt.EventQueue.invokeLater(new Runnable() public void run() new Main_win().setVisible(true););Result_win 类与 history 类Result_win 类与 history 类均为界面代码,在此不再附上。. 测试时出现过的问题及其解决方法( 1 )出现数组越界错误,解决方法,通过仔细检查,修改了数组角标的参数。( 2)参数设置时有文本框为空报错,解决方法:强制要求全部参数均要设

39、置。保存实验数据后,TXT 文件中只保存了一个字符。解决方法:重新建立一个JTextArea构件显示所有记录,从这个JTextArea 中提取字符。. 软件使用说明基本功能3000 左右,并且最好不要重复。然后程序运行后,首先设置参数。各个动作的速度设置为点击确定。设置完成后点击开始按钮即可运行。需要运行的环境WindowslO 系统; Java运行环境 JRE。安装7.31 安装 JRE (java runtime environment )下载JREJRE下载地址为:/ECom/EComActionServlet;jsessionid=57F14A5CCFB2FF66742DA4C0E7F

40、D5D01。压缩包大约14M左右,下载完毕后直接安装即可。 安装程序打开Project-安装程序 -install.exe双击安装。运行找至|软件所在文件夹javaapplication7src/javaapplication7/javaapplication7.jar ,双击运行javaapplication7.jar文件可直接运行软件。操作启动运行点击【开始】按钮可直接模拟多道程序操作,并显示信息。暂停点击【暂停】即可暂停所有线程。继续点击【继续】即可暂停所有线程。统计点击【结束并统计】按钮在弹出的界面中可以查看统计信息参数设置在主界面参数设置处可以设置各个参数的值。保存数据点击【实验数据保存】按钮在弹出的界面中可以查看统计信息查看操作记录点击【开始】按钮自动弹出实时操作记录,即可查看。.运行截图8.1参数设置参数设置容量p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论