多级队列调度算法可视化界面_操作系统:多级反馈队列调度算法模拟(Java实现)...
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实现)...相关推荐
- 多级队列调度算法可视化界面_冷月手撕408之操作系统(8)-处理机调度
操作系统的处理器资源主要是介绍了,由于多道程序设计带来的并发性,内存中运行多个进程并发运行.而处理器资源是远远小于进程的数量的,所以如何调度处理器给合适的进程成为了OS的焦点. 主要的重点冷月做出了标 ...
- 多级队列调度算法可视化界面_多级反馈队列调度算法
我是一名计算机专业的学生,很荣幸在这里结识各位编程高手.今天第一次写东西,希望大家多多支持,多多留言哦.以下是一个多级反馈队列调度算法,请各位帮忙看看对不对.如果谁能帮写一个更好的那就更感谢了.THA ...
- 多级队列调度算法可视化界面_模拟多级反馈队列调度算法原理(源程序c++)
#include "stdio.h" #include #include #define getpch(type) (type*)malloc(sizeof(type)) #def ...
- 多级队列调度算法可视化界面_多级反馈队列调度算法、各种调度算法小结等
下面我们首先介绍,多级反馈队列调度算法 然后对前面介绍的各种调度算法进行比较 之后呢,我们简单讨论一下 在设计多处理器调度算法时所要考虑的几个问题 多级反馈队列调度算法 是 UNIX 的一个分支,BS ...
- 多级队列调度算法可视化界面_进程调度功能由操作系统内核的进程调度程序完成...
进程调度的功能与时机 一.进程调度的功能 进程调度功能由操作系统内核的进程调度程序完成,在Linux 内核中,进程调度功能的实现从调用内核函数schedule()开始.进程调度的功能是按照某种策略和算 ...
- 操作系统 --多级反馈队列调度算法
操作系统 --多级反馈队列调度算法 转载地址:https://blog.csdn.net/qq_29342297/article/details/83538828 多级反馈队列算法:不需要事先知道各种 ...
- 多级队列调度算法可视化界面_C++实现操作系统调度算法(FSFS,SJF,RR,多级反馈队列算法)...
#include #include #include #include using namespace std; unsigned int q_id=0; //用于队列进程号的全局变量 unsigne ...
- 进程调度算法-时间片轮转、最高优先级和多级反馈队列调度算法
文章目录 前言 一.时间片轮转 二.最高优先级 三.多级反馈队列 总结 前言 从上一篇文章中已经介绍了几种常见的单核CPU进程调度算法,本篇文章顺着上一篇文章的节奏,继续讲解几种剩余常见的进程调度算法 ...
- 十、调度算法----时间片轮转、优先级调度、多级反馈队列
一.知识总览 二.时间片轮转法 注意: 如果时间片太大,使得每个进程都可以在一个时间片内完成,则时间片轮转调度算法退化为先来先服务调度算法,并且会增大进程的响应时间,因此时间片不能太大. 另一方面,进 ...
最新文章
- 使用 cmd、PowerShell 等用命令行的方式创建文件及文件夹
- [Java基础]Random
- 前端学习(2019)vue之电商管理系统电商系统处理attr参数
- leetcode题解347-前 K 个高频元素
- linux服务器查看系统装到哪个盘,查看linux安装了什么服务器地址
- 百度网盘图片直链的php解析代码
- Gamvas Web 0.8.4 发布,JavaScript 游戏引擎
- Win10安装python扩展的几种方式
- c语言社交网络,【C++】设计并实现一种简单的社交网络模型图
- 学术论坛第三期:多指标异常检测方法综述
- 交换机:广播风暴产生原因与解决方法、STP生成树协议 ,根桥(根交换机)、备份根桥、非根交换机、根端口、指定端口、非根非指定端口、桥ID
- 【转载】uTorrent缓存设置,防止出现磁盘负荷100%
- Unity Shader - Heightmap 高度贴图
- iPhone设置中的“开发者”选项
- myeclipse中导入的js文件报错(出现红叉叉,提示语法错误)
- Focus事件与blur事件
- 运行 RoCEv2 的网络注意事项
- python:计算股票 CAPM
- 一分钟批量查询邮政快递的教程
- 解决安装vmware-tools出现报错unable to copy the source file./installer/service.sh to the destination file
热门文章
- 消息队列(Message Query)的初学习
- word2016 章节多行排序序号接着上面的
- 手头有70万,想在广州买房,买南沙好还是黄埔好?
- halcon的一维码与二维码的识别
- 刘宇翔第一次作业的一些总结
- 马云:创业这些年犯下的四个大错
- 【IoT】 产品设计之结构设计:模具前模与后模
- 美国面试之旅——面试经验分享(ZZ)
- chrome查看网页文件_如何在Chrome中直接将文件和网页下载到Google云端硬盘
- Triple Adversarial Learning for Influence based PoisoningAttack in Recommender Systems