CPU进程调度简单模拟(Round Robin)--Java
来源:互联网 发布:股票模型软件 编辑:程序博客网 时间:2024/06/05 14:27
这是我的作业,要求的输出结果是:各进程的等待时间、周转时间及平均等待、周转时间
个人觉得比较复杂的地方是要考虑进程完成运行时的不同情况:用了多少次时间片、完成运行时时间片有无剩余等,这些都对计算有影响。我用的是分情况考虑来计算的方法,虽然最终能得出结果,但感觉有点繁琐。希望各位大神如果有更简洁的方法,可以指导一下~~~
Work Class:
/* * Student name: Xin * Program name: Work * Program purpose: Test the scheduling algorithm simulation (Round Robin) */import java.util.*;public class Work {// 变量private int arrivalTime;private int burstTime;private String name;// 平均等待、周转时间private int turnAroundTime;private int waitingTime;// 进程还需要时间(运行时间-已使用时间)private int restRequireTime;// 进程已使用时间private int usedTime;// 获取变量值public int getArrivalTime() {return arrivalTime;}public int getBurstTime() {return burstTime;}public String getName() {return name;}public int getWaitingTime() {return waitingTime;}public int getTurnAroundTime() {return turnAroundTime;}public int getRestRequireTime() {return restRequireTime;}public int getUsedTime() {return usedTime;}// 设置变量值public void setArrivalTime(int arrivalTime) {this.arrivalTime = arrivalTime;}public void setBurstTime(int burstTime) {this.burstTime = burstTime;}public void setName(String name) {this.name = name;}public void setWaitingTime(int waitingTime) {this.waitingTime = waitingTime;}public void setTurnAroundTime(int turnAroundTime) {this.turnAroundTime = turnAroundTime;}public void setRestRequireTime(int restRequireTime) {this.restRequireTime = restRequireTime;}public void setUsedTime(int usedTime) {this.usedTime = usedTime;}// 第一组数据(进程同时到达)public static Queue<Work> generateProcess1(){String[] name1 = {"A","B","C","D","E"};int[] at1 = {0,0,0,0,0};int[] bt1 = {7,3,9,5,1};Queue<Work> runQueue1= new LinkedList<>();for(int i = 0; i<5;i++){ Work process = new Work(); process.setName(name1[i]); process.setArrivalTime(at1[i]); process.setBurstTime(bt1[i]); runQueue1.add(process);}return runQueue1;}// 第二组数据(到达时间不同)public static Queue<Work> generateProcess2(){String[] name2 = {"A","B","C","D","E"};int[] at2 = {0,2,4,6,8};int[] bt2 = {7,3,9,5,1};Queue<Work> runQueue2= new LinkedList<>();for(int i = 0; i<5;i++){ Work process = new Work(); process.setName(name2[i]); process.setArrivalTime(at2[i]); process.setBurstTime(bt2[i]); runQueue2.add(process);}return runQueue2;}}
Test Class:
/* * Student name: Xin * Program name: Test * Program purpose: Test the scheduling algorithm sumulation (Round Robin) */import java.util.*;/* * 思路:因为每个进程轮流运行,所以不需事先对进程进行排序(不像SJF和PriorityFirst)。因为有不同的队列,当要选择下一个运行的程序,需要考虑一下情况:(1)准备队列为空;(2)等待队列为空,但原始队列不为空(即有程序很晚才到,别的程序都运行完了它才到达);(3)等待队列不为空*/public class Test {public static int numberOfProcess;public static int timeQuantum;// Main methodpublic static void main(String[] args) { // 创建Queue Queue<Work> q1 = new LinkedList<>(); Queue<Work> q2 = new LinkedList<>(); // Call the generateProcess method q1 = Work.generateProcess1(); q2 = Work.generateProcess2();System.out.println("--------------------------------------------------"); System.out.println("The running order and details of data set 1: "); System.out.println("--------------------------------------------------"); roundRobin(q1);System.out.println("--------------------------------------------------"); System.out.println("The running order and details of data set 2: ");System.out.println("--------------------------------------------------"); roundRobin(q2);}public static Queue<Work> roundRobin(Queue<Work> queue) { // 设置变量 double averageWaitTime = 0.00; double averageTurnAroundTime = 0.00; int startTime = 0; int finishTime = 0; int queueSize = queue.size(); Work process; // 用户输入时间片大小 Scanner userInputTime = new Scanner(System.in); System.out.println("Enter the time Quantum"); timeQuantum = userInputTime.nextInt(); // 创建准备队列,等待队列 Queue<Work> waitQueue = new LinkedList<>(); Queue<Work> readyQueue = new LinkedList<>(); // 当所有队列都不为空 while(!queue.isEmpty() || !readyQueue.isEmpty() || !waitQueue.isEmpty()){ // 如果原始队列不为空,且第一个进程的到达时间小于准备队列里的进程的结束时间(即意味着当准备队列里的进程完成运行,下一个进程已经到达),则可以将队列里的进程加入到准备队列里 while(queue.peek()!=null && queue.peek().getArrivalTime()<=finishTime) readyQueue.add(queue.poll()); // 如果准备队列不为空,则运行准备队列里的进程 if (!readyQueue.isEmpty()) process = readyQueue.poll(); // 如果等待队列为空,而原始队列不为空,则运行原始队列中的进程 else if( !queue.isEmpty() && waitQueue.isEmpty()) process = queue.poll(); else // If the waitQueue is not empty, run the process in waitQueue process = waitQueue.poll(); // 计算开始时间和结束时间 startTime = Math.max(process.getArrivalTime(),finishTime); finishTime = startTime + timeQuantum; // 计算进程已使用时间和剩余需要时间 process.setUsedTime(process.getUsedTime()+timeQuantum); process.setRestRequireTime(process.getBurstTime()-process.getUsedTime()); // 如果进程用完时间片仍未完成运行,则返回等待队列 if(process.getRestRequireTime()>0) { waitQueue.add(process);} // If the process finished processing else { // 计算等待时间和总等待时间 // Consider two situations: (1)the process has remain time when it finished; (2)No remain time if(process.getRestRequireTime()>0) { process.setTurnAroundTime(finishTime-process.getArrivalTime());} else { // 如果进程没有用完时间片,则重新计算结束时间 process.setTurnAroundTime(finishTime-process.getArrivalTime()+process.getRestRequireTime()); finishTime = finishTime+process.getRestRequireTime();} averageTurnAroundTime += process.getTurnAroundTime(); // 计算等待时间,周转时间 // 有两种情况: // (1)进程只用了一时间片 // (2)进程用了不止一个时间片 if(process.getUsedTime()>timeQuantum) { process.setWaitingTime(startTime-process.getUsedTime()+timeQuantum - process.getArrivalTime());} else { process.setWaitingTime(startTime-process.getArrivalTime());} averageWaitTime += process.getWaitingTime(); // 输出计算结果 System.out.println("\n"+process.getName()+" process finishes processing now. Details are shown: "); System.out.println("Total waiting time: "+ process.getWaitingTime()); System.out.println("Total turn around time: "+process.getTurnAroundTime());}}// 计算平均值averageTurnAroundTime /= queueSize;averageWaitTime /= queueSize;// Print out the avgsSystem.out.println("\nAverage Wait time: "+ averageWaitTime);System.out.println("Average Turn Around time: "+ averageTurnAroundTime);return readyQueue; }}
运行结果:
阅读全文
0 0
- CPU进程调度简单模拟(Round Robin)--Java
- CPU进程调度简单模拟(PriorityFirst)--Java
- 用C语言实现对N个进程的简单时间片轮转法Round Robin的调度模拟
- Round Robin 轮叫调度
- 操作系统进程调度简单模拟
- 模拟简单进程调度实验
- [模拟] 简单的进程调度模拟
- 轮叫调度(Round-Robin Scheduling
- 轮询调度算法(Round-Robin Scheduling)
- 轮询调度算法(Round-Robin Scheduling)
- 轮询调度算法(Round-Robin Scheduling)
- 轮询调度算法(Round-Robin Scheduling)
- 轮询调度算法(Round-Robin Scheduling)
- RR调度(Round-robin scheduling)简介
- 轮询调度算法(Round-Robin Scheduling)
- 轮询调度算法(Round-Robin Scheduling)
- Round-robin 轮询调度详解
- 模拟进程调度(简单实现)
- 神经网络训练细节(一)
- Linux 安装
- Solr搜索引擎(6)搜索结果高亮
- Error Downloading Packages: yum更新出现错误
- 回溯法求迷宫
- CPU进程调度简单模拟(Round Robin)--Java
- 红黑树原理
- 关于TCP_CORK的一个细节
- 动态内存分配----输入n个数据到一个数组
- c++的multimap(set)和unordered_map(set)
- ZYNQ使用AXI VDMA搭建图像通路
- 猿人生
- SpringMVC @ResponseBody注解 json转换 返回406
- Mybatis中的${}和#{}的区别