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端执行我们想要的功能,并且在执行之后有返回结果呢,这就需 ...
随机推荐
- 【12c OCP】最新CUUG OCP-071考试题库(49题)
49.(11-1) choose the best answer Examine the structure of the SHIPMENTS table: You want to generate ...
- “全栈2019”Java第一百零九章:匿名内部类实现唯一抽象类或接口
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Java中Io类-File类的构造方法
package com.hxzy.IOSer;import java.io.*;public class Demo02 { public static void main(String[] args) ...
- [bzoj4712]洪水 线段树+树链剖分维护动态dp+二分
Description 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开了创造模式,然后飞到山顶放了格水.于是小A面前出现了一个瀑布.作为平民的小A只好老实巴交地爬 ...
- 确定 RN 中方法的 queue
 如果不指定,每一个模块,都会生成自己的一个串行队列. 可以通过强行声明一个队列来指定所有方法都在这个队列执行 - (dispatch_queue_t)methodQueue { return di ...
- python --爬虫基础 --爬取今日头条 使用 requests 库的基本操作, Ajax
'''思路一: 由于是Ajax的网页,需要先往下划几下看看XHR的内容变化二:分析js中的代码内容三:获取一页中的内容四:获取图片五:保存在本地 使用的库1. requests 网页获取库 2.fro ...
- Centos7 自定义systemctl服务脚本
序言篇: 之前工作环境一直使用Centos6版本,脚本一直在使用/etc/init.d/xxx:系统升级到Cento7后,虽然之前的启动脚本也可以使用,但一直没有使用systemctl 的自定义脚本. ...
- windows 虚拟机VMware 安装linux系统注意事项!!!
1.主机CPU是否支持虚拟化技术? 启动 CPUZ 软件(如下图) 注: 32位系统查看使用CPUZ_x86软件 64位系统查看使用CPUZ_x64软件 启动后 ...
- Go语言类型转换
类型转换用于将一种数据类型的变量转换为另外一种类型的变量. Go语言类型转换基本格式如下:表达式 T(v) 将值 v 转换为类型 T . Go语言各种类型转换及函数的高级用法:strconv包实现了基 ...
- spring boot快速入门 7: 使用aop处理请求
样例:登陆拦截(aop简单样例) 第一步:在pom 文件中加入aop依赖 <!-- spring aop --> <dependency> <groupId>org ...