实验任务
创建一个进程,给出工作量,每个进程所占的时间片大小为20个单位,实现就绪状态到执行状态之间的转化。如果一个进程在执行,点击其I/O请求即可产生阻塞,实现了等待一个事件的状态转移。阻塞状态到就绪状态需要事件发生,本程序为了简化,过40个时间单位自动解锁。本程序可以在VC、或其他程序设计语言中实现,容易使用时钟控件。在控制台模式下,该方式不是非常合适。
开始实验
一、 实验目的:
通过实验进一步了解进程状态之间的转换和进程控制等相关操作,通过实验的方法模拟进程在操作系统中是如何进行切换的,并掌握进程的数据结构;
二、 实验内容:
- 模拟进程PCB块,包括进程信息(id,名称,所需时间片,优先级,当前状态等)
- 建立三个队列(执行队列、就绪队列、等待队列) 在此我选用Java中的集合类ArrayList来实现。
- 根据用户输入进行系统交互和进程转换
- 用do-while语句和switch语句实现用户输入
- 要实现的功能:
- 新建进程(输入进程号、时间片)
- 将进程变为就绪状态 就绪
- 将进程变为等待状态 阻塞
- 将进行变为执行状态 执行
- 进程执行一次消耗5个时间片,执行完后自动变为就绪状态等待下一次执行
- 不能使除就绪状态的进程变为等待状态
- 进程在三个队列中只能存在一个
- 有IO请求的时候停止当前运行进程
三、 实验步骤:
1. 创建一个进程类 包含的信息有 id、名称、所需时间片、优先级、当前状态;及其获取这些信息的方法
2. 系统类,定义了主函数main()
和某些工具方法及方法函数
图:系统类定义的队列
图:系统类中的调用关系
图:系统类提供的相关工具方法及函数
3. 详解运行方法 runProcess()
是如何实现的:
首先分析运行进程所需要的条件:进程状态为就绪或者运行而且时间片不小于0
可以用两种分支来进行运行程序:
1.进程为就绪状态,将进程从就绪队列中删除,并添加到运行队列中,修改程序状态和时间片
2.进程为运行状态,修改时间片,并添加到运行队列尾等待下一次运行
相关源码:
//运行一个进程
private static void runProcess() {
// TODO Auto-generated method stub
Process process;
if (!Dlists.isEmpty()) {
process = Dlists.get(0);
if (process.getState()==2) {
System.out.println("直接");
for (int i = 5; i >= 1; i--) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("进程"+process.getPid()+"正在运行");
process.setPtime(process.getPtime()-1);
}
System.out.println("进程"+process.getPid()+"剩余运行时间:"+process.getPtime()+"\t 进程结束运行");
readProcess(process.getPid());
}else {
System.out.println("当前队列进程无法运行不为2");
readProcess(process.getPid());
}
}
else if (!Rlists.isEmpty()) {
System.out.println("间接");
process = Rlists.get(0);
if ((process.getState()==1&&(process.getPtime()>0))) {
process.setState(2);
Rlists.remove(0);
Dlists.add(process);
for (int i = 5; i >= 1; i--) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("进程"+process.getPid()+"正在运行");
process.setPtime(process.getPtime()-1);
}
System.out.println("进程"+process.getPid()+"剩余运行时间:"+process.getPtime()+"\t 进程结束运行");
readProcess(process.getPid());
}else if (process.getState()==1) {
Rlists.remove(0);
System.out.println("进程"+process.getPid()+"时间片剩余不足,已销毁");
}else if (process.getState()!=1){
System.out.println("当前队列进程无法运行不为1");
System.out.println(process.getState());
}else {
System.out.println("当前队列进程无法运行");
System.out.println(process.getState());
System.out.println(process.getPtime());
}
}else