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|052】OCP 11g最新考题收集整理-第6题
6.You are installing Oracle Grid Infrastructure by using the Oracle Universal Installer (OUI). You s ...
- Visual Studio code安装步骤
1.官方下载:https://code.visualstudio.com/,本人电脑是window系统 下载之后,双击安装,安装完之后左侧栏那边是英文,如何变为中文: 按快捷键ctrl+shift+ ...
- Docker的安装与启动教程
一.安装Docker Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的.在很多版本的CentOS中是 ...
- 面向对象之ajax
1.Ajax发送请求的几个步骤 1. 创建 XMLHttpRequest 对象 var xhr = new XMLHttpRequest();//IE6 使用var xhr= new ActiveXO ...
- 调用jdbc已经写成的方法----jdbc工具类抽取方式三
package jdbc_demo3; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.R ...
- SaltStack Pillar 详解
简介 grains用于存储静态不易变更的数据,而pillar一般用于存储动态, 敏感的数据,通过minion和master设置或获取grains信息,而pillar信息只能在master端配置,在到m ...
- jpetStore 学习总结(2)
在写jpetstore时,最难理解的应该是数据库还有每个表之间的关系了,我在这里对数据库简单的介绍. 以下是数据库的所有表: account表是个人信息表,里面包括用户的名字,邮箱,地址,哪个城 ...
- c/c++ int,float,short 大小端转换函数
unsigned int(uint32_t)大小端转换函数 unsigned int BLEndianUint32(unsigned int value) { return ((value & ...
- python全栈开发_day14_常见语法糖,递归和匿名函数
一:常见语法糖 1)三元函数(三目函数) a=1 if 3>2 else 2 print(a) #得到返回值:1 2)列表字典推导式 lis=[("a",1),(" ...
- [ZJOI2019]语言[树链的并、线段树合并]
题意 题目链接 分析 考虑枚举每个点的答案,最后除以 2 即可. 可以与 \(u\) 构成合法点对 的集合 为所有经过了 \(u\) 的链的并.因为这些链两两有交,根据结论 "树上两条相交的 ...