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. power designer 使用vba实现自动化操作学习
  2. Vue CLI3.0 中使用jQuery 和 Bootstrap
  3. c语言合法自定义标识符_计算机二级C语言干货来了
  4. activity 点击后传递数据给fragment_【磨叽教程】Android进阶之Fragment的管理以及事务执行...
  5. AcWing 836. 合并集合
  6. 灵格斯怎么屏幕取词_灵格斯词霸(Lingoes)基础使用教程
  7. Oracle P6 配置SQLServer数据库报FileStream错误
  8. 如何查看文件的md5值
  9. 利用计算机的随机模拟结果帮助学生,数学《教学反思》 初中白小曼
  10. python大文件去重_python3 大文件去重的方法
  11. matlab中如何画柱状图,如何在用Matlab画柱状图
  12. 思维导图不会画,没关系,实用思维导图模板分享
  13. 【仿人机器人】双足机器人行走碰撞模型:Passive g walking of a compass robot
  14. word2019每页设置不同页眉
  15. 【转载】Cygwin安装
  16. vi 怎么 保存, 退出编辑
  17. 上海精神卫生中心怎么样 (徐汇区)
  18. 图片如何添加水印文字?如何设置照片水印?
  19. WIN10 系统无法启动YY开播
  20. 计量经济学笔记5-Eviews操作-异方差的检验与消除(White检验与加权最小二乘)

热门文章

  1. OPPO R11还有4天发布,国外媒体通过可靠来源曝光其售价
  2. 《大数据日知录》读书笔记-ch2数据复制与一致性
  3. Nyist125 盗梦空间
  4. Lodop插件未安装 页面卡死 点击无反应
  5. 笔记——zgrep命令(1)
  6. 李本虎律师:网络视频”快播“的问题
  7. cvFloor(),cvCeil(),cvRound()函数解释
  8. 如何切换node版本
  9. MATLAB的四种取整方法
  10. 基于python的opencv图像处理实现对斑马线的检测(最简单的方法!!!几十行代码搞定!!!)