Java操作系统进程调度算法——优先级调度(HPF)算法
文章目录
前言
为了使紧迫型进程获得优先处理,引入了优先权调度算法。它从就绪队列中选择一个优先级最高的进程,让其获得处理器并执行。一般的,又进一步把该算法分为两种方式:
一、算法思想
(1)非抢占式优先级调度算法:在这种方式下,系统一旦把处理器分配给就绪队列中优先权最高的进程后,该进程就占有处理器一直运行下去,直到该进程完成或因发生事件而阻塞,才退出处理器。系统这时才能将处理器分配给另一个优先权高的进程。这种方式实际上是每次将处理器分配给当前就绪队列中优先级最高的进程。它常用于批处理系统中,也可用于某些对时间要求不严格的实时系统中。
(2)抢占式优先权调度算法:在这种方式下,系统同样把处理器分配给当前就绪队列中优先级最高的进程,使之执行。但在其执行期间,仍然会不断有新的就绪进程进入就绪队列,如果出现某个进程,其优先级比当前正在执行的进程的优先权还高时,进程调度程序就会立即暂停当前进程的执行,将处理器收回,并将处理器分配给新出现的优先级更高的进程,让其执行。这种方式实际上永远都是系统中优先级最高的进程占用处理器执行。因此,它能更好地满足紧迫进程的要求, 故常用于要求比较严格的实时系统中,以及对性能要求较高的批处理和分时系统中。
对于优先权调度算法,其关键在于是采用静态优先权,还是动态优先权,以及如何确定 进程的优先权。
(1) 静态优先权:静态优先权是在创建进程时确定的,并且规定它在进程的整个运行期间保持不变。一般来说,优先权是利用某个范围内的一个整数来表示的,如 0~7,或 0~255 中的某个整数, 所以又称为优先数。在使用时,有的系统用“0”表示最高优先权,数值越大优先权越小, 而有的系统则恰恰相反。
(2) 动态优先权:动态优先权要配合抢占调度方式使用,它是指在创建进程时所赋予的优先权,可以随着进程的推进而发生改变,以便获得更好的调度性能。在就绪队列中等待调度的进程,可以随 着其等待时间的增加,其优先权也以某个速率增加。因此,对于优先权初值很低的进程,在 等待足够长的时间后,其优先权也可能升为最高,从而获得调度,占用处理器并执行。同样 规定正在执行的进程,其优先权将随着执行时间的增加而逐渐降低,使其优先权可能不再是 最高,从而暂停其执行,将处理器回收并分配给其他优先权更高的进程。这种方式能防止一 个长进程长期占用处理器的现象。
二、数据结构
1.定义(PCB)进程控制块
String name;
int level;
double arrivetime; //进程到达时间
double servicetime; // 进程执行时间长度(服务时间)
double starttime; //进程开始执行时间
double finishtime; //进程执行完成时间
double zztime; //周转时间
double dqzztime; //带权周转时间
2.实现思路
(1)初始化进程块。
(2)对进程进行优先级排序(此实验采用的是冒泡排序)。
(3)判断队列是否为空;不为空,则开始调用优先级最高的进程。
(4)进程运行时间到,则置为就绪状态。
(5)输出进程调度结果。
三、流程图
四、完整代码
import java.util.Scanner;
public class HPF {
String name;
int level;
double arrivetime; //进程到达时间
double servicetime; // 进程执行时间长度(服务时间)
double starttime; //进程开始执行时间
double finishtime; //进程执行完成时间
double zztime; //周转时间
double dqzztime; //带权周转时间
public HPF(){
}
public HPF(String name, double arrivetime, double servicetime,int level) {
this.name = name;
this.arrivetime = arrivetime;
this.servicetime = servicetime;
this.level=level;
}
//主方法
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("=================优先级调度算法========================");
System.out.println(