计算机科学与工程学院 (院、系) 网络工程 专业 083 班 组 操作系统 课
学号************ 姓名 **** 实验日期 2011.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 页 共 10 页
进程从因创建而产生直至撤销而消亡的整个生命周期中, 有时占用处理器执行,有时虽然可以运行但分不到处理器,有时虽然处理器空闲但因等待某个事件发生而无法执行,这一切都说明进程和程序不同,进程是活动的且有状态变化, 状态及状态之间的转换体现进程的动态性,为了便于系统管理,一般来说,按照进程在执行过程中的不同情况至少要定义三种进程状态。
(1)运行态:进程占用处理器运行的状态。
(2)就绪态:进程具备运行条件,等待系统分配处理器以便起运行的状态。 (3)等待态:进程不具备运行条件,正在等待某个时间完成的状态。 2、 程序设计环境
表1 程序设计环境表 设备名称 处理器 内存容量 操作系统 java.runtime.version 详细要求 英特尔 ******************2 GB Windows 7 旗舰版 32位 1.6.0_13-b03 3、 程序界面设计
本实验的目的不在界面的创新,所以界面的设计模仿示例程序二,程序界面设计如下:
图 1.
程序界面设计
界面中的元件包括:标题、队列管理、进程状态转换操作、进程转换示意图、作者及版本信息。各元件的设计具体如下:
第 2 页 共 10 页
1) 标题:蓝底白字“进程管理演示”,其部分代码如下:
public static final String TITLE = \"进程管理演示\" ; //程序标题 JLabel J_title= new JLabel(\"\" + TITLE + \"\",SwingConstants.CENTER); 1) 队列管理:实时更新进程就绪队列、进程执行队列、进程阻塞队列,及进程执行队列中进程Node(模拟PCB 块,详见下文)的更新。其中,进程执行队列只包含一个进程,因为一个时间片内只能有一个进程处于运行态。部分代码如下: //进程队列名 public static final String PROCESS_READY = \" 进程就绪队列: \" ; public static final String PROCESS_EXECUTE = \" 进程执行队列: \" ; public static final String PROCESS_BLOCK = \" 进程阻塞队列: \" ; //进程队列信息显示 private JLabel process_ready = new JLabel(PROCESS_READY) ; private JLabel process_execute = new JLabel(PROCESS_EXECUTE) ; private JLabel process_block = new JLabel(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) 创建新的进程:其部分代码如下:
private JTextField process_name= new JTextField(8) ; //进程名输入域 private JLabel process_add = new JLabel(\"小于4个字符\");//添加进程提示信息 b) 已存在的进程的状态切换操作:其部分代码如下:
//进程状态转换操作按钮 private JButton executeTOready = new JButton(\"执行-->就绪(a)\") ; private JButton executeTOblock = new JButton(\"执行-->阻塞(s)\") ; private JButton readyTOexecute = new JButton(\"就绪-->执行(d)\") ; private JButton blockTOready = new JButton(\"阻塞-->就绪(f)\") ; 3) 进程转换示意图:
private ImageIcon imageIcon = new ImageIcon(\"D://process.jpg\"); 需把图片放在D盘根目录下
第 3 页 共 10 页
图 2.
进程转换示意图
4) 作者及版本信息:
new JLabel(\"作者:杨松青 版本:PMD 1.0
\" + \"仲恺农业工程学院计算机科学与工程学院网络工程083班
\" + \"电子邮箱:***************\") 其中:PMD为Process Management Demo的简写。 4、 创建进程
图 3.
创建进程
包括进程名输入域和添加进程提示信息两个组件,进程名输入域可输入进程名(长度不大于4)按回车键添加进程队列中不存在的进程(进程名不能重复);点击下方的按钮将改变进程名对应的进程的状态,详细见6、进程状态转换操作。
按回车键后,在输入域后方的添加进程提示信息组件会打印出提示信息,提示用户进程是否添加成功。如果输入的进程名长度大于4,程序将自动截取前4个字符,确保名字长度不大于4,这中控制是由于该程序无须名字很长的进程名,这样队列管理中可以显示更多的进程。 5、 时间片管理
为了模拟处理器的时间片,程序单独开启一个新的线程cpuThread处理时间片到时的进程切换和获得时间片的操作。
时间片的定义如下:
//时间片 public static final Integer TIMEOUT = 5 ; public int timeOut = TIMEOUT ; 其中TIMEOUT为处理器的每次分配的时间片大小,该值是固定的,所以使用final关
第 4 页 共 10 页
键字修饰。timeOut为进程执行过程中时间片的消耗,但该值为0时,将检查就绪队列,如果就绪队列为空,则为原执行中的进程再次分配TIMEOUT大小的时间片,进程继续占用处理器;如果就绪队列不为空,则原执行中的进程时间片到,转为就绪态,而就绪队列的队首结点转入执行状态。具体操作流程及代码如下:
第 5 页 共 10 页
开始线程锁:开N线程锁:开?Y线程锁:关N执行列表中有正在执行的进程吗?Y时间片到?Y分配新的时间片N时间片减 1正在执行的进程age减 1就绪队列中有进程吗?NN正在执行的进程age == 0?Y切换进程时间片减 1正在执行的进程age减 1Y进程正常撤销N正在执行的进程age == 0?Y进程正常撤销执行队列为空 且就绪队列不为空 ?NY执行一个就绪进程更新进程队列信息Thread.sleep(500);线程锁:开结束 图 4.
线程cpuThread流程图
第 6 页 共 10 页
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() ; // 就绪队列为空,当前进程继续占有cpu timeOut -- ; executeLink.getRoot() .setAge(executeLink.getRoot().getAge()-1); if(executeLink.getRoot().getAge() == 0) { // 进程正常结束 executeLink.deleteRoot() ; process_Info.setText(\"进程 } else { \"+executeLink.getRoot().getName()+\"正常撤销\") ; } } } //进程占有处理器 Node node = readyLink.getRoot() ; readyLink.deleteRoot() ; node.setNext(null) ; node.setState(1) ; executeLink.setRoot(null) ; executeLink.add(node) ; process_Info.setText(\"就绪进程\"+executeLink.getRoot().getName()+\"执行\") ; } } else if (readyLink.getRoot() != null) { 第 7 页 共 10 页
6、 进程队列管理
图 5.
进程队列管理
实时更新进程就绪队列、进程执行队列、进程阻塞队列,及进程执行队列中进程Node(模拟PCB 块)的更新。
a) 队列:Link.java
存放于www.ysq.com.util包中,具体接口信息如下图:
图 6.
Link.java接口信息
图 7.
Node.java接口信息
b) 进程:Node.java
存放于www.ysq.com.util包中,具体接口信息如下图7:
其中name表示进程名,age表示进程所需的剩余的时间片,next用于在进程队列Link中,指向下一个进程结点Node,state表状态域(执行、等待、就绪)。 7、 进程状态转换操作
在进程名输入域中输入已存在的进程名:
(不存在时点击任何按钮不产生状态转换,并提示“不存在正在**的进程**”)
第 8 页 共 10 页
a) 如果该进程在执行队列(处于运行态)中,则单击“执行—>就绪(a)”按钮可以把进程切换到就绪态,并提示“进程**:执行—>就绪”信息。具体的操作如下: Node node = executeLink.getRoot(); //1.先取出该进程 node.setNext(null) ; node.setState(0) ; readyLink.add(node) ; //2.切断进程链 //3.修改进程状态 //4.放入就绪队列 //5.从执行队列中移除 executeLink.setRoot(null) ; 其中,切断进程链的操作是相当重要的,在以下的每次状态转换都需要执行此操作。如果没有及时切断进程链,将会导致结点的next中仍然残存着其他信息,这样会在不断的进程切换时,链表变成循环链表,将导致程序发生致命错误。
b)单击“执行—>阻塞(s)”按钮可以把进程切换到等待态,并提“进程**:执行—>阻塞”信息。具体的操作如下: Node node = executeLink.getRoot(); node.setNext(null) ; node.setState(3) ; blockLink.add(node) ; executeLink.setRoot(null) ; c) 如果该进程在执行队列中,则单击“就绪—>执行(d)”按钮可以把进程切换到执行态,并提“进程**:就绪—>执行”信息。具体的操作如下: //1.先把正在执行的进程放入就绪队列 Node node = 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)”按钮可以把进程切换到就绪态,并提“进程**:阻塞—>就绪”信息。具体的操作如下: Node node = blockLink.getNodeByName(processName); blockLink.delete(processName) ; node.setNext(null) ; node.setState(0) ; readyLink.add(node) ;
第 9 页 共 10 页
四、实验心得
本实验模拟了进程的管理,包括新建进程、进程状态转换等操作,并且还独立设计了专用的链表以模拟进程队列。程序使用JAVA编写,以面向对象的思维抽象出进程和进程队列。
通过本实验,我更加了解进程、进程状态、进程控制等基本概念。同时也复习了JAVA Swing图形界面编程、数据结构中的链、JAVA多线程管理等知识。但还是有不足的,程序设定进程名不能重复,使得程序不能很好的模拟PCB。
第 10 页 共 10 页
因篇幅问题不能全部显示,请点此查看更多更全内容