一、FCFS的介绍

先来先服务的调度算法:最简单的调度算法,既可以用于作业调度 ,也可以用于程序调度,当作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,优先从后备队列中,选择一个或多个位于队列头部的作业,把他们调入内存,分配所需资源、创建进程,然后放入“就绪队列”,直到该进程运行到完成或发生某事件堵塞后,进程调度程序才将处理机分配给其他进程。

简单了说就是如同名字 “先来先服务” ;

二、代码演示

package com.zsh.blog;

import java.util.Scanner;

/**
* @author:抱着鱼睡觉的喵喵
* @date:2021/3/19
* @description:
*/
public class SimulateSystem {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
SimulateFCFS simulateFCFS = new SimulateFCFS();
boolean flag = true;
char at = ' ';
System.out.println("a:Simulate multiple processes to form a queue");
System.out.println("b:Assign a process to the queue");
System.out.println("d:Complete all process work");
System.out.println("e:Exit the simulated system");
while (flag) {
System.out.println("Please enter your instructions:");
at = scanner.next().charAt(0);
switch (at) {
case 'a':
simulateFCFS.createQueue();
break;
case 'b':
simulateFCFS.assignProcess();
break;
case 'd':
simulateFCFS.finishAllProcessTask();
return;
case 'e':
System.out.println("Simulated is end~");
return;
default:
System.out.println("Your input is wrong, please re-enter!");
break;
}
}
} } class Queue {
int arrTime; //timeOfArrival
int serviceTime; //timeOfService
int finishTime; //timeOfComplish
int turnTime; //timeOfTurnaround
double weightTurnTime; //timeOfWeightTurnaround
String processName; //process number
Queue next; public Queue(int arrTime, int serviceTime, String processName) {
this.arrTime = arrTime;
this.serviceTime = serviceTime;
this.processName = processName;
} public Queue() {
}
} /**
* Simulate FCFS algorithm class
*/
class SimulateFCFS {
private Queue head = new Queue(-1, -1, null);
private int timer = 0;
private Queue tail = head; public void createQueue() {
Queue arr = null;
Queue temp = head;
Scanner scanner = new Scanner(System.in);
System.out.printf("Please enter the number of process tasks to initialize the simulation:");
int n = scanner.nextInt();
for (int i = 1; i <= n; i++) {
System.out.printf("Please enter the process number, start time, and service time of the %d process:",i);
arr = new Queue();
keyBordInput(arr, scanner);
calTime(arr);
temp.next = arr;
temp = arr; }
this.tail = arr;
System.out.println("Simulation allocation is successful!");
} /**
* Completion time of calculation process - Turnaround time - Weighted turnaround time
* @param arr
*/
public void calTime(Queue arr) {
Queue temp = arr;
if (this.timer < temp.arrTime) {
this.timer = arr.arrTime;
} else {
if (timer == 0) {
this.timer = temp.arrTime;
}
}
temp.finishTime = temp.serviceTime + this.timer;
temp.turnTime = temp.finishTime - temp.arrTime;
temp.weightTurnTime = (temp.turnTime * 1.0) / (temp.serviceTime * 1.0);
this.timer += temp.serviceTime;
}
/**
* Process number,arrival time,service time entered from the keyboard
* @param arr
* @param scanner
*/
public void keyBordInput(Queue arr, Scanner scanner) {
arr.processName = scanner.next();
arr.arrTime = scanner.nextInt();
arr.serviceTime = scanner.nextInt();
} /**
* Assign a process to the queue
*/
public void assignProcess() {
Queue newProcess = new Queue();
Scanner scanner = new Scanner(System.in);
System.out.printf("Please enter the add process number,start time,and service time of the process:");
keyBordInput(newProcess, scanner);
calTime(newProcess);
this.tail.next = newProcess;
this.tail = newProcess;
} /**
* Complish a task of process from the queue
*/
// public void finishProcessTask() {
// Queue workingProcess = head;
//
// }
/**
* Complish all task of process from the queue
*/
public void finishAllProcessTask() {
if (isEmpty()) {
return;
}
Queue cur = head.next;
System.out.println("Process number========Arrive time======Service time=======finish Time=======Turn time======WeightTurn time");
while (true) {
System.out.printf("\t\t%s\t\t\t\t%d\t\t\t\t\t%d\t\t\t\t\t%d\t\t\t\t%d\t\t\t\t%f",cur.processName,cur.arrTime,cur.serviceTime,cur.finishTime,cur.turnTime,cur.weightTurnTime);
System.out.println();
if (cur.next == null) {
break;
}
cur = cur.next;
}
} public boolean isEmpty() {
if (head.next == null) {
System.out.println("Queue is null!");
return true;
}
return false;
}
}

三、代码分析

1.使用节点模拟进程

因为需要计算完成时间、周转时间、带权周转时间,所以需要事先给出每个进程到达时间和服务时间

模拟时至少需要以下几个属性(Queue类对象模拟进程)

class Queue {
int arrTime; //timeOfArrival
int serviceTime; //timeOfService
int finishTime; //timeOfComplish
int turnTime; //timeOfTurnaround
double weightTurnTime; //timeOfWeightTurnaround
String processName; //process number
Queue next; public Queue(int arrTime, int serviceTime, String processName) {
this.arrTime = arrTime;
this.serviceTime = serviceTime;
this.processName = processName;
} public Queue() {
}
}

2.SimulateFCFS(核心模拟FCFS类)


以下分析核心模拟类

3.创建一个节点为n的队列(模拟就绪队列)

    public void createQueue() {
Queue arr = null;
Queue temp = head;
Scanner scanner = new Scanner(System.in);
System.out.printf("Please enter the number of process tasks to initialize the simulation:");
int n = scanner.nextInt(); //创建节点数为n的队列
for (int i = 1; i <= n; i++) {
System.out.printf("Please enter the process number, start time, and service time of the %d process:",i);
arr = new Queue();
keyBordInput(arr, scanner);//这个自定义的函数主要用来输入进程的到达时间和服务时间
calTime(arr); //该自定义函数用来计算完成时间、周转时间、带权周转时间
temp.next = arr;
temp = arr; //进行节点连接 }
this.tail = arr;
System.out.println("Simulation allocation is successful!");
}

4.核心计算分析

(如果是第一个进程) 完成时间 = 服务时间 + 到达时间


如果是n>1的进程就要考虑前面进程所花费的时间和该进程到达时间的长短问题。如果前面所花费的完成时间大于该进程的到达进程,则(完成时间 = 服务时间+上一个进程的完成时间)
反之则是 (完成时间= 服务时间+到达时间)

//timer是全局变量,用来计算完成时间(解决上面的问题)
public void calTime(Queue arr) {
Queue temp = arr;
if (this.timer < temp.arrTime) {
this.timer = arr.arrTime;
} else {
if (timer == 0) {
this.timer = temp.arrTime;
}
}
temp.finishTime = temp.serviceTime + this.timer;
temp.turnTime = temp.finishTime - temp.arrTime;
temp.weightTurnTime = (temp.turnTime * 1.0) / (temp.serviceTime * 1.0);
this.timer += temp.serviceTime;
}

5.输入到达时间和服务时间(模拟进程到达和服务)

public void keyBordInput(Queue arr, Scanner scanner) {
arr.processName = scanner.next();
arr.arrTime = scanner.nextInt();
arr.serviceTime = scanner.nextInt();
}

6.出队列(模拟完成所有进程工作)

public void finishAllProcessTask() {
if (isEmpty()) {
return;
}
Queue cur = head.next;
System.out.println("Process number========Arrive time======Service time=======finish Time=======Turn time======WeightTurn time");
while (true) {
System.out.printf("\t\t%s\t\t\t\t%d\t\t\t\t\t%d\t\t\t\t\t%d\t\t\t\t%d\t\t\t\t%f",cur.processName,cur.arrTime,cur.serviceTime,cur.finishTime,cur.turnTime,cur.weightTurnTime);
System.out.println();
if (cur.next == null) {
break;
}
cur = cur.next;
}
}

模拟FCFS调度算法(先来先服务)的更多相关文章

  1. 《操作系统_FCFS和SJF》

    先来先服务FCFS和短作业优先SJF进程调度 转自:https://blog.csdn.net/qq_34374664/article/details/73231072 一.概念介绍和案例解析 FCF ...

  2. python基础(31):进程(一)

    1. 什么是进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行 ...

  3. OS作业模拟SJF和FCFS

    一个OS的作业, 用于模拟短作业优先 和 先来先服务两种作业调度方式. #!/usr/bin/python3.5 ## Modify the SJF and FCFS algorithm in the ...

  4. FCFS,SSTF,SCAN,FIFO,LRO考点题解

    四.应用题 ( 本大题共5 小题,50 分 ) 1. 假设某系统中有五个进程,每个进程的执行时间(单位:ms)和优先数如下表所示(优先数越小,其优先级越高). 进程 执行时间 优先数 P1 P2 P3 ...

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

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

  6. Linux - 进程调度算法

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

  7. 操作系统常用调度算法(转载https://www.cnblogs.com/kxdblog/p/4798401.html)

    操作系统常用调度算法   在操作系统中存在多种调度算法,其中有的调度算法适用于作业调度,有的调度算法适用于进程调度,有的调度算法两者都适用.下面介绍几种常用的调度算法. 先来先服务(FCFS)调度算法 ...

  8. s5-2 Cpu调度算法

    调度程序采用什么算法选择一个进程(作业)? 如何评价调度算法的性能? 调度准则 CPU利用率 – 使CPU尽可能的忙碌 吞吐量 – 单位时间内运行完的进程数 周转时间 – 进程从提交到运行结束的全部时 ...

  9. Python 调度算法 死锁 静动态链接 分页分段

    1 select poll epoll的区别基本上select有3个缺点: 连接数受限查找配对速度慢数据由内核拷贝到用户态poll改善了第一个缺点 epoll改了三个缺点. (1)select,pol ...

随机推荐

  1. ArcMap从建库到出图

    1前言 本篇博主将介绍关于ArcMap建库.数据采集.拓扑检查.图表.制作符号等的基本操作. 2问题阐述 (1)检查现有block(线要素)图层,保证所有要素闭合,并将其转换为parcel(面要素): ...

  2. Makefile 入门(加减乘除实现)

    Makefile 入门(加减乘除实现) 准备 使用任意Linux发行版即可,本文使用WSL Ubuntu. 开始之前,需要安装必要的工具: sudo apt install make g++ 开始 1 ...

  3. JDK8的 CHM 为何放弃分段锁

    概述 我们知道, 在 Java 5 之后,JDK 引入了 java.util.concurrent 并发包 ,其中最常用的就是 ConcurrentHashMap 了, 它的原理是引用了内部的 Seg ...

  4. Linux的总线设备驱动模型

    裸机编写驱动比较自由,按照手册实现其功能即可,每个人写出来都有很大不同: 而Linux中还需要按照Linux的驱动模型来编写,也就是需要按照"模板"来写,写出来的驱动就比较统一. ...

  5. web服务器-nginx优化

    web服务器-nginx优化 一 并发优化 nginx工作模式: 主进程 + 工作进程 启动工作进程数量 worker_processes 4; #指定运行的核的编号,采用掩码的方式设置编号 work ...

  6. 玩转OpenMLDB社区,四张角色卡待解锁

    关于OpenMLDB OpenMLDB 是一个开源机器学习数据库,提供企业级 FeatureOps 全栈解决方案.OpenMLDB 致力于闭环解决 AI 工程化落地的数据治理难题,并且已经在上百个企业 ...

  7. Java锁之乐观锁、悲观锁、自旋锁

    java锁分为三大类乐观锁.悲观锁.自旋锁 乐观锁:乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别 ...

  8. JVM的基础知识

    一.JVM的基础知识 1.JVM内存结构: 1.JVM堆内存结构: 2.JVM内存分配: 3.Java的堆机构和垃圾回收: 4.Jvm堆内存配置参数: 5.JVM新生代概念和配置: 6.JVM老生代概 ...

  9. 攻防世界PHP2

    PHP2 进入环境就一个英文其他啥都没有,英文也没啥提示信息 我们使用dirsearch扫描一下,一开始确实没扫到什么东西,到最后看了wp发现原来源码是在index.phps中,这里只提供一个思路,不 ...

  10. 智能指针中C++重载'->'符号是怎么实现的

    例如下面的代码: class StrPtr{ public: StrPtr() : _ptr(nullptr){} //拷贝构造函数等省略... std::string* operator->( ...