计算机操作系统实验进程与并发执行.docx
- 文档编号:3525895
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:14
- 大小:93.12KB
计算机操作系统实验进程与并发执行.docx
《计算机操作系统实验进程与并发执行.docx》由会员分享,可在线阅读,更多相关《计算机操作系统实验进程与并发执行.docx(14页珍藏版)》请在冰点文库上搜索。
计算机操作系统实验进程与并发执行
重庆交通大学
综合性设计性实验报告
班级:
计科专业2010级四班
姓名:
*************************
实验项目名称:
模拟进程并发执行
实验项目性质:
操作系统多任务
实验所属课程:
计算机操作系统
实验室(中心):
语音大楼8楼801
指导教师:
***************************
实验完成时间:
2012年11月4日
一、实验目的
1、通过实验来模拟进程的并发执行,来深入了解什么事操作系统的进程,以及进程有些什么特性。
2、了解进程间是如何做到并发执行的,进程间是如何做到资源共享的。
以及验证进程在运行过程中的进度是随机的,不可控制的。
3、通过实验来了解进程的三种状态以及状态间的转换条件。
4、加深对进程概念的理解;
5、认识进程并发执行的实质
6、分析进程争用资源的现象,学习解决进程互斥的方法。
二、实验内容及要求
用直观的方式模拟进程执行时的过程,显示在屏幕上。
实现一个能够直观反应单个进程执行与多个进程并发执行时由于资源竞争而引起的进程执行速度变化的过程。
且进程的初始状态和进度都是随机的,不可控制的。
三、实验设备
PC机1台、JCreatorLE开发环境
四、设计方案
㈠设计主要思想
(1)、每个进程能够随机暂停和开始。
(2)、用Java的多线程来实现。
模拟多线程并发性。
通过进度条来表示进程的运行,通过进度条的运行速度来表示程序的运行速度。
而要体现多进程并发,所以需要在实验中至少定义两个以上的进程,在实验中定义3个进程并发执行。
为了使3个进程的属性和调度方法都是顺利执行,则可以通过三个进程类来分别控制进程对象。
进程的启动时进程的速度是随机性。
要模拟这样一个效果,则可以使用一个随机数对象产生一个随机的数来定义进程运行的位置。
而某个进程的运行速度也是随机的,由进程获得资源的多少来实现。
㈡设计的主要步骤
本实验用java语言实现
(1)在Jcreator中新建一个ThreadProcess类,分别建立三个公共的线程类,Thread1,Thread2,Thread3.
(2)在ThreadProcess类的主函数啊中新建三个线程和和窗口。
(3)在主函数产生随机数来控制三条线程的随机调用过程。
(4)在类外分别添加三条进程的控制函数。
能够达到实验的要求效果,程序启动后,进程的运行位置是随机的,每一个进程的运行进度也是随机的,速度可快可慢。
而且能够达到系统资源共享的效果,但其中一个或几个进程停止执行时,其它的进程的执行速度会加快。
五、主要代码
//packagetest;
importjava.awt.*;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.sql.Time;
importjava.util.Calendar;
importjava.util.Date;
importjava.util.Random;
importjavax.security.auth.kerberos.KerberosKey;
importjavax.swing.*;
publicclassThreadProcess{
publicstaticvoidmain(String[]args){
ThreadFramethFrame=newThreadFrame();
thFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thFrame.show();
//创建线程
thread1=newThread1(ThreadPanel.progressBar1);
thread2=newThread2(ThreadPanel.progressBar2);
thread3=newThread3(ThreadPanel.progressBar3);
//Thread1.flag=false;
//Thread2.flag=false;
//Thread3.flag=false;
inti=0,j=0;
int[]array=newint[1000];
Randomrandom=newRandom(System.currentTimeMillis());
for(i=0;i<1000;i++)
{
j=(int)(Math.random()*10%3);
array[i]=j;
}
while(true)
{
for(i=0;i<1000;i++)
{
switch(array[i]){
case0:
if(thread1.flag==true){
thread1.run();
}
else{
thread1.yield();
}
break;
case1:
if(thread2.flag==true){
thread2.run();
}
else{
thread2.yield();
}
break;
case2:
if(thread3.flag==true){
thread3.run();
}
else{
thread3.yield();
}
break;
}
}
}
}
publicstaticThread1thread1;
publicstaticThread2thread2;
publicstaticThread3thread3;
}
classThreadFrameextendsJFrame
{
publicintWIDTH=820;
publicintHEIGHT=500;
publicThreadPanelthreadPanel=newThreadPanel();
publicContainercontainer;
publicThreadFrame()
{
setTitle("模拟进程并发");
setSize(WIDTH,HEIGHT);
setLocation(250,150);
container=getContentPane();
container.add(threadPanel);
}
}
classThreadPanelextendsJPanel
{
publicstaticJProgressBarprogressBar1;
publicstaticJProgressBarprogressBar2;
publicstaticJProgressBarprogressBar3;
JButtonbuttonstart1;
JButtonbuttonstop1;
JButtonbuttonstart2;
JButtonbuttonstop2;
JButtonbuttonstart3;
JButtonbuttonstop3;
publicvoidpaintComponent(Graphicsg)
{
super.paintComponent(g);
Fontf=newFont("宋体",Font.BOLD+Font.ITALIC,15);
g.setFont(f);
g.drawString("进程一:
",20,90);
g.drawString("进程二:
",20,210);
g.drawString("进程三:
",20,320);
}
publicThreadPanel()
{
setLayout(null);
setSize(800,400);
progressBar1=newJProgressBar();
progressBar2=newJProgressBar();
progressBar3=newJProgressBar();
buttonstart1=newJButton("开始");
buttonstop1=newJButton("暂停");
buttonstart2=newJButton("开始");
buttonstop2=newJButton("暂停");
buttonstart3=newJButton("开始");
buttonstop3=newJButton("暂停");
progressBar1.setBackground(newColor(255,50,255));
progressBar1.setForeground(newColor(10,90,90));
progressBar1.setBounds(100,70,480,40);
buttonstart1.setBounds(600,70,80,40);
buttonstop1.setBounds(700,70,80,40);
add(progressBar1);
add(buttonstart1);
add(buttonstop1);
buttonstart1.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEventarg0){
Thread1.flag=true;
}
});
buttonstop1.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEventarg0){
Thread1.flag=false;
}
});
progressBar2.setBackground(newColor(255,90,100));
progressBar2.setForeground(newColor(90,50,90));
progressBar2.setBounds(100,190,480,40);
buttonstart2.setBounds(600,190,80,40);
buttonstop2.setBounds(700,190,80,40);
add(progressBar2);
add(buttonstart2);
add(buttonstop2);
buttonstart2.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEventarg0){
Thread2.flag=true;
}
});
buttonstop2.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEventarg0){
Thread2.flag=false;
}
});
progressBar3.setBackground(newColor(100,100,255));
progressBar3.setForeground(newColor(100,90,90));
progressBar3.setBounds(100,300,480,40);
buttonstart3.setBounds(600,300,80,40);
buttonstop3.setBounds(700,300,80,40);
add(progressBar3);
add(buttonstart3);
add(buttonstop3);
buttonstart3.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEventarg0){
Thread3.flag=true;
}
});
buttonstop3.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEventarg0){
Thread3.flag=false;
}
});
}
}
classThread1extendsThread
{
publicstaticbooleanflag=true;
JProgressBarprogressBar;
privatestaticinti=0;
publicThread1(JProgressBarprogressBar)
{
this.progressBar=progressBar;
}
@Override
publicvoidrun(){
if(i<=100){
i+=1;
progressBar.setValue(i);
try{
Thread.sleep(30);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
else{
i=0;
}
}
}
classThread2extendsThread
{
publicstaticbooleanflag=true;
JProgressBarprogressBar;
privatestaticinti=0;
publicThread2(JProgressBarprogressBar)
{
this.progressBar=progressBar;
}
@Override
publicvoidrun(){
if(i<=100){
i+=1;
progressBar.setValue(i);
try{
Thread.currentThread().sleep(30);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
else{
i=0;
}
}
}
classThread3extendsThread
{
publicstaticbooleanflag=true;
JProgressBarprogressBar;
privatestaticinti=0;
publicThread3(JProgressBarprogressBar)
{
this.progressBar=progressBar;
}
@Override
publicvoidrun(){
if(i<=100){
i+=1;
progressBar.setValue(i);
try{
Thread.currentThread().sleep(30);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
else{
i=0;
}
}
}
六、测试结果及说明
1.测试结果
程序启动
暂停全部进程
2.测试结果说明
基本达到了模拟程序并发的效果。
七、实验体会
通过这次实验,我再次体会到将编程与实际结合的乐趣,并进让我加深了对JAVA语言的理解,更让我了解了多道批处理系统实现并发执行的机制和原理,如单CPU的计算机实现进程间的并发只是宏观上的并发而已,即进程轮流使用CPU,每个进程允许占用CPU的时间非常短,感觉就是并行执行的。
在微观上各个进程依然是以串行的方式进行;进程在各个状态间的转换、转换原因等。
经过本次课程设计,激发了我学习的积极性,培养了我独立发现问题,分析问题,解决问题的能力。
更增加了我与同学交流沟通和共同解决问题的能力。
巩固了上课是所学的知识,加深了对JAVA界面程序设计的理解,达到了学以致用的目的。
八、参考资料:
《java程序设计教程》阎菲中国水利水电出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 操作系统 实验 进程 并发 执行
![提示](https://static.bingdoc.com/images/bang_tan.gif)