java模拟实现操作系统进程调度中的多级反馈队列算法

操作系统学了一学期了,期末作业布置下来,用编程语言模拟进程调度的过程,只会java,于是就写了一下,通过控制台模拟,模拟过程看起来可能十分不直观。试了几个例子,发现没有错误。

注释很详细,直接粘上代码

代码

MainTest.java 主方法

package 多级反馈队列算法;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;public class MainTest {public static void main(String[] args) {LevelQueue<Process> Level1Queue = new LevelQueue<Process>(1, 1); // 一级队列,轮转时间片为1LevelQueue<Process> Level2Queue = new LevelQueue<Process>(2, 2); // 二级队列,轮转时间片为2LevelQueue<Process> Level3Queue = new LevelQueue<Process>(3, 4); // 三级队列,轮转时间片为4LevelQueue<Process> Level4Queue = new LevelQueue<Process>(4, 999); // 四级队列,轮转时间片为999(认为是无限大)List<Process> processes = new ArrayList<Process>(); // 存储初始化准备进程的ArrayListint[] arrivalTime; // 进程到达时间数组int currentTime = 0; // 存储当前时间int processSum; // 总进程数int processRemaining; // 剩余进程数// 初始化进程信息Scanner sc = new Scanner(System.in);System.out.println("先输入总进程数, 再依次输入各个进程的到达时间和服务时间");processSum = sc.nextInt();processRemaining = processSum;arrivalTime = new int[processSum];// 初始化到达时间数组for (int i = 0; i < processSum; i++) {int a = sc.nextInt(); // 到达时间int s = sc.nextInt(); // 服务时间Process p = new Process("P" + i, a, s);arrivalTime[i] = a;processes.add(p);}sc.close();// //返回当前用户输入的数据// Iterator it = processes.iterator();// while (it.hasNext()){// Process p = (Process)it.next();// System.out.println(p.toString());// }Process.ifAllCompleted(); // 输出当前进程数// 将进程按照到达时间顺序进行排序 并获得到达时间数组for (int i = 0; i < processSum; i++) {for (int j = i + 1; j < processSum; j++) {Process p1 = (Process) processes.get(i);Process p2 = (Process) processes.get(j);if (p2.arrivalTime < p1.arrivalTime) {processes.set(i, p2);processes.set(j, p1);arrivalTime[i] = p2.arrivalTime;arrivalTime[j] = p1.arrivalTime;} else if (p2.arrivalTime == p1.arrivalTime) { // 若同时到达 则短作业优先if (p2.serviceTime < p1.serviceTime) {processes.set(i, p2);processes.set(j, p1);arrivalTime[i] = p2.arrivalTime;arrivalTime[j] = p1.arrivalTime;} else if (p2.serviceTime == p1.serviceTime) { // 若服务时间也相等,则将p2放在p1后面,并将p1后面的进程和p2交换Process tmp = (Process) processes.get(i + 1);processes.set(i + 1, p2);processes.set(j, tmp);arrivalTime[i + 1] = p2.arrivalTime;arrivalTime[j] = tmp.arrivalTime;}}}}// 验证 排序是否正确Iterator<Process> it2 = processes.iterator();while (it2.hasNext()) {Process p = (Process) it2.next();System.out.println(p.toString());}for (int i = 0; i < arrivalTime.length; i++) {System.out.println(arrivalTime[i]);}// 开始模拟运行int position = 0;// 记录当前运行的进程位置,从0第一个进程开始while (true) {// 首先判断是否有新的作业到达if (position < processSum) { // 若大于等于进程总数则证明全部入队if (arrivalTime[position] <= currentTime) { // 取出数组第一个进程的到达时间与当前时间进行比较// ,若等于或者小于当前时间,// 说明有程序到达并进入第一队列Process p = (Process) processes.get(position);Level1Queue.add(p); // 进程入一级队列System.out.println(p.name + "进程于" + p.arrivalTime + "时间,加入一级队列");if (position == 0) { // 若是第一个到达并开始的作业,则更新当前时间为其到达时间currentTime = p.arrivalTime;}System.out.println("当前时间:" + currentTime);p.queue = Level1Queue; // 为进程初始化当前所在队列信息position++;}} else {if (Process.ifAllCompleted()) { // 如果所有进程完毕则退出循环break;}}if (!Level1Queue.isEmpty()) // 若一级队列非空,则优先执行一级队列{Process p = Level1Queue.peek();if (p.serviceTime <= Level1Queue.timeSlice) { // 如果队头进程服务时间小于等于该队列时间片。// 则进程完成p.Finished(); // 进程结束 并自动出队processRemaining -= 1; // 进程总数-1} else {// 一级出队并打入下一级队列Level1Queue.poll();p.excutedTime += Level1Queue.timeSlice; // 更新进程的运行时间p.queue = Level2Queue; // 为进程更新当前所在队列信息Level2Queue.add(p); // 进入二级队列}// 更新时间 判断是否完成所有进程currentTime += Level1Queue.timeSlice; // 当前时间等于执行前时间加上当前队列时间片System.out.println("当前时间:" + currentTime);if (Process.ifAllCompleted()) { // 如果所有进程完毕则退出循环break;}} else if (!Level2Queue.isEmpty()) // 若一级队列为空,二级队列非空,则优先执行二级队列{Process p = Level2Queue.peek();int timeRemaining = p.serviceTime - p.excutedTime; // 进程剩余时间if (timeRemaining <= Level2Queue.timeSlice) { // 如果队头进程服务时间小于等于该队列时间片。// 则进程完成p.Finished(); // 进程结束 并自动出队processRemaining -= 1; // 进程总数-1// 更新时间 判断是否完成所有进程currentTime += timeRemaining; // 当前时间等于执行前时间加上当前队列时间片System.out.println("当前时间:" + currentTime);if (Process.ifAllCompleted()) { // 如果所有进程完毕则退出循环break;}} else {// 二级出队并打入下一级队列Level2Queue.poll();p.excutedTime += Level2Queue.timeSlice; // 更新进程的运行时间p.queue = Level3Queue; // 为进程更新当前所在队列信息Level3Queue.add(p); // 进入三级队列// 更新时间 判断是否完成所有进程currentTime += Level2Queue.timeSlice; // 当前时间等于执行前时间加上当前队列时间片System.out.println("当前时间:" + currentTime);if (Process.ifAllCompleted()) { // 如果所有进程完毕则退出循环break;}}} else if (!Level3Queue.isEmpty()) // 若二级队列为空,执行三级队列{Process p = Level3Queue.peek();int timeRemaining = p.serviceTime - p.excutedTime; // 进程剩余时间if (timeRemaining <= Level3Queue.timeSlice) { // 如果队头进程服务时间小于等于该队列时间片。// 则进程完成p.Finished(); // 进程结束 并自动出队processRemaining -= 1; // 进程总数-1// 更新时间 判断是否完成所有进程currentTime += timeRemaining; // 当前时间等于执行前时间加上当前队列时间片System.out.println("当前时间:" + currentTime);if (Process.ifAllCompleted()) { // 如果所有进程完毕则退出循环break;}} else {// 三级出队并打入下一级队列Level3Queue.poll();p.excutedTime += Level3Queue.timeSlice; // 更新进程的运行时间p.queue = Level4Queue; // 为进程更新当前所在队列信息Level4Queue.add(p); // 进入三级队列// 更新时间 判断是否完成所有进程currentTime += Level3Queue.timeSlice; // 当前时间等于执行前时间加上当前队列时间片System.out.println("当前时间:" + currentTime);if (Process.ifAllCompleted()) { // 如果所有进程完毕则退出循环break;}}} else if (!Level4Queue.isEmpty()) { // 最后执行四级队列Process p = Level4Queue.peek();int timeRemaining = p.serviceTime - p.excutedTime; // 进程剩余时间Process.ifAllCompleted();p.Finished(); // 进程结束 并自动出队processRemaining -= 1; // 进程总数-1currentTime += timeRemaining; // 当前时间等于执行前时间加上当前队列时间片System.out.println("当前时间:" + currentTime);if (Process.ifAllCompleted()) { // 如果所有进程完毕则退出循环break;}}System.out.println(processRemaining);}}
}

LevelQueue.java 等级队列类

package 多级反馈队列算法;public class LevelQueue<T> implements Queue<Process> {protected Node<Process> front, rear;// front 和rear 分别指向队头和队尾节点protected int levelOfQueue; // 队列等级 1,2,3protected int timeSlice; // 队列时间片 1,2,4protected int account = 0; // 队列中排队的进程数public LevelQueue(int levelOfQueue, int timeSlice) { // 构造队列super();this.levelOfQueue = levelOfQueue;this.timeSlice = timeSlice;}@Overridepublic boolean isEmpty() { // 判断队列是否为空 若为空返回true// TODO Auto-generated method stubif (this.front == null && this.rear == null) {System.out.println(this.levelOfQueue + "级队列当前没有进程正在运行");return true;} else {System.out.println(this.levelOfQueue + "级队列当前有" + this.account + "个进程正在运行");return false;}}@Overridepublic boolean add(Process x) // 入队操作{// TODO Auto-generated method stubif (x == null) {return false; // 元素x 入队 空对象不能入队}// 进程到达cpuNode<Process> q = new Node<Process>(x, null); // 局部变量q接收数据内容。if (this.front == null) {this.front = q; // 空队插入account++;} else {this.rear.next = q; // 队列尾插入account++;}this.rear = q; // 尾指针位置更新return true; // 插入成功}@Override // 返回队头操作public Process peek() {// TODO Auto-generated method stub// 只返回队头元素,不进行任何操作,若队列为空则返回null;return this.isEmpty() ? null : this.front.data;}@Overridepublic Process poll() { // 出队操作 返回队头元素,若队列为空返回 null// TODO Auto-generated method stubif (isEmpty()) {return null;}Process x = this.front.data; // 取得队头元素this.front = this.front.next; // 删除队头元素if (this.front == null) {this.rear = null;}account--;return x;}}

Node.java 队列节点类

package 多级反馈队列算法;public class Node<T> // 链式队列节点类
{public Process data; // 数据域 存储数据元素public Node<Process> next; // 地址域,引用后继节点public Node(Process data, Node<Process> next) {super();this.data = data;this.next = next;}public Node() {super();}/** @see java.lang.Object#toString()*/@Overridepublic String toString() {// TODO Auto-generated method stubreturn this.data.toString();}}

Process.java 进程类

package 多级反馈队列算法;public class Process // 进程类
{static int amountOfProcess = 0; // 所有进程总数protected String name; // 进程名protected int arrivalTime; // 进程到达内存的时间protected int serviceTime; // 进程完成需要占用cpu的服务时间protected int excutedTime = 0; // 进程已经执行时间protected LevelQueue<Process> queue = null; // 当前进程所在队列public Process(String name, int arrivalTime, int serviceTime) {super();this.name = name;this.arrivalTime = arrivalTime;this.serviceTime = serviceTime;amountOfProcess += 1;// 每创建一个进程对象,进程总数+1}public void Finished() { // 进程结束// 执行出队操作queue.poll();System.out.println("-------------------");System.out.println("进程:" + this.name + "执行完毕,结束时位于第" + this.queue.levelOfQueue + "队列。");System.out.println(this.toString());amountOfProcess -= 1;// 每完成一个进程对象,进程总数-1}@Overridepublic String toString() {// TODO Auto-generated method stubif (queue != null) {return "进程:" + this.name + ",到达时间:" + this.arrivalTime + ",服务时间" + this.serviceTime + ",进程已经执行时间:"+ this.excutedTime + ",进程当前所在队列" + queue.levelOfQueue + "。";} else {return "进程:" + this.name + ",到达时间:" + this.arrivalTime + ",服务时间" + this.serviceTime;}}public static boolean ifAllCompleted() {if (amountOfProcess == 0) {System.out.println("当前没有进程正在运行");return true;} else {System.out.println("当前有" + amountOfProcess + "个进程等待运行。");return false;}}
}

Queue.java

package 多级反馈队列算法;public interface Queue<T>     //队列接口类
{   public abstract boolean isEmpty();public abstract boolean add(T x);//添加成功返回truepublic abstract T peek();  //返回队头元素,若为空返回nullpublic abstract T poll(); // 出队,并返回队头元素,若为空返回null
}

java模拟实现操作系统进程调度中的多级反馈队列算法相关推荐

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

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

  2. java linux 权限管理_权限管理java实现(源于Linux中的权限管理算法)

    这个帖子由来已久吧,我也是到处搜到的,然后仔细学习,果然博大精深,然后加强点弄点自己的东西 我已声明 部分转载!! 向大家介绍一种很不错,也是Linux中的权限管理算法. 定义a^b为:a的b次方 假 ...

  3. 【操作系统】轮转和多级反馈队列

    随着计算机的技术逐渐步入家用后,新的调度指标接踵而来,周转时间已经不能满足人们日常工作的需求,更多时候人们更希望计算机能有更好的交互性,使其能更快地去响应任务,由此针对优化响应时间的调度策略也遍地开花 ...

  4. FCFS、SJF、HRRN调度算法以及时间片轮转、优先级调度算法、多级反馈队列算法总结

    先来先服务(FCFS) 算法思想 主要从"公平"角度考虑 算法规则 按照作业/进程到达的先后顺序进行服务 用于作业/进程调度? 用于作业调度时,考虑哪个作业先到达后备队列: 用于进 ...

  5. java 模拟多线程并发_Java中模拟同时并发请求

    有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了. java中模拟并发请求,自然是很方便的,只要多开几个线程,发起请求就好了.但是,这种请求, ...

  6. Java核心知识点学习----多线程中的阻塞队列,ArrayBlockingQueue介绍

    1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过s ...

  7. 架构中的设计原则之单一职责原则 - 《java开发技术-在架构中体验设计模式和算法之美》...

    2019独角兽企业重金招聘Python工程师标准>>> 单一职责模式: 单一职责原则的核心思想就是:系统中的每一个对象都应该只有一个单独的职责,而所有对象所关注的就是自身职责的完成. ...

  8. 多级反馈队列调度算法(c++)

    如果对你有帮助,可以给卑微的博主留个赞.关注.收藏   (不是) (骗一下数据,说不定以后面试就过了,拜谢) 操作系统基本调度算法,多级反馈队列调度算法.在划分时间片的调度算法中,多级反馈队列算法兼顾 ...

  9. 在linux实现公平队列,多级反馈队列调度策略在Linux中的应用和实现.pdf

    多级反馈队列调度策略在Linux中的应用和实现.pdf 第30卷第20期 计算机工程 2004年10月 I/01.30^矗2口 ComputerEngineering October2004 文t标识 ...

最新文章

  1. Scala比较器:Ordered与Ordering
  2. 用linq查询html中div个数,C#使用Linq to XML进行XPath查询
  3. Angular的后院:组件依赖关系的解决
  4. 宽度自适应实现方法(转)
  5. Unity3d远程连接Hololens提示Cannot connect without a remote machine address specified
  6. solr处理oracle中CLOB、BLOB
  7. 25-70K*14薪| 梅卡曼德视觉算法、C++软件开发工程师等职位招聘
  8. 验票证明怎么打印_发票真伪查询打印系统软件
  9. 04.数据分析之pillow与matplotlib
  10. 微软苏州二期全面封顶,明年投入使用!三期开工时间已定,研发人才将达5000余人!...
  11. 计数排序CountingSort
  12. Ubuntu16.04安装MySQL笔记
  13. 某些Win10无法进入安全模式的修复
  14. 传智播客传智汇与华为联合举办主题沙龙,解读网络安全解决方案
  15. LabVIEW编程LabVIEW开发控制PACE1000精密压力测试仪例程与相关资料
  16. 读电子书微习惯的养成
  17. perl中grep用法总结 z
  18. JAVA毕设项目社区生鲜电商平台(java+VUE+Mybatis+Maven+Mysql)
  19. 深入理解Flutter的图形图像绘制原理——图形库skia剖析
  20. 视网膜数据集(3)STARE

热门文章

  1. 洛谷P1010 [NOIP1998 普及组] 幂次方 C语言/C++
  2. 【笔记】播放器 - mpv - 使用、配置
  3. SetWinEventHook 事件钩子
  4. 中国移动首次明确的LTE终端频率要求
  5. 3D模型汇总----骨骼模型
  6. Maven打包常见问题
  7. FCCSP/CSP/WLCSP
  8. 模型学习01——评价类模型(3)
  9. P8318 『JROI-4』淘气的猴子(【LGR-108】洛谷 5 月月赛 I JROI R4 Div.2)
  10. JQuery选择器语法