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

文章目录

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

前言

一、算法思想

按进程到达顺序将进程依次加入就绪队列当中,然后将 CPU 分配给位于队首的进程,确定一个时间片,让该进程执行一个时间片。当该进程执行时间到时,该进程可能已经执行完毕(可能在时间片未到时就以及执行完毕),或者未执行完毕,如果是前者只需将进程弹出队列即可,如果是后者则将该进程加入队尾,并将 CPU 分配给新的队首进程,如此循环。

二、数据结构

1.定义PCB进程控制块

String name;    //进程名
double AT;      //到达时间
double RT;      //需要运行时间
int CPUT=0;        //已用CPU时间
char State;     //进程状态

2.实现思路

(1)初始化进程控制块、各个队列。
(2)判断就绪队列是否为空;若不空,则就绪队列中首进程开始执行。
(3)设置时间片;时间片到,将运行进程已占用时间片+1。
(4)在该时间片内进程执行完毕,这种情况调度程序将立即把该进程弹出队列,并把 CPU 分配给新的队首进程。
(5)在该时间片内进程未执行完毕,调度程序将立即中断该进程执行,把该进程加入队尾,并将 CPU 分配给新的队首进程。

周转时间 = 进程完成时间 - 进程到达时间
带权周转时间 = 进程周转时间 / 进程实际运行时间
平均周转时间 = (进程1周转时间 + … + 进程n周转时间)/ n
平均带权周转时间 = (进程1带权周转时间 + … + 进程n带权周转时间)/ n

三、流程图

四、完整代码

import java.util.Scanner;//private static void OS_HPF(HPF[] p)
class PCB{       //进程的pcbString name;    //进程名double AT;         //到达时间double RT;           //需要运行时间int CPUT=0;        //已用CPU时间char State;     //进程状态PCB(){}PCB(String a,double b,double c){name=a;AT=b;RT=c;}
}
class Queue{      //队列int a[]=new int[1000];int F=0;int L=0;void come(int num){if(L>=999)System.out.println("队满");a[L]=num;L++; }void out(){if(F>L)System.out.println("队空");F++;}int isexit() {if(L>F)return 1;elsereturn 0;}
}
class RR{String name;    //进程名double AT;         //到达时间double RT;      //需要运行时间double Attime;double AQttime;public RR(){ }public RR(String name, double AT, double RT) { this.name=name;this.AT=AT;this.RT=RT;}     void creat() {Scanner scanner = new Scanner(System.in);System.out.println("输入进程数目: ");int num = scanner.nextInt();   RR[] p = new RR[num];System.out.println("请创建进程对象, 输入进程名称  到达时间  服务时间");System.out.println("请输入进程的信息: ");for (int i= 0; i<p.length; i++){   p[i] = new RR(scanner.next(), scanner.nextDouble(),scanner.nextDouble());
}scanner.close();}void Way(){int i,j;int input;       //进程数Scanner reader=new Scanner(System.in);      System.out.println("请输入进程数");input=reader.nextInt();PCB[] pcb=new PCB[input];Queue Wait=new Queue();     //等待队列Queue Ready=new Queue();     //就绪队列int CPUTIME=5;       //设置时间片为5String a;double b,c;System.out.println("请依次输入进程名、到达时间、需要运行时间");for(i=0;i<input;i++){ a=reader.next();b=reader.nextDouble();c=reader.nextDouble();pcb[i]=new PCB(a,b,c);}PCB t=new PCB();for(i=0;i<input-1;i++){    //排列,先到达的排在前面for(j=0;j<input-1-i;j++){if(pcb[j].AT>pcb[j+1].AT){t=pcb[j];pcb[j]=pcb[j+1];pcb[j+1]=t;}}}System.out.println("进程名  到达时间  需要运行时间");   //输出排序后的进程for(i=0;i<input;i++){    System.out.print("  "+pcb[i].name+"     ");System.out.print(pcb[i].AT+"      ");System.out.println(pcb[i].RT);}double nowtime=pcb[0].AT;  //现在的时间为第一个进程到达的时间for(i=0;i<input;i++){if(pcb[i].AT==nowtime) {         //如果现在的时间大于到达时间就进入就绪队列Ready.come(i);                //否则进入等待队列pcb[i].State='W';}else {                           Wait.come(i);   pcb[i].State='W';}}while( Wait.isexit()==1 || Ready.isexit()==1 ) {while(Ready.isexit()==1) {pcb[Ready.a[Ready.F]].RT=pcb[Ready.a[Ready.F]].RT-CPUTIME;   //一个时间片结束后,进程需要的时间减少pcb[Ready.a[Ready.F]].CPUT++;                              //已占用CPU时间+1pcb[Ready.a[Ready.F]].State='R';                           //状态先置为运行if(pcb[Ready.a[Ready.F]].RT>0) {                           //如果进程需要的时间大于0,则进入就绪队列Ready.come(Ready.a[Ready.F]);                             //否则把进程需要的时间置为0、把状态置为结束                    }else {                                                   pcb[Ready.a[Ready.F]].RT=0;pcb[Ready.a[Ready.F]].State='F';Ready.out();}System.out.println("现在的时间为:"+nowtime);System.out.println("进程名  到达时间  需要运行时间  已占用CPU时间  进程状态");  //输出进程名、到达时间、需要运行时间、 已占用CPU时间、进程状态for(i=0;i<input;i++){ System.out.print("  "+pcb[i].name+"     ");System.out.print(pcb[i].AT+"      ");System.out.print(pcb[i].RT+"        ");System.out.print(pcb[i].CPUT+"         ");System.out.println(pcb[i].State);}if(pcb[Ready.a[Ready.F]].State=='R'){pcb[Ready.a[Ready.F]].State='W';Ready.out();}             nowtime=nowtime+CPUTIME;                      //现在的时间为一个时间片后for(i=Wait.F;i<Wait.L;i++) {                //如果等待队列里的进程的等待条件满足了,就进入就绪队列if(nowtime>=pcb[Wait.a[i]].AT) {Ready.come(Wait.a[i]);Wait.out();                        }   }}System.out.println("现在的时间为:"+nowtime);        //现在的时间为一个时间片后nowtime=nowtime+CPUTIME;                         //如果等待队列里的进程的等待条件满足了,就进入就绪队列for(i=Wait.F;i<Wait.L;i++) {if(nowtime>=pcb[Wait.a[i]].AT) {Ready.come(Wait.a[i]);Wait.out();   }}System.out.println("调用进程优先级的平均周转时间为: "+Attime);//  System.out.printf("%.3f\n",AQttime);System.out.println("调用进程优先级的平均带权周转时间为: "+AQttime);}reader.close();}public static void main(String[] args) {System.out.println("======================时间片调度算法========================");RR t=new RR();t.Way();//调用进程优先级算法}
}

五、实验结果

1、输入示例

p1  9.40     20
p4  10.10    10
p5  10.05    30
p2  9.55     15
p3  9.45     25

2、运行截图

Java操作系统进程调度算法——时间片轮转(RR)算法相关推荐

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

    Java操作系统进程调度算法--优先级调度(HPF)算法 文章目录 Java操作系统进程调度算法--优先级调度(HPF)算法 前言 一.算法思想 二.数据结构 1.定义(PCB)进程控制块 2.实现思 ...

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

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

  3. java实现操作系统时间片轮转进程调度算法(RR算法)

    Time类 package RR算法; public class time {private int hour;private int min;public int getHour() {return ...

  4. 操作系统--时间片轮转调度算法(RR算法)

    操作系统–时间片轮转调度算法(RR算法) 实验内容: 模拟实现时间片轮转调度算法,具体如下: 设置进程体:进程名,进程的到达时间,服务时间,,进程状态(W--等待,R--运行,F--完成),进程间的链 ...

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

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

  6. java 时间片_Java 实现--时间片轮转 RR 进程调度算法

    时间片轮转(Round-Robin)调度算法是操作系统一种比较公平的进程调度的方式,这种方式使得就绪队列上的所有进程在每次轮转时都可以运行相同的一个时间片. 基本原理 算法实现原理是,按进程到达顺序( ...

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

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

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

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

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

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

最新文章

  1. Get started with ros -- 1
  2. linux的git命令,linux命令实战安装git、配置git、创建仓库、部署项目
  3. mybatis 乐观锁_MybatisPlus新特性之逻辑删除、乐观锁、自动填充
  4. linux c 延迟函数 sleep usleep 使用区别
  5. oracle大数据量更新引发的死锁问题解决方法及oracle分区和存储过程的思考
  6. openssl1.1.0 支持php,openssl升级到1.0.21以支持nginx http2 ssl
  7. XML学习笔记01【xml_基础、xml_约束】
  8. 构造函数、拷贝构造函数和析构函数的的调用时刻及调用顺序
  9. C++使用StringPiece减少string类的拷贝
  10. 微信小程序开发教程第七章:微信小程序编辑名片页面开发
  11. php过滤掉不乱码json,PHP JSON编码后,中文乱码的解决方式
  12. OpenCV人脸识别之一:数据收集和预处理
  13. GameObject.Find 使用技巧
  14. 武汉工程大学计算机网络真题,2017年武汉工程大学计算机科学与工程学院836计算机网络考研导师圈点必考题汇编...
  15. Tomcat爆出严重漏洞,影响所有版本,波及约8万台服务器,附解决方案!(扩散!!!)...
  16. php 5.5 preg replace,解决ecshop在php5.5以上环境preg_replace报错方法
  17. 解决其他浏览器能上网谷歌浏览器不能上网
  18. php sphinx配置,sphinx的配置和管理
  19. Java-KoTime:接口耗时监测与邮件通知接口耗时情况
  20. 计算机系统的cpu是指什么意思,电脑cpu参数是什么意思

热门文章

  1. cubase怎么添加midi设备_教你解决Cubase拔出USB-MIDI设备后不能再识别的问题。
  2. 人脸识别之人脸对齐(八)--LBF算法
  3. Outlook的签名日期自动更新
  4. JSP中使用<c:forEach>标签循环遍历元素
  5. Android Studio 如何更改git账户
  6. HTML怎么样把图片换行,我的css代码如下,为什么读出来的图片每一行只有1个,能不能每行三个,第四个换行_html/css_WEB-ITnose...
  7. 清华北大「世界排名断崖式下跌」?
  8. 动态规划思想——最优二叉搜索树问题(附完整的代码)
  9. m在simulink进行DS-CDMA建模,然后通过MATLAB调用simulink模型进行误码率仿真
  10. 2020-11-22 使用luacheck检查Lua代码