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端执行我们想要的功能,并且在执行之后有返回结果呢,这就需 ...
随机推荐
- 【ocp-12c】最新Oracle OCP-071考试题库(43题)
43.(9-2)choose three Which three tasks can be performed by DDL statements? A) preventing data retrie ...
- “全栈2019”Java异常第七章:try-catch-finally组合方式
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- 报错 POST http://192.168.79.165:8015/marketing/manager 400 (BAD REQUEST) 解决办法
我用jQuery ajax post方法 用flask url_for 传值到后端 $.ajax({ url:"{{url_for('marketing.manager')}}", ...
- docker查看容器
1.查看启动成功的容器,这个命令看不见的说明已经炸了: # docker ps 2.查看所有容器,死的活的都能看见: # docker ps -a 3.查看容器日志: # docker logs c8 ...
- HDU-1160-FatMouse's Speed(线性DP,LIS)
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 3.3.1 Validations
摘要: 出处:黑洞中的奇点 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读.本文版权归作者所有,欢迎转载,但请保留该 ...
- 题目1003:A+B(字符串转数字)
问题来源 http://ac.jobdu.com/problem.php?pid=1003 问题描述 每次给你两个数,数的形式是每三位有一个间隔符',',计算两数之和. 问题分析 两个问题,一.如何读 ...
- day5:python学习之集合
0. 集合的作用及特点 集合具有去重和关系测试两大作用,它具有无序的特点. list1 = [1,2,3,4,5,7,6,8,6,4] list1 = set(list1) print(list1) ...
- datetime之 utcnow 和now的用法
from datetime import datetime print(datetime.now()) 本地时间 print(datetime.utcnow()) 国际时间
- Unity脚本生命周期与执行顺序
文章目录 脚本生命周期 MonoBehavior生命周期图 脚本执行顺序 自定义执行顺序 在Unity中,脚本可以理解为附加在游戏对象上的用于定义游戏对象行为的指令代码.必须绑定在游戏对象上才能开始它 ...