# 基于JAVA的进程调度算法
# 一、需求分析
在Java开发环境下,模拟进程调度算法,其中该算法所需要的具体功能为:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法(将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理)。
算法的具体描述为:每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。进程的优先数、需要的运行时间及到达时间可以事先人为地指定(也可以由随机数产生)。进程的运行时间以时间片为单位进行计算。每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。 重复以上过程,直到所要进程都完成为止。
# 二、概要设计
为了符合题目需求,该工程主要有三个实现类:
- Process(进程类),主要用来实例化各个不同的进程
- ProcessBlock(进程控制块类),用来为每个进程分配PCB,该类实例化后为进程类的类成员变量
- ProcessControl(进程控制类),为主类,用来调度进程。
其中,在进程调度中,声明了三个队列,分别为待插入进程队列(按到达时间从小到大排序),就绪队列(按优先级从大到小排序,按照到达时间先后进行排序),完成队列。都ArrayList<Process>类型变量。
调度算法描述:
1. 程序开始时随机为初始化5个进程(程序太多不容易观察运行结果)
2. 声明时间变量t,while循环下调度程序一直运行,每运行一次,t++
3. 然后循环判断待插入队列队首进程是否到达,若到达,则将该进程插入到就绪队列中,并从待插入队列删除该进程;若没有到达,则从该循环中跳出
4. 然后从就绪队列中取出队首进程并分配时间片。当该进程时间片用完后,判断该进程是否已经完成,若完成,则将该进程插入到完成队列;若没有完成,则将该进程的优先级减一并重新插入到就绪队列中
5. 一直重复该循环,一直到待插入队列和就绪队列都为空为止
# 三、详细设计
## 3.1 设计思想
采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法(将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理)。
## 3.2 模块设计
**所使用的数据结构**(简化,仅成员变量,具体请见源码)
```java
public class ProcessBlock {
private String name; //进程名
private int priority; //优先数 1-10
private int arriveTime; //到达时间 1-50
private int needTime; //需要时间 1-20
private int waitTime; //等待时间 1-20
private int alreadyUseTime; //已占用CPU时间
private char status; //进程状态 W, R, F
}
public class Process {
private ProcessBlock pcb;
}
public class ProcessControl {
private final static int uTime = 1; // 时间片
private static int time = 0; // 模拟时间
ArrayList<Process> processA = new ArrayList();// 待插入的进程 ArrayList<Process> processB = new ArrayList();// 就绪队列
ArrayList<Process> processFinish = new ArrayList();// 完成队列
}
```
- 输入子模块
系统自动随机产生5个进程,并且随机对它们进行初始化,并按照进程产生的创建的时间进行排序插入到待插入队列中
- 进程调度子模块
采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法(将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理)对就绪队列中的进程进行进程调度
- 输出子模块
系统每调度进程一次,都会产生输出,将正在运行中的进程和就绪队列,完成队列中的进程信息全部打印出来
# 四、调试分析
- **遇到的问题**
当进程太多时,输出结果非常多,不利于分析系统调度算法的正确性
- **解决方案**
将进程数量相应的减少之后,使输出结果相应的减少之后,使可分析程度保证在可接受的范围之内。
- **调试结果**(输出结果太多,仅部分输出结果)
```java
>各进程到达信息表:
>0 name-> process4,priority-> 10,arriveTime-> 1,needTime-> 8,alreadyUseTime-> 0,waitTime-> 0,status-> W
>1 name-> process1,priority-> 2,arriveTime-> 2,needTime-> 7,alreadyUseTime-> 0,waitTime-> 0,status-> W
>2 name-> process2,priority-> 5,arriveTime-> 2,needTime-> 9,alreadyUseTime-> 0,waitTime-> 0,status-> W
>3 name-> process0,priority-> 5,arriveTime-> 3,needTime-> 7,alreadyUseTime-> 0,waitTime-> 0,status-> W
>4 name-> process3,priority-> 4,arriveTime-> 10,needTime-> 9,alreadyUseTime-> 0,waitTime-> 0,status-> W
>时间:
>1
>正在运行的进程:
>name-> process4,priority-> 10,arriveTime-> 1,needTime-> 8,alreadyUseTime-> 0,waitTime-> 0,status-> R
>就绪队列
>完成队列
----------------------------------------------------------------
>时间:
>2
>正在运行的进程:
>name-> process4,priority-> 9,arriveTime-> 1,needTime-> 8,alreadyUseTime-> 1,waitTime-> 0,status-> R
>就绪队列
>name-> process2,priority-> 5,arriveTime-> 2,needTime-> 9,alreadyUseTime-> 0,waitTime-> 0,status-> W
>name-> process1,priority-> 2,arriveTime-> 2,needTime-> 7,alreadyUseTime-> 0,waitTime-> 0,status-> W
>完成队列
----------------------------------------------------------------
>时间:
>3
>正在运行的进程:
>name-> process4,priority-> 8,arriveTime-> 1,needTime-> 8,alreadyUseTime-> 2,waitTime-> 0,status-> R
>就绪队列
>name-> process2,priority-> 5,arriveTime-> 2,needTime-> 9,alreadyUseTime-> 0,waitTime-> 1,status-> W
>name-> process0,priority-> 5,arriveTime-> 3,needTime-> 7,alreadyUseTime-> 0,waitTime-> 0,status-> W
>name-> process1,priority-> 2,arriveTime-> 2,needTime-> 7,alreadyUseTime-> 0,waitTime-> 1,status-> W
>完成队列
----------------------------------------------------------------
>时间:
>39
>正在运行的进程:
>name-> process1,priority-> 0,arriveTime-> 2,needTime-> 7,alreadyUseTime-> 6,waitTime-> 2,status-> R
>就绪队列
>name-> process3,priority-> 0,arriveTime-> 10,needTime-> 9,alreadyUseTime-> 8,waitTime-> 0,status-> W
>完成队列
>name-> process4,priority-> -1,arriveTime-> 1,needTime-> 8,alreadyUseTime-> 8,waitTime-> -1,status-> F
>name-> process0,priority-> -1,arriveTime-> 3,needTime-> 7,alreadyUseTime-> 7,waitTime-> -1,status-> F
>name-> process2,priority-> -1,arriveTime-> 2,needTime-> 9,alreadyUseTime-> 9,waitTime-> -1,status-> F
----------------------------------------------------------------
>时间:
>40
>正在运行的进程:
>name-> process3,priority-> 0,arriveTime-> 10,needTime-> 9,alreadyUseTime-> 8,waitTime-> 1,status-> R
>就绪队列
>完成队列
>name-> process4,priority-> -1,arriveTime-> 1,needTime-> 8,alreadyUseTime-> 8,waitTime-> -1,status-> F
>name-> process0,priority-> -1,arriveTime-> 3,needTime-> 7,alreadyUseTime-> 7,waitTime-> -1,status-> F
>nam
精选_毕业设计_基于JAVA的进程调度算法_完整源码
版权申诉
71 浏览量
2022-03-05
13:49:02
上传
评论
收藏 33KB ZIP 举报
![avatar](https://profile-avatar.csdnimg.cn/efa50bd0b9924b728ac8bf795a9d17d9_u010918911.jpg!1)
工具盒子
- 粉丝: 61
- 资源: 1313