一、概述

  因为这次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(先来先服务)的更多相关文章

  1. Java实现进程调度算法(二) RR(时间片轮转)

    一.概述 因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示. 也因为我这次要实现多个类似算法,所以将一些共性单独提取出来作为一个类. 如果只想要和算法有关的核心代 ...

  2. Linux 常见的进程调度算法

    1.在介绍进程调度之前,先对进程的状态的概念应该有所了解,下面是关于进程状态的一些基本概念:进程的状态分为三种,分别为: 1).运行态:该状态表明进程在实际占用CPU 2).就绪态: 该状态下进程可以 ...

  3. os的进程调度算法(抄袭的)

    package me.letterwish.test; import java.io.BufferedInputStream; import java.io.FileInputStream; impo ...

  4. 进程调度算法Linux进程调度算法

    这次介绍一下操作系统的进程调度算法 操作系统的调度分为三种:1.远程调度(创建新进程):2.中程调度(交换功能的一部分):3.短程调度(下次执行哪个进程) 这次讲述的就是短程调度,可以简单的看作咱们平 ...

  5. Linux - 进程调度算法

    进程调度: 无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数.这将导致它们互相争夺处理机.另外,系统进程也同样需要使用处理机. 这就要求进程调度程序按一定的策略,动态地把处理机分配给处于 ...

  6. 《操作系统_时间片轮转RR进程调度算法》

    转自:https://blog.csdn.net/houchaoqun_xmu/article/details/55540250 时间片轮转RR进程调度算法 一.概念介绍和案例解析时间片轮转法 - 基 ...

  7. Linux常见的进程调度算法

    进程调度:在操作系统中调度是指一种资源分配. 调度算法是指: 根据系统的资源分配策略所规定的资源分配算法. 操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源 ...

  8. Java的进程内缓存框架:EhCache (转)

    EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. Ehcache缓存的特点: 1. 快速. 2. 简单. 3. 多种缓存 ...

  9. Android利用LocalSocket实现Java端进程与C端进程之间的IPC

    Android是建立在Linux之上的OS,在涉及到安全.网络协议.文件加密等功能时,往往需要通过C语言调用底层API来实现,而如何发出指令让C端执行我们想要的功能,并且在执行之后有返回结果呢,这就需 ...

随机推荐

  1. Spring 中aop切面注解实现

    spring中aop的注解实现方式简单实例   上篇中我们讲到spring的xml实现,这里我们讲讲使用注解如何实现aop呢.前面已经讲过aop的简单理解了,这里就不在赘述了. 注解方式实现aop我们 ...

  2. Java - io输入输出流 --转换流

    转换流  转换输出流 OutputStreamWriter: 说明: /* * OutputStreamWriter 这个类的作用 * 就是指定输出流的编码格式 * 这个类的构造方法 需要传递 一个输 ...

  3. 操作mysql的指令

    1,通过ip,端口,用户名,密码登陆数据 命令格式为:mysql -h ip -u root -p -P 3306例如:mysql -h 127.0.0.1 -u root -p -P 3306 2, ...

  4. jquery源码解析:attr,prop,attrHooks,propHooks详解

    我们先来看一下jQuery中有多少个方法是用来操作元素属性的. 首先,看一下实例方法: 然后,看下静态方法(工具方法): 静态方法是内部使用的,我们外面使用的很少,实例方法才是对外的. 接下来,我们来 ...

  5. VMware 虚拟机报错解决

    Could not apply the stored configuration for monitors none of the selected modes were compatible wit ...

  6. 爬虫实战4:用selenium爬取淘宝美食

    方案1:一次性爬取全部淘宝美食信息 1. spider.py文件如下 __author__ = 'Administrator' from selenium import webdriver from ...

  7. 爬虫2:urllib

        了解即可,不好用   一. 概述   python内置的http请求库,包括4个模块,分别如下   urllib.request   请求模块 urllib.error       异常处理模 ...

  8. Linux和Windows数据同步

    正在做一个小项目,关于Linux和Windows数据同步,新知识很兴奋,比赛很有信心,加油吧少年 项目进行中:今晚实验室包宿开整.

  9. 45.oracle表类型、数据拆分、表分区

    不要做一些没有意义的事情,就比如说你要离职并不打算吃回头草,离职理由中完全没有必要说明“领导的水平太渣,人品太差”此类的原因,而是“个人原因”,当然实在不批准辞职另说. oracle表类型 表的类型分 ...

  10. QuantLib 金融计算——基本组件之 Index 类

    目录 QuantLib 金融计算--基本组件之 Index 类 QuantLib 金融计算--基本组件之 Index 类 Index 类用于表示已知的指数或者收益率,例如 Libor 或 Shibor ...