Java操作系统进程调度算法——优先级调度(HPF)算法

文章目录

  • Java操作系统进程调度算法——优先级调度(HPF)算法
  • 前言
  • 一、算法思想
  • 二、数据结构
    • 1.定义(PCB)进程控制块
    • 2.实现思路
  • 三、流程图
  • 四、完整代码
  • 运行结果
    • 1、输入示例
    • 2、结果截图

前言

为了使紧迫型进程获得优先处理,引入了优先权调度算法。它从就绪队列中选择一个优先级最高的进程,让其获得处理器并执行。一般的,又进一步把该算法分为两种方式:

一、算法思想

(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("输入进程数目: ");int num = scanner.nextInt();//创建进程数组对象HPF[] p = new HPF[num];System.out.println("请创建进程对象, 输入进程名称  到达时间  服务时间  优先级");System.out.println("请输入进程的信息: ");for (int i= 0; i<p.length; i++){p[i] = new HPF(scanner.next(), scanner.nextDouble(),scanner.nextDouble(),scanner.nextInt());}OS_HPF(p); //调用进程优先级算法scanner.close();}//进程优先级算法private static void OS_HPF(HPF[] p) {sort(p); //排序run(p); //执行该进程print(p); //显示界面double Attime=0 ,AQttime = 0;for (int k=0; k<p.length;k++){Attime += p[k].zztime;AQttime += p[k].dqzztime;}Attime = Attime/p.length;AQttime = AQttime/p.length;System.out.println("调用进程优先级的平均周转时间为: "+Attime);//  System.out.printf("%.3f\n",AQttime);System.out.println("调用进程优先级的平均带权周转时间为: "+AQttime);}//排序算法(冒泡排序法)public static void sort(HPF[] p) {/************按照优先级进行排序**************///  1.对HPF型数组中的元素进行一个简单的排序,找到优先级最高的进程,并且把其他进程进行简单排序,方便后续工作//冒泡排序:N次循环,每次找到从 i到n-1中优先级最好的进程,放到p[i]for (int i = 0; i < p.length; i++) {for (int j = i + 1; j < p.length; j++) {if (p[i].arrivetime > p[j].arrivetime) {HPF temp;temp = p[i];p[i] = p[j];p[j] = temp;}}}// 2.每个进程运行完成之后,找到当前时刻已经到达的优先级最大进程for (int m = 0; m < p.length; m++) {if (m == 0)  //p[0]的优先级最高p[m].finishtime = p[m].arrivetime + p[m].servicetime;elsep[m].finishtime = p[m - 1].finishtime + p[m].servicetime;/********* 查找当前进程执行过程中进入系统的进程 ***********/// 2.1 找到p[m].finishtime时刻哪些进程已经到达,从下一个进程p[m+1]开始寻找int i = 0;for (int n = m + 1; n < p.length; n++) {if (p[n].arrivetime <= p[m].finishtime) {i++;}//2.2 找到p[m].finishtime时刻已经到达的最短进程int next = m + 1;double min = p[m + 1].servicetime; //next进程服务时间为p[m+1].servicetime//在 p[m+1]~p[m+i-1]这 i个已经到达的进程中找到最短进程for (int k = m + 2; k <= m + i; k++) {if (p[k].servicetime < min) {min = p[k].servicetime;next = k;//2.3 把最短的进程 放在p[m+1]进程处HPF temp;temp = p[m + 1];p[m + 1] = p[next];p[next] = temp;}}           }}}//进程执行private static void run(HPF[] p) {for(int k=0; k<p.length;k++){if (k==0){p[k].starttime = p[k].arrivetime;p[k].finishtime = p[k].arrivetime+p[k].servicetime;}else{p[k].starttime = p[k-1].finishtime;p[k].finishtime = p[k-1].finishtime+p[k].servicetime;}}for (int k=0; k<p.length;k++){p[k].zztime = p[k].finishtime-p[k].arrivetime;  //计算该进程周转时间p[k].dqzztime=p[k].zztime/p[k].servicetime;  //计算该进程带权周转时间}}//结果回显private static void print(HPF[] p) {//System.out.println("调用进程优先级算法后 进程运行的顺序是: ");//System.out.println(p[0].name);//for (int k=1;k<p.length;k++){//   System.out.print("-->"+p[k].name);// }System.out.println("");System.out.println("具体的调度信息: ");System.out.println("进程名  优先级  到达时间  执行时间   开始时间   结束时间   周转时间  带权周转时间");for(int k =0;k<p.length;k++){System.out.printf("%4s",p[k].name);System.out.printf("%4d",p[k].level);System.out.printf("%10.3f",p[k].arrivetime);System.out.printf("%10.3f",p[k].servicetime);System.out.printf("%10.3f",p[k].starttime);System.out.printf("%10.3f",p[k].finishtime);System.out.printf("%10.3f",p[k].zztime);System.out.printf("%10.3f\n",p[k].dqzztime);}}
}

运行结果

1、输入示例

p1  9.40     20   1
p4  10.10    10   4
p5  10.05    30   3
p2  9.55     15   3
p3  9.45     25   2

2、结果截图

Java操作系统进程调度算法——优先级调度(HPF)算法相关推荐

  1. Java操作系统进程调度算法——时间片轮转(RR)算法

    Java操作系统进程调度算法--时间片轮转(RR)算法 文章目录 Java操作系统进程调度算法--时间片轮转(RR)算法 前言 一.算法思想 二.数据结构 1.定义PCB进程控制块 2.实现思路 三. ...

  2. Java操作系统进程调度算法——先来先服务(FCFS)算法

    Java操作系统进程调度算法--先来先服务(FCFS)算法 Java操作系统进程调度算法--先来先服务(FCFS)算法 文章目录 Java操作系统进程调度算法--先来先服务(FCFS)算法 前言 一. ...

  3. 操作系统进程调度算法,进程调度实验

    操作系统进程调度算法 1 题目描述 1.1 实验目的 用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 1.2 实验内容 编写并调试一个模拟的进程调度程序,采用简单时间片 ...

  4. 操作系统进程调度算法(先来先服务,短作业优先算法(SJF))linux下(附源码)

    先来先服务算法(FCFS) FCFS是最简单的调度算法,既可以用作作业调度,也可以用作进程调度 这种算法优先考虑系统中等待时间最长的作业(进程),而不管作业所需执行时间长短, 做法是从后备队列中选择几 ...

  5. OS / 几个常用的操作系统进程调度算法

    在操作系统中存在多种调度算法,其中有的调度算法适用于作业调度,有的调度算法适用于进程调度,有的调度算法两者都适用.下面介绍几种常用的调度算法. 一.先来先服务(FCFS)调度算法 FCFS 调度算法是 ...

  6. 操作系统进程调度算法(FCFS、SJF、高响应比)

    进程调度算法(FCFS.SJF.高响应比) 一.算法描述 1.先来先服务(FCFS)调度算法 (1)FCFS是最简单的调度算法,该算法可用于作业调度,也可用于进程调度. (2)算法规则:系统按照作业到 ...

  7. 几个常用的操作系统进程调度算法

    一.先来先服务和短作业(进程)优先调度算法 1.先来先服务调度算法 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.当在作业调度中采用该算法时,每次调度 ...

  8. 操作系统学习(一):浅析操作系统进程调度算法

    目录 0.前置知识 0.1 调度性能指标 0.2 上下文切换 1.进程调度算法简单介绍 1.1 先进先出(FIFO) 1.2 最短任务优先(SJF) 1.3 最短完成时间优先(STCF) 1.4 轮转 ...

  9. 操作系统进程调度算法实验

    进程调度 实验目的与要求 进程调度是处理机管理的核心内容.本实验要求编程实现一个简单的进程调度程序.通过本实验可以加深理解有关进程控制块.进程队列的概念,并体会和了解进程调度算法的具体实现方法. 2. ...

最新文章

  1. linux 查看日志信息--less命令
  2. 线性代数同济第六版_线性代数考试内容与课后习题
  3. c语言中头结点不为零怎么写,C语言不带表头结点的单链表操作
  4. 百度分布式配置中心BRCC正式开源
  5. 选择排序法python详解-Python选择排序算法(三)
  6. Promise之异步调用
  7. 数据帧,数据包,报文段,报文,分组,数据包的概念和区别
  8. vscode 新建python 终端
  9. 喜欢去知乎炸鱼?用python吧
  10. python计算商品总价_python根据京东商品url获取产品价格
  11. 基于 Spark推荐 系统应用 现 状
  12. 11计算机专业vb试题答案,11高三计算机专业VB试题(三)
  13. 顺丰旗下丰鸟无人机高薪诚聘海内外英才
  14. 宏碁笔记本一键重装win7系统教程
  15. 在最美的时候,你遇见了谁?
  16. mysql的查询分析工具下载_万能数据库查询分析器(ODBC数据库查询分析工具)V7.03 最新版...
  17. 虚拟化与网络存储技术:虚拟化技术、Qemu-KVM
  18. VisualStudio/VS在一个项目中添加多个c++文件
  19. javascript字符串方法indexOf、lastIndexOf 方法的使用
  20. Teamviewer控制安卓手机远程打卡实现

热门文章

  1. 树莓派安装openwrt旁路由开启ipv6
  2. 东华大学计算机学院副教授陈德华,陈德华(东华大学教授)
  3. [ElementForm]unpected width unpected width
  4. xxx系统的可用性和易用性分析
  5. 24GHz道闸防砸雷达传感器SRR189 winfrom 调试小程序
  6. 网站推广方法之一——资源合作
  7. 数独游戏的两种编程思路+代码
  8. ChatGPT进入百度“弱智吧”后,疯了
  9. 电脑桌面护眼色调配方案
  10. js:获取当前鼠标选中的文本/html