课程设计说明书题目: 并发进程的模拟院系:计算机科学与工程专业班级:学号:学生姓名:指导教师:2014年 11月 12 日安徽理工大学课程设计(论文)任务书2014年11月21日安徽理工大学课程设计(论文)成绩评定表目录1问题描述 (1)2需求分析 (1)3概要设计 (2)1. P操作 (2)2. V操作 (3)3. P,V操作实现进程同步 (4)4. 功能模块设计 (5)4详细设计 (7)1.主界面的设计程序 (7)2.进程Pa的执行 (8)3.进程Pb的执行 (9)4.进程Pc的执行 (9)5.按钮的执行 (10)5 调试的分析与运行结果 (11)6 设计体会 (13)参考文献 (14)1问题描述在进程并发执行的过程中,进程之间存在协作的关系,例如,有互斥、同步的关系。
该课程设计的是了解进程同步的概念,理解信号量机制的原理,掌握运用信号量解决进程并发控制问题的方法,进而学会运用进程的同步,利用信号灯的P,V操作实现三个进程的同步。
这三个进程的同步关系如下:从上图中可以看出:任务启动后pa先执行,当它结束后,pb、pc可以开始执行,pb、pc 都执行完毕后,任务终止;设两个同步信号灯sb、sc分别表示进程pb和pc能否开始执行,其初值均为0。
在现代操作系统中,有大量的并发进程在活动,它们都处在不断的申请资源,使用资源以及其它进程的相互制约的活动中,这些进程什么时候停止运行,什么时候该继续向前推进,应根据事先的约定来规范它们的行为,这时我们可以根据同步信号灯来实现进程的同步协调工作。
例如本题中,只有pa进程顺利的进行完,Pb,Pc这两个进程才能正常的进行。
如果进程Pa在进行中出现停止或中断,则Pb和Pc是不会顺利的完成的;而进程Pb,Pc这两个进程是并行执行的,两个进程的进行是互不干扰的,只要进程Pa完成后,进程Pb和Pc才会正常执行,否则只有处在等待就绪中。
2需求分析进程执行的并发性的意义是关于一组进程的执行在是时间上是重叠的,从宏观上看,并发性反应的是一个时间段中几个进程都在同一个处理器上,处于运行还未运行结束状态。
从微观上看,任何一个时刻仅有一个进程在处理器上运行。
并发的实质是一个处理器在几个进程之间的多路复用,并发是对有限的物理资源强制行驶多用户共享,消除计算机部件之间的乎等现象,以提高系统资源利用率。
并发进程分为无关的和交往的,无关的并发进程是一组并发进程分别在不同的变量集合上操作,一个进程的执行与其他并发进程的进展无关。
引入进程是为了更好的解决实际中存在的竞态问题,进程同步的主要任务是对多个相关的进程在执行次序上进行协调,以便并发执行的诸进程之间能有效的共享资源和相互合作,从而使执行更具有可再现性。
利用进程同步可以更好地解决生活中有先后执行顺序的问题,进程的交往包括金正与写作,多个进程之间彼此相关或者是无关,二资源金正的两个控制问题一个是死锁(Deadlock)问题,一个是饥饿(Starvation)问题,系统中既要解决饥饿问题,又要解决死锁问题。
解决进程间的竞争关系(简介制约关系)的手段是进程互斥,进程互斥指的的就是资源的共享问题,以往内在同一时刻最多允许一个进程使用,其他进程必须等待,我们这个任务所需要的就是先执行其中的一个任务,在结束之后进行另外的进程。
所以我们解决这个问题的同时学习并发进程。
3概要设计1.P操作对信号灯的P操作记为P(s)。
P(s)是一个不可分割的原语操作,即取信号灯值减一,若相减结果为负,则调用P(s)的进程被阻,并插入到信号灯的等待队列中,否则可以继续执行。
P操作的主要动作:a)s值减一;b)若相减结果大于或等于0,则进程继续执行;c)若相减结果小于0,则进程被封锁,并将它插入到该信号灯的等待队列中,然后转进进程调度程序。
P操作的流程图:2.V操作对信号灯的V操作记为V(s)。
V(s)一个不可分割的原语操作,即取信号灯值加1,若相加结果大于0,进程继续执行,否则,唤醒在信号灯等待队列上的一个进程。
V操作的主要动作a)s值加一;b)若相减结果大于0,则进程继续执行;c)若相减结果小于或等于0,则从该信号灯的等待队列中移出一个进程,解除它的等待状态,然后返回本进程继续执行。
V操作的流程图:3.P,V操作实现进程同步(1)编程用信号灯的p、v操作实现这三个进程的同步。
(2)任务启动后pa先执行,当它结束后,pb、pc可以开始执行,pb、pc 都执行完毕后,任务终止。
(3)设两个同步信号灯sb、sc分别表示进程pb和pc能否开始执行,其初值均为0。
其题目的算法描述如下:4.功能模块设计本实验用JAVA语言实现(1)在Frame工程中新建一个ThreadProcess类,定义一些静态变量;主函数main()中定义一个ThreadFrame类,并构造一个对象thFrame,通过调用函数将界面,窗口展示出来;创建三个线程threadPa, threadPb, threadPc。
(2)ThreadFrame类继承JFrame类,设置每个界面的长宽,调用类方法ThreadFrame()显示一些信息。
(3)threadPanel类继承JPanel类,调用paintComponent()方法设置进程长宽以及字体等,还有threadPanel()类方法设置进程前景与背景颜色,从而展示出进程动态变化,重要一点是开始Start和暂停Stop按钮设置,控制进程开始与暂停效果。
(4)在类外分别添加三个进程类threadPa, threadPb, threadPc,都继承线程Thread类,其中各自有的控制函数run()。
程序执行能够达到实验的要求效果,程序运行后,点击Start按钮进程执行,首先进程Pa先执行,Pa结束后进程Pb和进程Pc启动开始执行,而且能够达到系统资源共享的效果,最后所有结束后告知程序结束。
如果一开始点击Stop按钮,那么进程没响应,等待点击Start按钮,这是并发进程的模拟过程并发进程的模拟中定义四个模块,实现界面进程运行过程。
程序执行能够达到实验的要求效果,程序运行后,点击Start按钮进程执行,首先进程Pa先执行,Pa结束后进程Pb和进程Pc启动开始执行,而且能够达到系统资源共享的效果,最后所有结束后告知程序结束。
并发进程的模拟功能模块流程图如图5所示。
4详细设计1.主界面的设计程序class ThreadFrame extends JFrame {public int WIDTH = 820;public int HEIGHT = 500;public threadPanel threadPanel = new threadPanel();public Container container;public ThreadFrame() {this.setTitle("模拟进程并发的过程图");this.setSize(WIDTH, HEIGHT);this.setLocation(250, 150);this.setResizable(false);container = getContentPane();container.add(threadPanel);setVisible(true);}}2.进程Pa的执行class threadPa extends Thread {public static boolean flag = true;// JProgressBar progressBar;private static int i = 0;/** public threadPa(JProgressBar progressBar) { ThreadProcess.progressBar1 = * progressBar; }*/@Overridepublic void run() {ThreadProcess.sb--;ThreadProcess.sc--;while (i <= 100) {i += 1;ThreadProcess.progressBar1.setValue(i);//System.out.println(i);try {Thread.sleep(30);// threadPa.interrupted();} catch (InterruptedException e) {e.printStackTrace();}}ThreadProcess.sb++;ThreadProcess.sc++;if (ThreadProcess.sb >= 0 && ThreadProcess.sc >= 0 ) {ThreadProcess.threadPb.start();ThreadProcess.threadPc.start();}//System.out.println(ThreadProcess.progressBar1.getValue());//System.out.println(ThreadProcess.sb);}}3.进程Pb的执行class threadPb extends Thread {public static boolean flag = true;// JProgressBar progressBar;private static int i = 0;/** public threadPb(JProgressBar progressBar) { this.progressBar =* progressBar; }*/@Overridepublic void run() {while (i <= 100) {i += 1;ThreadProcess.progressBar2.setValue(i);try {Thread.currentThread().sleep(30);} catch (InterruptedException e) {e.printStackTrace();}}}}4.进程Pc的执行class threadPc extends Thread {public static boolean flag = true;// JProgressBar progressBar;private static int i = 0;/** public threadPc(JProgressBar progressBar) { this.progressBar =* progressBar; }*/@Overridepublic void run() {while (i <= 100) {i += 1;ThreadProcess.progressBar3.setValue(i);try {Thread.currentThread().sleep(30);} catch (InterruptedException e) {e.printStackTrace();}}}5.按钮的执行public threadPanel() {setLayout(null);// 设置边框按钮的起始左上点的坐标setSize(800, 400);ThreadProcess.progressBar1 = new JProgressBar();ThreadProcess.progressBar2 = new JProgressBar();ThreadProcess.progressBar3 = new JProgressBar();// 设置start与stop按钮buttonstart1 = new JButton("Start");buttonstop1 = new JButton("Stop");ThreadProcess.progressBar1.setBackground(new Color(255, 50, 255));ThreadProcess.progressBar1.setForeground(new Color(10, 90, 90));ThreadProcess.progressBar1.setBounds(100, 70, 480, 40);buttonstart1.setBounds(600, 10, 80, 40);buttonstop1.setBounds(700, 10, 80, 40);add(ThreadProcess.progressBar1);add(buttonstart1);add(buttonstop1);buttonstart1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent arg0) {// ThreadProcess.pa();ThreadProcess.threadPa.start();/*try {ThreadProcess.threadPa.join();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}*///System.out.println(ThreadProcess.sb+"kl");/*boolean t1=ThreadProcess.threadPa.isAlive();int t2=ThreadProcess.sb;int t3=ThreadProcess.sc;int t4=ThreadProcess.progressBar1.getValue();*//*System.out.println(t1);System.out.println(t2);System.out.println(t3);*///System.out.println(ThreadProcess.temp);//if(!ThreadProcess.threadPa.isAlive()) ;//}// threadPa.flag = true;}});buttonstop1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent arg0) {threadPa.flag = false;}});ThreadProcess.progressBar2.setBackground(new Color(255, 90, 100));ThreadProcess.progressBar2.setForeground(new Color(90, 50, 90));ThreadProcess.progressBar2.setBounds(100, 190, 480, 40);add(ThreadProcess.progressBar2);ThreadProcess.progressBar3.setBackground(new Color(100, 100, 255));ThreadProcess.progressBar3.setForeground(new Color(100, 90, 90));ThreadProcess.progressBar3.setBounds(100, 300, 480, 40);add(ThreadProcess.progressBar3);}}5 调试的分析与运行结果1.初次运行程序界面运行并发进程模拟程序出现初次界面,如图6所示。