进程调度rr算法java实现_Java实现进程调度算法(二) RR(时间片轮转)

一、概述

因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示。

也因为我这次要实现多个类似算法,所以将一些共性单独提取出来作为一个类。

如果只想要和算法有关的核心代码,看RR类的calc()即可。

实现思路:每运行一个进程,则将所有进程的remainServiceTime减去一个时间片的长度。

二、运行结果

1. 测试数据:

d3432967340c86fa21e4f27cfed6d710.png

2. 运行结果:

399cb03406a9fd1ffb8430275cb5e3ab.png

21fa4223ce78ed53e42b5532a42c13cc.png

三、流程图

b62340665ef15a0f2df34ca77df97bb3.png

四、实现代码

1. RR类(主类)

只有calc()中涉及了算法,init()和printResult()只有简单的输入输出操作。

1 packagexqy.algorithm;2

3 import java.util.*;4

5 importxqy.Util.Tools;6 importxqy.been.Process;7

8 /**

9 *@authorxqy10 * @date 2018年12月19日19:14:4911 */

12 public classRR {13 private intprocessNumber;14 private ArrayListprocessList;15 private inttimeSlice;16

17 publicRR() {18 init();19 calc();20 Tools.printResult(processList);21 }22

23 private voidinit() {24 Scanner sc = newScanner(System.in);25

26 System.out.print(" Please enter the slice time:");27 timeSlice =sc.nextInt();28 System.out.print(" please enter the process num:");29 processNumber =sc.nextInt();30

31 processList = new ArrayList();32 for (int i = 0; i < processNumber; i++) {33 processList.add(newProcess());34 }35

36 System.out.println(" Please enter each process arrival time:");37 for (int i = 0; i < processNumber; i++) {38 System.out.print(" Process" + (i + 1) + ":");39 processList.get(i).setArrivalTime(sc.nextInt());40 }41

42 System.out.println(" Please enter each process service time:");43 for (int i = 0; i < processNumber; i++) {44 System.out.print(" Process" + (i + 1) + ":");45 int servicesTime =sc.nextInt();46

47 processList.get(i).setServicesTime(servicesTime);48 processList.get(i).setRemainServiceTime(servicesTime);49 }50 }51

52 private voidcalc() {53 int timeNow = 0;54 int processRemain =processNumber;55 booleannoProcessRunInThisTurn;56 Process opProcess;57

58 while (processRemain != 0) {59 noProcessRunInThisTurn = true;60

61 for (int i = 0; i < processNumber; i++) {62 opProcess =processList.get(i);63

64 if ((opProcess.getRemainServiceTime() > 0)65 && (timeNow >=opProcess.getArrivalTime())) {66 //First time

67 if (opProcess.getServicesTime() ==opProcess68 .getRemainServiceTime()) {69 int waitTime = timeNow -opProcess.getArrivalTime();70

71 opProcess.setStartTime(timeNow);72 opProcess.setWaitTime(waitTime);73 }74

75 //Calculating remain service time

76 int remainServiceTime =opProcess.getRemainServiceTime()77 -timeSlice;78 opProcess.setRemainServiceTime(remainServiceTime);79

80 //Last time

81 if (remainServiceTime <= 0) {82 int completionTime = timeNow + timeSlice; //The process ends when the current slice is completed.

83 int turnAroundTime =completionTime84 -opProcess.getArrivalTime();85 double turnAroundTimeWithWeight = 1.0 *turnAroundTime86 /opProcess.getServicesTime();87

88 opProcess.setCompletionTime(completionTime);89 opProcess.setTurnAroundTime(turnAroundTime);90 opProcess91 .setTurnAroundTimeWithWeight(turnAroundTimeWithWeight);92 processRemain--;93 }94

95 timeNow +=timeSlice;96 noProcessRunInThisTurn = false;97

98 System.out.println(" #STEP# Process" + (i + 1)99 + " remain service time:"

100 +opProcess.getRemainServiceTime()101 + " , timeBefore:" + (timeNow - 1) + ", timeNow:"

102 +timeNow103 + ((remainServiceTime <= 0) ? " Finish" : ""));104 } else{105 //do noting, because this process has been completed or hasn`t arrived.

106 }107 }108

109 //Means no process could run, because they have arrived.

110 if ((processRemain > 0) &&noProcessRunInThisTurn) {111 timeNow +=timeSlice;112 }113 }114 }115 }

2. Process类

模拟了进程,对属性进行了封装。

1 package xqy.been;

2

3 public class Process {

4 private int arrivalTime;

5 private int servicesTime;

6 private int remainServiceTime;

7 private int startTime;

8 private int waitTime;

9 private int completionTime;

10

11 /**

12 * turnAroundTime = completionTime - arrivalTime

13 */

14 private int turnAroundTime;

15

16 /**

17 * turnAroundTimeWithWeight = turnAroundTime / servicesTime

18 */

19 private double turnAroundTimeWithWeight;

20

21 public Process() {

22 ;

23 }

24

25 public int getArrivalTime() {

26 return arrivalTime;

27 }

28

29 public void setArrivalTime(int arrivalTime) {

30 this.arrivalTime = arrivalTime;

31 }

32

33 public int getServicesTime() {

34 return servicesTime;

35 }

36

37 public void setServicesTime(int servicesTime) {

38 this.servicesTime = servicesTime;

39 }

40

41 public int getRemainServiceTime() {

42 return remainServiceTime;

43 }

44

45 public void setRemainServiceTime(int remainServiceTime) {

46 this.remainServiceTime = remainServiceTime;

47 }

48

49 public int getStartTime() {

50 return startTime;

51 }

52

53 public void setStartTime(int startTime) {

54 this.startTime = startTime;

55 }

56

57 public int getWaitTime() {

58 return waitTime;

59 }

60

61 public void setWaitTime(int waitTime) {

62 this.waitTime = waitTime;

63 }

64

65 public int getCompletionTime() {

66 return completionTime;

67 }

68

69 public void setCompletionTime(int completionTime) {

70 this.completionTime = completionTime;

71 }

72

73 public int getTurnAroundTime() {

74 return turnAroundTime;

75 }

76

77 public void setTurnAroundTime(int turnAroundTime) {

78 this.turnAroundTime = turnAroundTime;

79 }

80

81 public double getTurnAroundTimeWithWeight() {

82 return turnAroundTimeWithWeight;

83 }

84

85 public void setTurnAroundTimeWithWeight(double turnAroundTimeWithWeight) {

86 this.turnAroundTimeWithWeight = turnAroundTimeWithWeight;

87 }

88

89 @Override

90 public String toString() {

91 return "Process [arrivalTime=" + arrivalTime + ", servicesTime="

92 + servicesTime + ", remainServiceTime=" + remainServiceTime

93 + ", startTime=" + startTime + ", waitTime=" + waitTime

94 + ", completionTime=" + completionTime + ", turnAroundTime="

95 + turnAroundTime + ", turnAroundTimeWithWeight="

96 + turnAroundTimeWithWeight + "]";

97 }

98 }

3. Tools类

因为这次要实现几个类似的算法,所以我把每个算法中都要用到的方法都提取出来作为单独的工具类。

也可以将这些工具方法都放入FCFS类中。

1 package xqy.Util;

2

3 import java.util.ArrayList;

4

5 import xqy.been.Process;

6

7 public class Tools {

8

9 public static double calcAverageTurnAroundTime(

10 ArrayList processList) {

11 double sum = 0;

12 for (int i = 0; i < processList.size(); i++) {

13 sum += processList.get(i).getTurnAroundTime();

14 }

15 return Math.round(sum / processList.size() * 100) / 100.0;

16 }

17

18 public static double calcAverageTurnAroundTimeWithWeight(

19 ArrayList processList) {

20 double sum = 0;

21 for (int i = 0; i < processList.size(); i++) {

22 sum += processList.get(i).getTurnAroundTimeWithWeight();

23 }

24 return Math.round(sum / processList.size() * 100) / 100.0;

25 }

26

27 public static void printResult(ArrayList processList) {

28 System.out.println("n #RESULT#");

29

30 System.out.print("tArrive:tt");

31 for (int i = 0; i < processList.size(); i++) {

32 System.out.print(processList.get(i).getArrivalTime() + "t");

33 }

34 System.out.println();

35

36 System.out.print("tService:t");

37 for (int i = 0; i < processList.size(); i++) {

38 System.out.print(processList.get(i).getServicesTime() + "t");

39 }

40 System.out.println();

41

42 System.out.print("tStart:tt");

43 for (int i = 0; i < processList.size(); i++) {

44 System.out.print(processList.get(i).getStartTime() + "t");

45 }

46 System.out.println();

47

48 System.out.print("tWait:tt");

49 for (int i = 0; i < processList.size(); i++) {

50 System.out.print(processList.get(i).getWaitTime() + "t");

51 }

52 System.out.println();

53

54 System.out.print("tFinish:tt");

55 for (int i = 0; i < processList.size(); i++) {

56 System.out.print(processList.get(i).getCompletionTime() + "t");

57 }

58 System.out.println();

59

60 System.out.print("tTurn around:t");

61 for (int i = 0; i < processList.size(); i++) {

62 System.out.print(processList.get(i).getTurnAroundTime() + "t");

63 }

64 System.out.println();

65

66 System.out.print("tTA wight:t");

67 for (int i = 0; i < processList.size(); i++) {

68 System.out.print(Math.round(processList.get(i)

69 .getTurnAroundTimeWithWeight() * 100) / 100.0 + "t");

70 }

71 System.out.println();

72

73 System.out.println("tAverage turn around time:"

74 + Tools.calcAverageTurnAroundTime(processList) + "t");

75 System.out.println("tAverage turn around time with wight:"

76 + Tools.calcAverageTurnAroundTimeWithWeight(processList));

77

78 System.out.println();

79 }

80 }

内容来源于网络如有侵权请私信删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

string 长度_String源码解析

本章源码分析基于JDK1.7实现的接口String类被final修饰词修饰&#xff0c;代表不可修改的特性&#xff0c;它实现了三个接口&#xff0c;Serializable是序列化接口&#xff0c;Compareble是排序接口&#xff0c;Char是字符序列接口。主要成员变量char[]&#xff1a;String通过c…

将你一张表的值覆盖_山西联通携手华为完成长风商务区宏微协同,立体覆盖,打造5G精品网络...

近日&#xff0c;中国联通山西分公司(以下简称“山西联通”)在太原长风商务区继5G CA超高速率升级之后&#xff0c;又针对长风商务区两层活动区域进行了5G宏微协同的立体覆盖&#xff0c;实现了该区域5G网络的连续部署。长风商务区建筑结构设计新颖&#xff0c;占地面积3.06平方…

局域网内文件传输速度_详解蒲公英路由器组网 实现文件共享

蒲公英路由器&#xff0c;除了具备普通路由器的功能之外&#xff0c;如图&#xff1a;最大的特色是可以实现智能组网&#xff1a;最大的特色是可以实现智能组网&#xff1a;采用全新自主研发的Cloud VPN技术替代传统VPN&#xff0c;基于SD-WAN智能组网方案&#xff0c;快速组建…

java emoji显示乱码_Java 解决Emoji表情过滤问题

Emoji表情从三方数据中获取没有过滤&#xff0c;导致存入DB的时候报错。原因&#xff1a;UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节&#xff0c;而Mysql的utf8编码最多3个字节&#xff0c;所以数据插不进去。方法1.将已经建好的表也转换成utf8mb42&#xff0…

mongotemplate中save抛出异常_异常处理的三个好习惯 | Python 工匠

文 | piglei 编辑 | EarlGrey推荐 | 编程派(微信ID&#xff1a;codingpy)前言如果你用 Python 编程&#xff0c;那么你就无法避开异常&#xff0c;因为异常在这门语言里无处不在。打个比方&#xff0c;当你在脚本执行时按 ctrlc 退出&#xff0c;解释器就会产生一个 KeyboardI…

组态王能直接读取仪表数据吗_液晶多功能网络电力仪表PD800H

液晶多功能网络电力仪表PD800H-H44三相三线多功用电力表面&#xff0c;一般也被称作网络电力表面&#xff0c;它是一种数字化的监控设备&#xff0c;其功用集成了电量测量&#xff0c;情况监控&#xff0c;远程通讯为一体&#xff0c;作业原理上选用了现代核算机技术和数字信号…

php养老院管理系统,XYCMS养老院建站系统 v3.8

XYCMS养老院建站系统是一个专为养老院而设计的养老院建筑系统。中心信息管理&#xff1a;包括基本信息管理&#xff0c;添加&#xff0c;问答中心信息管理新闻动态管理&#xff1a;管理新闻信息内容&#xff0c;管理相关分类&#xff0c;添加或者删除生活环境内容管理&#xff…

超过响应缓冲区限制_Nginx如何限制并发连接数和连接请求数?

全网最全1500份Java学习资料、500份BAT面试真题&#xff1a;关注公众号&#xff0c;输入“面试题”&#xff0c;获取提取码&#xff01;首先讲解两个算发&#xff1a;算法思想是&#xff1a;令牌以固定速率产生&#xff0c;并缓存到令牌桶中&#xff1b;令牌桶放满时&#xff0…

跨域产生的原因和解决方法_板式家具开料机加工过程产生崩边原因及解决方法...

家具厂数控开料机加工材料的时候会遇到材料崩边的问题&#xff0c;下面我们系统的分析下产生的原因以及解决的办法产生崩边现象的原因&#xff1f;其一是材料本身问题。目前除了实木家具&#xff0c;目前使用较多的就是 板式贴皮的材料&#xff0c;板材的优点就是标准化生产&am…

facade 门面 php,php设计模式之门面(Facade)模式

该模式属于结构型模式什么是门面模式&#xff1f;定义&#xff1a;门面模式(有时候也称为外观模式)是指提供一个统一的接口去访问多个子系统的多个不同的接口&#xff0c;它为子系统中的一组接口提供一个统一的高层接口。外部与子系统的通信是通过一个门面(Facade)对象进行。其…

架构师一般做到多少岁_《迷茫中的我们该如何突破瓶颈——成长为一名架构师》...

如何成长为一名架构师&#xff1f;架构师是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物。一个架构师得需要足够的想像力,能把各种目标需求进行不同维度的扩展&#xff0c;为目标客户提供更为全面的需求清单。很多程序员想成为一名架…

php-fpm初始化失败,FPM的初始化 - [ PHP7的内核剖析 ] - 在线原生手册 - php中文网

FPM的初始化接下来看下fpm的启动流程&#xff0c;从main()函数开始&#xff1a;//sapi/fpm/fpm/fpm_main.cint main(int argc, char *argv[]){... //注册SAPI:将全局变量sapi_module设置为cgi_sapi_modulesapi_startup(&cgi_sapi_module);... //执行php_module_staru…

360手柄摇杆漂移修复_彻底解决你的Switch手柄摇杆问题,最省钱的完美修复。

我想很多Switch的消费者都遇到了一个问题&#xff0c;用久了之后的手柄失灵&#xff0c;移动不精准&#xff0c;卡顿&#xff0c;自动位移等现象。玩个游戏都非常的糟心。动一下摇杆角色都会自动移动...这些问题的出现主要原因是摇杆内部进了灰尘&#xff0c;才导致各种现象的出…

libzdb 连接mysql,数据库连接池库libzdb使用教程

Libzdb挺强大&#xff0c; 支持Mysql Oracle SQLite PostgreSQL&#xff0c;支持C和C Object C&#xff0c;不能在Window下用(看源码是因为基于Linux线程机制编写实现)。遗憾的是找个资料太费劲&#xff0c;只能到Libzdb官网&#xff1a;点此进入 &#xff0c;今正看着上面英文…

数值分析方程求根实验matlab,数值分析实验之非线性方程求根(MATLAB实现)

一、实验目的1&#xff0e; 了解一般非线性方程的求根是比较复杂的事情&#xff1a;要讨论(或知道)它有无实根&#xff0c;有多少实根&#xff1b;知道求近似根常用的几种方法&#xff0c;每种方法的特点是什么。2&#xff0e; 用通过二分法(区间半分法)、不动点(也Picard)迭代…

iis php 数据库乱码,如何解决php插入数据乱码问题

php插入数据乱码的解决办法&#xff1a;首先要设置数据表的字符集为utf8&#xff1b;然后修改字符集格式&#xff1b;接着建立字符集为utf-8的数据库&#xff1b;最后通过php mysql语句插入数据即可。mysql数据库乱码问题解决办法我们在使用数据库(mysql)的时候最怕的就是数据库…

vc 通过句柄修改窗口大小_VC应用(1)通过VC修改销售订单行项目的字段

VC是SAP中非常重要的功能&#xff0c;过去多年来&#xff0c;我参与了不少使用VC的项目&#xff0c;我将通过多篇文章介绍VC的一些应用&#xff0c;本文介绍通过VC修改销售订单行项目的字段01 概览在销售订单创建时&#xff0c;对于可配置物料来说&#xff0c;不同的配置可能会…

springboot starter工作原理_98,谈谈SpringBoot的工作原理

对技术的探索&#xff0c;一切源于好奇心&#xff0c;保持好奇心&#xff0c;才能让人更年轻。至今&#xff0c;我们已经有了很多创建SpringBoot项目的经验&#xff0c;比如我们要创建一个支持web开发的项目&#xff0c;我们只需要引入web-starter模块即可。那么&#xff0c;Sp…

精英主义 遗传算法 matlab,遗传算法优化 - osc_lfs4vsih的个人空间 - OSCHINA - 中文开源技术交流社区...

1.遗传算法简介遗传算法是一种基于自然选择和群体遗传机理的搜索算法,它模拟了自然选择和自然遗传过程中的繁殖、杂交和突变现象.再利用遗传算法求解问题时,问题的每一个可能解都被编码成一个“染色体”,即个体,若干个个体构成了群体(所有可能解).在遗传算法开始时,总是随机的产…

php后台管理员登录密码错误,如果后台管理员的密码错误,我该怎么办,还有两种找回密码的方法...

Dedecms是中国著名的网站管理核心. 由于编织梦想简单易用&#xff0c;因此可以进行二次开发&#xff0c;并且可以实现各种网站. 在使用dedecms的过程中&#xff0c;如果忘记了梦想管理后台的密码怎么办&#xff1f;神山个人博客分享了两种修改(重置)管理员密码的方法.1. 下载织…