操作系统进程管理实验报告.docx
《操作系统进程管理实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统进程管理实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
操作系统进程管理实验报告
********试验汇报纸
计算机科学与工程学院(院、系)网络工程专业083班组操作系统课
学号************姓名****试验日期.05.20老师评定
试验一、进程管理(3课时、必做)
一、试验目
经过试验使学生深入了解进程、进程状态、进程控制等基础概念。
基础能达成下列具体目标:
1、了解进程PCB概念,以及PCB怎样实现、怎样组织以及管理。
2、复习数据结构中怎样对链操作,包含建链、删除、插入结点等,来实现进程管理。
二、试验内容
1、建立一个结点,即PCB块包含用户标识域、状态域(实施、等候、就绪)、link域。
2、建立三个队列(实施队列、就绪队列、等候队列)。
3、依据进程状态转换实现对三个队列具体操作。
具体驱动能够采取时间片算法或手动调度形式完成三个状态之间转换
4、用switch选择语句选择状态。
5、根据自己设定能完成全部状态转换运行(包含创建和运行结束)。
三、试验步骤
1、复习进程管理三状态模型部分内容。
2、预习C++Builder或VC++、Delphi、JBuilder线程编程。
3、运行示例程序,深入明确试验要求。
能够采取控制台模式或窗口模式。
4、上机编程、调试程序。
5、完成试验汇报。
四、试验过程
1、进程管理三状态模型部分内容
进程从因创建而产生直至撤销而消亡整个生命周期中,有时占用处理器实施,有时即使能够运行但分不四处理器,有时即使处理器空闲但因等候某个事件发生而无法实施,这一切都说明进程和程序不一样,进程是活动且有状态改变,状态及状态之间转换表现进程动态性,为了便于系统管理,通常来说,根据进程在实施过程中不一样情况最少要定义三种进程状态。
(1)运行态:
进程占用处理器运行状态。
(2)就绪态:
进程含有运行条件,等候系统分配处理器方便起运行状态。
(3)等候态:
进程不含有运行条件,正在等候某个时间完成状态。
2、程序设计环境
表1程序设计环境表
设备名称
具体要求
处理器
英特尔Corei5M460@2.53GHz
内存容量
2GB
操作系统
Windows7旗舰版32位
java.runtime.version
1.6.0_13-b03
3、程序界面设计
本试验目不在界面创新,所以界面设计模仿示例程序二,程序界面设计以下:
图1.程序界面设计
界面中元件包含:
标题、队列管理、进程状态转换操作、进程转换示意图、作者及版本信息。
各元件设计具体以下:
1)标题:
蓝底白字“进程管理演示”,其部分代码以下:
publicstaticfinalStringTITLE="进程管理演示";//程序标题
JLabelJ_title=newJLabel(""+TITLE+"",SwingConstants.CENTER);
1)队列管理:
实时更新进程就绪队列、进程实施队列、进程阻塞队列,及进程实施队列中进程Node(模拟PCB块,详见下文)更新。
其中,进程实施队列只包含一个进程,因为一个时间片内只能有一个进程处于运行态。
部分代码以下:
//进程队列名
publicstaticfinalStringPROCESS_READY="进程就绪队列:
";
publicstaticfinalStringPROCESS_EXECUTE="进程实施队列:
";
publicstaticfinalStringPROCESS_BLOCK="进程阻塞队列:
";
//进程队列信息显示
privateJLabelprocess_ready=newJLabel(PROCESS_READY);
privateJLabelprocess_execute=newJLabel(PROCESS_EXECUTE);
privateJLabelprocess_block=newJLabel(PROCESS_BLOCK);
//更新进程队列信息
process_ready.setText(PROCESS_READY+readyLink.print());
process_execute.setText(PROCESS_EXECUTE+executeLink.print());
process_block.setText(PROCESS_BLOCK+blockLink.print());
2)进程状态转换操作:
a)创建新进程:
其部分代码以下:
privateJTextFieldprocess_name=newJTextField(8);//进程名输入域
privateJLabelprocess_add=newJLabel("小于4个字符");//添加进程提醒信息
b)已存在进程状态切换操作:
其部分代码以下:
//进程状态转换操作按钮
privateJButtonexecuteTOready=newJButton("实施-->就绪(a)");
privateJButtonexecuteTOblock=newJButton("实施-->阻塞(s)");
privateJButtonreadyTOexecute=newJButton("就绪-->实施(d)");
privateJButtonblockTOready=newJButton("阻塞-->就绪(f)");
3)进程转换示意图:
privateImageIconimageIcon=newImageIcon("D:
//process.jpg");
需把图片放在D盘根目录下
图2.进程转换示意图
4)作者及版本信息:
newJLabel("作者:
杨松青 版本:
PMD1.0
"
+"仲恺农业工程学院计算机科学与工程学院网络工程083班
"
+"电子邮箱:
")
其中:
PMD为ProcessManagementDemo简写。
4、创建进程
图3.创建进程
包含进程名输入域和添加进程提醒信息两个组件,进程名输入域可输入进程名(长度小于4)按回车键添加进程队列中不存在进程(进程名不能反复);点击下方按钮将改变进程名对应进程状态,具体见6、进程状态转换操作。
按回车键后,在输入域后方添加进程提醒信息组件会打印出提醒信息,提醒用户进程是否添加成功。
假如输入进程名长度大于4,程序将自动截取前4个字符,确保名字长度小于4,这中控制是因为该程序无须名字很长进程名,这么队列管理中能够显示更多进程。
5、时间片管理
为了模拟处理器时间片,程序单独开启一个新线程cpuThread处理时间片到时进程切换和取得时间片操作。
时间片定义以下:
//时间片
publicstaticfinalIntegerTIMEOUT=5;
publicinttimeOut=TIMEOUT;
其中TIMEOUT为处理器每次分配时间片大小,该值是固定,所以使用final关键字修饰。
timeOut为进程实施过程中时间片消耗,但该值为0时,将检验就绪队列,假如就绪队列为空,则为原实施中进程再次分配TIMEOUT大小时间片,进程继续占用处理器;假如就绪队列不为空,则原实施中进程时间片到,转为就绪态,而就绪队列队首结点转入实施状态。
具体操作步骤及代码以下:
图4.线程cpuThread步骤图
if(executeLink.getRoot()!
=null){
if(timeOut!
=0){//时间片未到
timeOut--;
executeLink.getRoot()
.setAge(executeLink.getRoot().getAge()-1);
if(executeLink.getRoot().getAge()==0){//进程正常结束
executeLink.deleteRoot();
process_Info.setText("进程"+executeLink.getRoot().getName()+"正常撤销");
}
}else{
timeOut=TIMEOUT;//时间片到
if(readyLink.getRoot()!
=null){
//将进程放回就绪队列中
process_Info.setText("时间片到,进程"+executeLink.getRoot().getName()+"让出处理器");
executeLink.getRoot().setState(0);
readyLink.add(executeLink.getRoot());
executeLink.deleteRoot();
}else{
//就绪队列为空,目前进程继续占有cpu
timeOut--;
executeLink.getRoot()
.setAge(executeLink.getRoot().getAge()-1);
if(executeLink.getRoot().getAge()==0){//进程正常结束
executeLink.deleteRoot();
process_Info.setText("进程"+executeLink.getRoot().getName()+"正常撤销");
}
}
}
}elseif(readyLink.getRoot()!
=null){
//进程占有处理器
Nodenode=readyLink.getRoot();
readyLink.deleteRoot();
node.setNext(null);
node.setState
(1);
executeLink.setRoot(null);
executeLink.add(node);
process_Info.setText("就绪进程"+executeLink.getRoot().getName()+"实施");
}
6、进程队列管理
图5.进程队列管理
实时更新进程就绪队列、进程实施队列、进程阻塞队列,及进程实施队列中进程Node(模拟PCB块)更新。
a)队列:
Link.java
存放于.util包中,具体接口信息以下图:
图6.Link.java接口信息
图7.Node.java接口信息
b)进程:
Node.java
存放于.util包中,具体接口信息以下图7:
其中name表示进程名,age表示进程所需剩下时间片,next用于在进程队列Link中,指向下一个进程结点Node,state表状态域(实施、等候、就绪)。
7、进程状态转换操作
在进程名输入域中输入已存在进程名:
(不存在时点击任何按钮不产生状态转换,并提醒“不存在正在**进程**”)
a)假如该进程在实施队列(处于运行态)中,则单击“实施—>就绪(a)”按钮能够把进程切换到就绪态,并提醒“进程**:
实施—>就绪”信息。
具体操作以下:
Nodenode=executeLink.getRoot();//1.先取出该进程
node.setNext(null);//2.切断进程链
node.setState(0);//3.修改善程状态
readyLink.add(node);//4.放入就绪队列
executeLink.setRoot(null);//5.从实施队列中移除
其中,切断进程链操作是相当关键,在以下每次状态转换都需要实施此操作。
假如没有立刻切断进程链,将会造成结点next中仍然残余着其她信息,这么会在不停进程切换时,链表变成循环链表,将造成程序发生致命错误。
b)单击“实施—>阻塞(s)”按钮能够把进程切换到等候态,并提“进程**:
实施—>阻塞”信息。
具体操作以下:
Nodenode=executeLink.getRoot();
node.setNext(null);
node.setState(3);
blockLink.add(node);
executeLink.setRoot(null);
c)假如该进程在实施队列中,则单击“就绪—>实施(d)”按钮能够把进程切换到实施态,并提“进程**:
就绪—>实施”信息。
具体操作以下:
//1.先把正在实施进程放入就绪队列
Nodenode=executeLink.getRoot();
node.setNext(null);
node.setState(0);
readyLink.add(node);
executeLink.setRoot(null);
//2.把就绪队列中进程放入实施队列
node=readyLink.getNodeByName(processName);
readyLink.delete(processName);
node.setNext(null);
node.setState
(1);
executeLink.add(node);
d)假如该进程在阻塞队列中,则单击“阻塞—>就绪(f)”按钮能够把进程切换到就绪态,并提“进程**:
阻塞—>就绪”信息。
具体操作以下:
Nodenode=blockLink.getNodeByName(processName);
blockLink.delete(processName);
node.setNext(null);
node.setState(0);
readyLink.add(node);
四、试验心得
本试验模拟了进程管理,包含新建进程、进程状态转换等操作,而且还独立设计了专用链表以模拟进程队列。
程序使用JAVA编写,以面向对象思维抽象出进程和进程队列。
经过本试验,我愈加了解进程、进程状态、进程控制等基础概念。
同时也复习了JAVASwing图形界面编程、数据结构中链、JAVA多线程管理等知识。
但还是有不足,程序设定进程名不能反复,使得程序不能很好模拟PCB。