Java实现进程调度算法(一) FCFS(先来先服务)
一、概述
因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示。
也因为我这次要实现多个类似算法,所以将一些共性单独提取出来作为一个类。
如果只想要和算法有关的核心代码,看FCFS类的calc()即可。
实现思路:按照顺序将进程添加到列表中,然后再按照添加顺序运行。模拟进程的运行,即为按顺序改变每个进程的到达时间、服务时间、开始时间、等待时间、周转时间和带权周转时间。在所有进程都结束后再计算平均周转时间和平均带权周转时间。
三、测试
1. 测试数据:
2. 运行结果:
三、流程图
四、实现代码
1. FCFS类(主类)
只有calc()中涉及了算法,init()和printResult()只有简单的输入输出操作。
package xqy.algorithm; import java.util.ArrayList;
import java.util.Scanner; import xqy.Util.Tools;
import xqy.been.Process; /**
* @author xqy
* @date 2018年12月19日19:15:01
* @description 对先到的任务先处理,后到的任务后处理。
*/ public class FCFS {
private int processNumber;
private ArrayList<Process> processList; public FCFS() {
init();
calc();
Tools.printResult(processList);
} private void init() {
Scanner sc = new Scanner(System.in); System.out.print("<FCFS> Please enter the process num:");
processNumber = sc.nextInt(); processList = new ArrayList<Process>();
for (int i = 0; i < processNumber; i++) {
processList.add(new Process());
} System.out.println("<FCFS> Please enter each process arrival time:");
for (int i = 0; i < processNumber; i++) {
System.out.print(" Process" + (i + 1) + ":");
processList.get(i).setArrivalTime(sc.nextInt());
} System.out.println("<FCFS> Please enter each process service time:");
for (int i = 0; i < processNumber; i++) {
System.out.print(" Process" + (i + 1) + ":");
processList.get(i).setServicesTime(sc.nextInt());
}
} private void calc() {
int timeNow = 0;
Process opProcess; for (int i = 0; i < processNumber; i++) {
opProcess = processList.get(i); int waitTime = timeNow - opProcess.getArrivalTime();
int completionTime = timeNow + opProcess.getServicesTime();
int turnAroundTime = completionTime
- opProcess.getArrivalTime();
double turnAroundTimeWithWeight = (double) turnAroundTime
/ opProcess.getServicesTime(); opProcess.setStartTime(timeNow);
opProcess.setWaitTime(waitTime);
opProcess.setCompletionTime(completionTime);
opProcess.setTurnAroundTime(turnAroundTime);
opProcess.setTurnAroundTimeWithWeight(
turnAroundTimeWithWeight); timeNow += opProcess.getServicesTime();
}
} public static void main(String [] args) {
new FCFS();
}
}
2. Process类
模拟了进程,对属性进行了封装。
package xqy.been; public class Process {
private int arrivalTime;
private int servicesTime;
private int remainServiceTime;
private int startTime;
private int waitTime;
private int completionTime; /**
* turnAroundTime = completionTime - arrivalTime
*/
private int turnAroundTime; /**
* turnAroundTimeWithWeight = turnAroundTime / servicesTime
*/
private double turnAroundTimeWithWeight; public Process() {
;
} public int getArrivalTime() {
return arrivalTime;
} public void setArrivalTime(int arrivalTime) {
this.arrivalTime = arrivalTime;
} public int getServicesTime() {
return servicesTime;
} public void setServicesTime(int servicesTime) {
this.servicesTime = servicesTime;
} public int getRemainServiceTime() {
return remainServiceTime;
} public void setRemainServiceTime(int remainServiceTime) {
this.remainServiceTime = remainServiceTime;
} public int getStartTime() {
return startTime;
} public void setStartTime(int startTime) {
this.startTime = startTime;
} public int getWaitTime() {
return waitTime;
} public void setWaitTime(int waitTime) {
this.waitTime = waitTime;
} public int getCompletionTime() {
return completionTime;
} public void setCompletionTime(int completionTime) {
this.completionTime = completionTime;
} public int getTurnAroundTime() {
return turnAroundTime;
} public void setTurnAroundTime(int turnAroundTime) {
this.turnAroundTime = turnAroundTime;
} public double getTurnAroundTimeWithWeight() {
return turnAroundTimeWithWeight;
} public void setTurnAroundTimeWithWeight(double turnAroundTimeWithWeight) {
this.turnAroundTimeWithWeight = turnAroundTimeWithWeight;
} @Override
public String toString() {
return "Process [arrivalTime=" + arrivalTime + ", servicesTime="
+ servicesTime + ", remainServiceTime=" + remainServiceTime
+ ", startTime=" + startTime + ", waitTime=" + waitTime
+ ", completionTime=" + completionTime + ", turnAroundTime="
+ turnAroundTime + ", turnAroundTimeWithWeight="
+ turnAroundTimeWithWeight + "]";
}
}
3. Tools类
因为这次要实现几个类似的算法,所以我把每个算法中都要用到的方法都提取出来作为单独的工具类。
也可以将这些工具方法都放入FCFS类中。
package xqy.Util; import java.util.ArrayList; import xqy.been.Process; public class Tools { public static double calcAverageTurnAroundTime(
ArrayList<Process> processList) {
double sum = 0;
for (int i = 0; i < processList.size(); i++) {
sum += processList.get(i).getTurnAroundTime();
}
return Math.round(sum / processList.size() * 100) / 100.0;
} public static double calcAverageTurnAroundTimeWithWeight(
ArrayList<Process> processList) {
double sum = 0;
for (int i = 0; i < processList.size(); i++) {
sum += processList.get(i).getTurnAroundTimeWithWeight();
}
return Math.round(sum / processList.size() * 100) / 100.0;
} public static void printResult(ArrayList<Process> processList) {
System.out.println("\n #RESULT#"); System.out.print("\tArrive:\t\t");
for (int i = 0; i < processList.size(); i++) {
System.out.print(processList.get(i).getArrivalTime() + "\t");
}
System.out.println(); System.out.print("\tService:\t");
for (int i = 0; i < processList.size(); i++) {
System.out.print(processList.get(i).getServicesTime() + "\t");
}
System.out.println(); System.out.print("\tStart:\t\t");
for (int i = 0; i < processList.size(); i++) {
System.out.print(processList.get(i).getStartTime() + "\t");
}
System.out.println(); System.out.print("\tWait:\t\t");
for (int i = 0; i < processList.size(); i++) {
System.out.print(processList.get(i).getWaitTime() + "\t");
}
System.out.println(); System.out.print("\tFinish:\t\t");
for (int i = 0; i < processList.size(); i++) {
System.out.print(processList.get(i).getCompletionTime() + "\t");
}
System.out.println(); System.out.print("\tTurn around:\t");
for (int i = 0; i < processList.size(); i++) {
System.out.print(processList.get(i).getTurnAroundTime() + "\t");
}
System.out.println(); System.out.print("\tTA wight:\t");
for (int i = 0; i < processList.size(); i++) {
System.out.print(Math.round(processList.get(i)
.getTurnAroundTimeWithWeight() * 100) / 100.0 + "\t");
}
System.out.println(); System.out.println("\tAverage turn around time:"
+ Tools.calcAverageTurnAroundTime(processList) + "\t");
System.out.println("\tAverage turn around time with wight:"
+ Tools.calcAverageTurnAroundTimeWithWeight(processList)); System.out.println();
}
}
Java实现进程调度算法(一) FCFS(先来先服务)的更多相关文章
- Java实现进程调度算法(二) RR(时间片轮转)
一.概述 因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示. 也因为我这次要实现多个类似算法,所以将一些共性单独提取出来作为一个类. 如果只想要和算法有关的核心代 ...
- Linux 常见的进程调度算法
1.在介绍进程调度之前,先对进程的状态的概念应该有所了解,下面是关于进程状态的一些基本概念:进程的状态分为三种,分别为: 1).运行态:该状态表明进程在实际占用CPU 2).就绪态: 该状态下进程可以 ...
- os的进程调度算法(抄袭的)
package me.letterwish.test; import java.io.BufferedInputStream; import java.io.FileInputStream; impo ...
- 进程调度算法Linux进程调度算法
这次介绍一下操作系统的进程调度算法 操作系统的调度分为三种:1.远程调度(创建新进程):2.中程调度(交换功能的一部分):3.短程调度(下次执行哪个进程) 这次讲述的就是短程调度,可以简单的看作咱们平 ...
- Linux - 进程调度算法
进程调度: 无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数.这将导致它们互相争夺处理机.另外,系统进程也同样需要使用处理机. 这就要求进程调度程序按一定的策略,动态地把处理机分配给处于 ...
- 《操作系统_时间片轮转RR进程调度算法》
转自:https://blog.csdn.net/houchaoqun_xmu/article/details/55540250 时间片轮转RR进程调度算法 一.概念介绍和案例解析时间片轮转法 - 基 ...
- Linux常见的进程调度算法
进程调度:在操作系统中调度是指一种资源分配. 调度算法是指: 根据系统的资源分配策略所规定的资源分配算法. 操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源 ...
- Java的进程内缓存框架:EhCache (转)
EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. Ehcache缓存的特点: 1. 快速. 2. 简单. 3. 多种缓存 ...
- Android利用LocalSocket实现Java端进程与C端进程之间的IPC
Android是建立在Linux之上的OS,在涉及到安全.网络协议.文件加密等功能时,往往需要通过C语言调用底层API来实现,而如何发出指令让C端执行我们想要的功能,并且在执行之后有返回结果呢,这就需 ...
随机推荐
- LOJ#6046. 「雅礼集训 2017 Day8」爷(分块)
题面 传送门 题解 转化为\(dfs\)序之后就变成一个区间加,区间查询\(k\)小值的问题了,这显然只能分块了 然而我们分块之后需要在块内排序,然后二分\(k\)小值并在块内二分小于它的元素--一个 ...
- jquery中通过trim() length 判断数据是否有值
在jquery中可以通过如下方式判断某一个字符串是否有值,结合if else if 语句进行业务逻辑的处理 <!DOCTYPE html> <html lang="en&q ...
- php 递归数据,三维数组转换二维
public function sortarea($area, $parent_id = 0, $lev = 1){ static $list; foreach($area as $v){ if($v ...
- mxonline实战17,上线部署
在线演示: http://47.244.22.82 python3+django2.0的环境 需要安装的库pip install django-simple-captcha django-pure-p ...
- springMVC请求注解@RequestMapping各个属性值
最近遇到了一个采用fastJson传输数据的方式,搞了半天,总是感觉模糊,觉得自己有必要在这里做一个系统的总结,今天先从@RequestMapping的属性开始,采用REST 风格的 URL 请求,R ...
- STM32-RS485通信软硬件实现
OS:Windows 64 Development kit:MDK5.14 IDE:UV4 MCU:STM32F103C8T6/VET6 AD:Altium Designer 18.0.12 1.RS ...
- windows jenkins 卸载
如果下载的是war包,先在任务管理器上停止jenkins的服务,再删除jenkins整个文件
- appium Capabilities的各个标签
今天详解一下Capabilities的各个标签,以后如果用得着可以随时翻阅. General Capabilities 标签 概述 值 automationName 使用引擎 默认为Appium,其中 ...
- localstrage、cookie、session等跨域和跨页面监听更新问题
localstrage.cookie.session等跨域和跨页面监听更新问题
- 2018徐州网络赛 - Trace
题意:n个左下角为原点右上角在第一象限的矩形不断覆盖,求最后形成的图形的周长 x和y是独立的,分别维护两棵线段树,一棵表示x坐标下最大的y值,另一棵表示y坐标下最大的x值 从覆盖的角度来考虑,如果逆序 ...