package com.algorithm.multiStageFeedback;

import java.util.*;

/** * @Class MSFQS * @Description 多级反馈队列调度算法 * @Author Naren * @Date 2020/5/30 10:46 * @Version 1.0 */

public class MSFQS {

/*三个队列*/

private static Queue firstQueue = new LinkedList<>();

private static Queue secondQueue = new LinkedList<>();

private static Queue thirdQueue = new LinkedList<>();

private static int firstTime; //第一队列cpu时间片

private static int secondTime; //第二队列cpu时间片

private static int thirdTime; //第三队列cpu时间片

private static int proNum; //进程数量

private static Scanner sc = new Scanner(System.in);

/** * 内部进程类:模拟进程 */

private static class Progress implements Comparable {

String id; //进程标识符

int reachTime; //到达时间

int cpuTime; //运行时间

int needTime; //仍需时间

char state; //进程状态

/*重排输出格式*/

@Override

public String toString() {

System.out.println();

return String.format("进程%s: %10d %7d %8d %7c\n", id, reachTime, cpuTime, needTime, state);

}

/*重写比较器*/

@Override

public int compareTo( Progress b ) {

//按reachTime从小到大排序

return Float.compare(reachTime, b.reachTime);

}

}

/** * 进程调度算法:Multi-stage feedback queue scheduling algorithm */

private static void progressScheduling(Progress[] pro){

int firstCpu = firstTime;

int secondCpu = secondTime;

int thirdCpu = thirdTime;

int currentTime = 0;

int num = 0;

//System.out.println(Arrays.toString(pro));

/*当有进程未运行时或进程队列不为空时,以每1时间片为单位*/

while(num < proNum || !firstQueue.isEmpty() || !secondQueue.isEmpty() || !thirdQueue.isEmpty()){

/*当前时刻有进程到达,则添加入第一队列*/

while(num < proNum && pro[num].reachTime == currentTime)

firstQueue.offer(pro[num++]);

//打印上一秒各队列进程状态

viewMenu(currentTime);

/*当前为队列1在运行进程*/

if(!firstQueue.isEmpty()){

if (secondQueue.peek() != null) secondQueue.peek().state = 'R';

if (thirdQueue.peek() != null) thirdQueue.peek().state = 'R';

//仍需时间:-1

firstQueue.peek().needTime -= 1;

//CPU剩余时间片:-1

firstTime -= 1;

//更新当前时间:+1

currentTime++;

//进程正在运行,状态:E.

if(firstQueue.peek().needTime > 0){

firstQueue.peek().state = 'E';

//当前队列CPU时间片用完而进程仍未运行完时,进程出队,入次优先级队尾

if(firstTime == 0) {

firstQueue.peek().state = 'R';

secondQueue.offer(firstQueue.poll());

firstTime = firstCpu;

}

}

//进程运行完毕,状态:F,记录完成时刻并出队

else if(firstQueue.peek().needTime == 0){

firstQueue.peek().state = 'F';

System.out.printf("\n当前时刻:%d,此进程运行结束:\n",currentTime);

System.out.println(firstQueue.peek());

Objects.requireNonNull(firstQueue.poll());

firstTime = firstCpu;

}

}

/*当前为队列2在运行进程*/

else if(!secondQueue.isEmpty()){

if (thirdQueue.peek() != null) thirdQueue.peek().state = 'R';

//仍需时间:-1

secondQueue.peek().needTime -= 1;

//CPU剩余时间片:-1

secondTime -= 1;

//更新当前时间:+1

currentTime++;

//进程运行完毕,状态:F,记录完成时刻并出队

if(secondQueue.peek().needTime == 0){

secondTime = secondCpu;

secondQueue.peek().state = 'F';

System.out.printf("\n当前时刻:%d,此进程运行结束:\n",currentTime);

System.out.println(secondQueue.peek());

Objects.requireNonNull(secondQueue.poll());

}

//进程正在运行,状态:E.

else if(secondQueue.peek().needTime > 0){

secondQueue.peek().state = 'E';

//当前队列CPU时间片用完而进程仍未运行完时,进程出队,入次优先级队尾

if(secondTime == 0) {

secondQueue.peek().state = 'R';

thirdQueue.offer(secondQueue.poll());

secondTime = secondCpu;

}

}

}

/*当前为队列3在运行进程*/

else if(!thirdQueue.isEmpty()){

//仍需时间:-1

thirdQueue.peek().needTime -= 1;

//CPU剩余时间片:-1

thirdTime -= 1;

//更新当前时间:+1

currentTime++;

//进程正在运行,状态:R.

if(thirdQueue.peek().needTime > 0){

thirdQueue.peek().state = 'E';

//当前队列CPU时间片用完而进程仍未运行完时,进程出队,入次优先级队尾

if(thirdTime == 0) {

thirdQueue.peek().state = 'R';

thirdQueue.offer(thirdQueue.poll());

thirdTime = thirdCpu;

}

}

//进程运行完毕,状态:F,记录完成时刻并出队

else{

firstTime = firstCpu;

thirdQueue.peek().state = 'F';

System.out.printf("\n当前时刻:%d,此进程运行结束:\n",currentTime);

System.out.println(thirdQueue.peek());

Objects.requireNonNull(thirdQueue.poll());

}

}

}

}

/** * 输入面板:获取到进程数组 */

private static Progress[] operator(){

System.out.println("-----------------3118004950 柴政-----------------\n");

System.out.println("欢迎进入多级队列反馈调度模拟系统,队列个数:3。\n\n");

System.out.println("请按队列优先级从高到低的顺序输入各个队列的时间片长度:");

firstTime = sc.nextInt();

secondTime = sc.nextInt();

thirdTime = sc.nextInt();

System.out.print( "请输入进程数:" );

proNum = sc.nextInt();

/*获取到进程数组*/

Progress[] pro = new Progress[proNum];

System.out.println( "请依次输入进程标识符,进程到达时间,进程运行时间:" );

for( int i = 0; i < proNum; i++ ) {

pro[i] = new Progress();

pro[i].id = sc.next();

pro[i].reachTime = sc.nextInt();

pro[i].cpuTime = sc.nextInt();

pro[i].needTime = pro[i].cpuTime;

pro[i].state = 'R';

}

//对进程按照compareTo()的要求按照到达时间排序

Arrays.sort(pro);

return pro;

}

/** * 输出面板:实时输出运行结果 */

private static void viewMenu(int currentTime){

System.out.printf("\n当前时刻:%d\n",currentTime);

System.out.println("---------------------------------------------");

System.out.println(" 到达时间 运行时间 剩余时间 状态");

if(firstQueue.isEmpty()) System.out.println("队列一:空");

else System.out.println("队列一:\n"+ firstQueue.toString()

.replace("[", "").replace("]", "")

.replace(", ", ""));

if(secondQueue.isEmpty()) System.out.println("队列二:空");

else System.out.println("队列二:\n"+ secondQueue.toString()

.replace("[", "").replace("]", "")

.replace(", ", ""));

if(thirdQueue.isEmpty()) System.out.println("队列三:空");

else System.out.println("队列三:\n"+ thirdQueue.toString()

.replace("[", "").replace("]", "")

.replace(", ", ""));

System.out.println("=============================================");

}

/** * main() */

public static void main(String[] args) {

progressScheduling(operator());

}

}

}

多级队列调度算法可视化界面_操作系统:多级反馈队列调度算法模拟(Java实现)...相关推荐

  1. 多级队列调度算法可视化界面_冷月手撕408之操作系统(8)-处理机调度

    操作系统的处理器资源主要是介绍了,由于多道程序设计带来的并发性,内存中运行多个进程并发运行.而处理器资源是远远小于进程的数量的,所以如何调度处理器给合适的进程成为了OS的焦点. 主要的重点冷月做出了标 ...

  2. 多级队列调度算法可视化界面_多级反馈队列调度算法

    我是一名计算机专业的学生,很荣幸在这里结识各位编程高手.今天第一次写东西,希望大家多多支持,多多留言哦.以下是一个多级反馈队列调度算法,请各位帮忙看看对不对.如果谁能帮写一个更好的那就更感谢了.THA ...

  3. 多级队列调度算法可视化界面_模拟多级反馈队列调度算法原理(源程序c++)

    #include "stdio.h" #include #include #define getpch(type) (type*)malloc(sizeof(type)) #def ...

  4. 多级队列调度算法可视化界面_多级反馈队列调度算法、各种调度算法小结等

    下面我们首先介绍,多级反馈队列调度算法 然后对前面介绍的各种调度算法进行比较 之后呢,我们简单讨论一下 在设计多处理器调度算法时所要考虑的几个问题 多级反馈队列调度算法 是 UNIX 的一个分支,BS ...

  5. 多级队列调度算法可视化界面_进程调度功能由操作系统内核的进程调度程序完成...

    进程调度的功能与时机 一.进程调度的功能 进程调度功能由操作系统内核的进程调度程序完成,在Linux 内核中,进程调度功能的实现从调用内核函数schedule()开始.进程调度的功能是按照某种策略和算 ...

  6. 操作系统 --多级反馈队列调度算法

    操作系统 --多级反馈队列调度算法 转载地址:https://blog.csdn.net/qq_29342297/article/details/83538828 多级反馈队列算法:不需要事先知道各种 ...

  7. 多级队列调度算法可视化界面_C++实现操作系统调度算法(FSFS,SJF,RR,多级反馈队列算法)...

    #include #include #include #include using namespace std; unsigned int q_id=0; //用于队列进程号的全局变量 unsigne ...

  8. 进程调度算法-时间片轮转、最高优先级和多级反馈队列调度算法

    文章目录 前言 一.时间片轮转 二.最高优先级 三.多级反馈队列 总结 前言 从上一篇文章中已经介绍了几种常见的单核CPU进程调度算法,本篇文章顺着上一篇文章的节奏,继续讲解几种剩余常见的进程调度算法 ...

  9. 十、调度算法----时间片轮转、优先级调度、多级反馈队列

    一.知识总览 二.时间片轮转法 注意: 如果时间片太大,使得每个进程都可以在一个时间片内完成,则时间片轮转调度算法退化为先来先服务调度算法,并且会增大进程的响应时间,因此时间片不能太大. 另一方面,进 ...

最新文章

  1. 使用 cmd、PowerShell 等用命令行的方式创建文件及文件夹
  2. [Java基础]Random
  3. 前端学习(2019)vue之电商管理系统电商系统处理attr参数
  4. leetcode题解347-前 K 个高频元素
  5. linux服务器查看系统装到哪个盘,查看linux安装了什么服务器地址
  6. 百度网盘图片直链的php解析代码
  7. Gamvas Web 0.8.4 发布,JavaScript 游戏引擎
  8. Win10安装python扩展的几种方式
  9. c语言社交网络,【C++】设计并实现一种简单的社交网络模型图
  10. 学术论坛第三期:多指标异常检测方法综述
  11. 交换机:广播风暴产生原因与解决方法、STP生成树协议 ,根桥(根交换机)、备份根桥、非根交换机、根端口、指定端口、非根非指定端口、桥ID
  12. 【转载】uTorrent缓存设置,防止出现磁盘负荷100%
  13. Unity Shader - Heightmap 高度贴图
  14. iPhone设置中的“开发者”选项
  15. myeclipse中导入的js文件报错(出现红叉叉,提示语法错误)
  16. Focus事件与blur事件
  17. 运行 RoCEv2 的网络注意事项
  18. python:计算股票 CAPM
  19. 一分钟批量查询邮政快递的教程
  20. 解决安装vmware-tools出现报错unable to copy the source file./installer/service.sh to the destination file

热门文章

  1. 消息队列(Message Query)的初学习
  2. word2016 章节多行排序序号接着上面的
  3. 手头有70万,想在广州买房,买南沙好还是黄埔好?
  4. halcon的一维码与二维码的识别
  5. 刘宇翔第一次作业的一些总结
  6. 马云:创业这些年犯下的四个大错
  7. 【IoT】 产品设计之结构设计:模具前模与后模
  8. 美国面试之旅——面试经验分享(ZZ)
  9. chrome查看网页文件_如何在Chrome中直接将文件和网页下载到Google云端硬盘
  10. Triple Adversarial Learning for Influence based PoisoningAttack in Recommender Systems