您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 操作系统多线程同步与互斥课程设计报告
燕山大学课程设计说明书课程设计名称:操作系统题目:多道程序缓冲区协调操作班级:14计算机科学与技术1班开发小组名称:砺剑编码小组课题负责人:刘课题组成员:刘14计算机1班A14计算机1班B14计算机1班B14计算机1班C课题开发日期:2016.12.19-2016.12.301.概述1.1目的通过运用操作系统基本原理,解决进程同步控制;实现多道程序缓冲区协调操作设计,了解多线程的创建,运行原理;通过信号量机制的运用了解各线程间的协调工作机制;通过界面编程,熟练掌握可视化编程工具的能力;独立完成项目的需求分析和总体设计、详细设计,提升软件工程能力。1.2主要完成的任务如下图1所示,有多个PUT操作要不断循环地向Buffer1送字符数据,有Move1操作不断地将Buffer1的数据取到Buffer2,Move2操作不断地将Buffer1的数据取到Buffer3,有多个GET操作要不断地从Buffer2和Buffer3中取数据。PUT、MOVE、GET每次操作一个数据,为了在操作的过程中要保证数据不丢失,每个Buffer每次只能接受一个PUT或一个Move或一个Get。运用进程同步和互斥机制设计一个多道程序完成上述操作。图1Buffer操作基本功能要求:(1)可以随机产生字符数据,由put操作将数据放入Buff,buffer中容量单位是字符;(2)提供良好图形界面,显示Buffer的操作过程,可以暂停和继续系统的执行;(3)可以设定各Buffer的容量、PUT、GET、Move操作的个数;(4)可以设定PUT、GET、Move操作的速度;(5)实时显示每个Buffer中已放入的数据和数据个数,当前Buffer中数据的个数和数据的内容,空闲Buffer的空间的个数;(6)实时显示线程、进程所处于等待(阻塞)状态的个数;(7)程序运行结束,显示汇总数据,如:总的运行时间;Buffer中数据的个数;已放入BUFFER的数据个数;已取出的数据个数;平均每个buffer中的数据个数。(8)能够将每次的实验输入和实验结果存储起来,下次运行时或以后可查询。1.3使用的开发工具操作系统:Window10开发语言:Java开发环境:NetBeansIDE8.1PutMove2Buff1Buff2Buff3GetMove1Get1.4解决的主要问题(1)界面的设计;(2)界面显示各个buffer的模拟put字符,move字符和get字符操作;(3)线程间的同步和互斥问题;(4)各个线程状态的控制;(5)设置的速度、容量等参数的传递问题。2.使用的基本概念和原理2.1线程线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。线程基本上是轻量级的进程,它负责在单个程序里执行多任务。2.2多线程通常由操作系统负责多个线程的调度和执行。多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度。2.3信号量信号量是一个在一定范围内变化的整形数据,用来表示一种临界资源,线程通过信号量的值来确定自己的状态是执行还是挂起,各线程间也是通过信号量机制来协调运行顺序一起完成任务。2.4同步与互斥(1)进程同步进程同步是进程之间直接的制约关系,是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系来源于他们之间的合作。(2)进程互斥进程互斥是进程之间的间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待。只有当使用临界资源的进程退出临界区后,这个进程才会解除阻塞状态。3.总体设计3.1基本的技术路线本课程设计使用面向对象的编程语言Java,应用Java的多线程编程技术,模拟各个缓冲区之间的动作。3.2软件的总体结构、模块关系、总体流程3.2.1总体结构图2总体结构3.2.2模块关系本课程设计共创建8个类,可分为三个模块分别是界面模块,共享资源模块和Runnable接口类模块。8个类分别为主界面类Main_win,结果统计输出界面Result_win,共享资源类BUFFER,以及实现Runnable接口的5个类:BUFFER_PUT、BUFFERT_MOVE、BUFFERTH_MOVE、BUFFERT_GET、BUFFERTH_GET。各模块关系可用下图表示图3模块关系主显示界面统计结果界面结束按钮参数传递给BUFFER中各全局变量或局部变量开始,暂停,继续按钮实验数据保存到txt文件中参数设置主显示界面开始模拟put,move,get过程界面控制模块共享资源模块Runnable接口类模块线程run函数中调用共享资源模块成员函数3.2.3总体流程图4总体流程3.3创立的线程(1)据BUFFER_PUT类建立的线程体buffer1,通过buffer1建立两个线程t11、t12,模拟多个put操作。(2)据BUFFERT_MOVE类建立的线程体buffer2,通过buffer2建立两个线程t2,模拟move2操作。(3)据BUFFERTH_MOVE类建立的线程体buffer3,通过buffe3建立两个线程t3,模拟move3操作。(4)据BUFFERT_GET类和BUFFERTH_GET类建立的线程体buffer4、buffer5通过buffer4、buffer5建立4线程t41、t42,t51、t52模拟多个get操作。4.详细设计4.1主要类4.1.1Main_win类(1)成员变量s:布尔型,用于控制系统的暂停,继续等;starttime:loog型,开始运行的系统时间;endtime:loog型,结束时的系统时间gotime:loog型,运行总时间参数设置暂停模拟过程输出在主界面各线程启动开始继续结束并弹出统计结果页面关闭软件实验数据保存至txt文件初始化主界面(2)成员方法main(Stringargs[]):主函数beginActionPerformed():处理开始按钮的方法endActionPerformed():处理结束按钮的方法setokActionPerformed():处理参数设置开始按钮的方法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,实时显示各个buffer已用或剩余空间;JTextField:room1、room2、room3,ms2、ms3,gs2、gs3,用于设置各个参数。4.1.2BUFFER类(1)成员变量或对象:privatefinalchar[]buffer1=newchar[Main_win.r1]栈1的空间由设定的参数决定privatefinalchar[]buffer2=newchar[Main_win.r2]栈2的空间由设定的参数决定privatefinalchar[]buffer3=newchar[Main_win.r3]栈3的空间由设定的参数决定publicintindex1=0,index2=0,index3=0;用作角标或指针privateintEmptyFirst,EmptySecond,EmptyThird剩余空间privatestaticintfullFirst,fullSecond,fullThird当前字符数privatestaticintputnum1=0,putnum2=0,putnum3=0共放入数量privatestaticintgetnum1=0,getnum2=0,getnum3=0共取出数量staticFileWriterdatastaticBufferedWriterdatawriterstaticString[]da=newString[1000]数据保存所用变量、对象staticString[]x=newString[Main_win.r1]staticString[]y=newString[Main_win.r2]staticString[]z=newString[Main_win.r3]由于bufferi[]为char,不能添加到JTextField、JTextArea,而String类型能,所以设置String[]类型数组,经转化使char转化为String型,以将字符添加到各个JTextField、JTextArea。(2)成员方法具体实现各同步互斥动作的synchronized成员方法:put()、move1()、move2()、get2()、get3();模拟过程显示到主界面的成员方法:showPush1()、showPush2()、showPush3()、showPop1()、showPop2()、showPop3();显示数据到统计结果界面的resulewin()方法;保存数据的datasave()方法。4.1.3Runnable接口类Runnable接口类有五个,分别为:BUFFER_PUT、BUFFERT_MOVE、BUFFERTH_MOVE、BUFFERT_GET和BUFFERTH_GET类。每个类中成员对象有privateBUFFERbuff用于调用BUFFER类中的synchronized成员方法,以及使用BUFFER类中共享的变量,实现进程同步与互斥。4.1.4Resulr_win类主要构件:JTextArearesultarea显示最终统计结果。4.2进程操作所用原语4.2.1sleep():导致当前的线程等待,直到其他线程调用此对象的notify方法或notifyAll方法唤醒。4.2.2wait():在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。该线程不丢失任何监视器的所属权4.2.3notify():选择一个wait状态线程进行通知,并使它获得该对象上的锁。4.3BUFFER模块内部流程BUFFER.move()BUFFER.get()put()Buffer1中一个字符消失,Buffer2或3增加一个字符字符显示在主界面showPush1()字符显示在主界面showPush2、3()showPop1()showPop2、3()run()run()run()Put线程BUFFER.put()Move线程Get线程产生字符Buffer2或3减少一个字符图5BUFFER内部流程字符显示在主界面5.核心代码5.1BUFFER类由于move(),get()各有两组,此处只给出一组的代码;showPush(),showPop()函数共三组,三组类似,因此这里也只给出一组。packagejavaapplication7;importjava.awt.*;importjava.awt.event.*;importstaticjavaapplication7.Result_win.resultarea;importjavax.swing.*;importjava.io.*;/****@autho*ra101269*/classBUFFER{privatefinalchar[]buffer1=newchar[Main_win.r1];//栈的空间由设定的参数决定privatefinalchar[]buffer2=newchar[Main_win.r2];//栈的空间由设定的参数决定privatefinalchar[]buffer3=newchar[Main_win.r3];//栈的空间由设定的参数决定staticString[]x=newString[Main_wi
本文标题:操作系统多线程同步与互斥课程设计报告
链接地址:https://www.777doc.com/doc-1902962 .html