CPU进程调度简单模拟(PriorityFirst)--Java
来源:互联网 发布:mac win7激活工具 编辑:程序博客网 时间:2024/06/05 06:13
这是我的作业,要求的输出结果是:各进程的等待时间、周转时间及平均等待、周转时间
进程的基本信息我直接写在了程序里(懒得运行时一一输入)。写了两个Class,一个储存进程的基本信息(Work),一个模拟进程(Test)
Work Class:
/* * Student name: Xin * Program name: Work * Program purpose: Test the scheduling algorithm sumulation (PriorityFirst) */import java.util.*;public class Work implements Comparable {// 用 ComparaTo 在 jobQueue中对进程第一次排序@Overridepublic int compareTo(Object o){ //如果进程的到达时间相同,则以优先级排序。否则按到达时间排序 Work p = (Work)o; if(this.arrivalTime == p.arrivalTime) return this.priority < p.priority ? -1:1; else return this.arrivalTime < p.arrivalTime ? -1:1;}// 变量:到达时间,运行时间,优先级,进程名private int arrivalTime;private int burstTime;private int priority;private String name;// 变量:平均等待时间,平均周转时间private int turnAroundTime;private int waitingTime;// 获取变量值public int getArrivalTime() {return arrivalTime;}public int getPriority() {return priority;}public int getBurstTime() {return burstTime;}public String getName() {return name;}public int getWaitingTime() {return waitingTime;}public int getTurnAroundTime() {return turnAroundTime;}// 设置变量值public void setArrivalTime(int arrivalTime) {this.arrivalTime = arrivalTime;}public void setBurstTime(int burstTime) {this.burstTime = burstTime;}public void setPriority(int priority) {this.priority = priority;}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 static PriorityQueue<Work> generateProcess1(){String[] name1 = {"A","B","C","D","E"};int[] at1 = {0,0,0,0,0};int[] bt1 = {7,3,9,5,1};int[] pri1 = {3,5,2,1,4};PriorityQueue<Work> runQueue1= new PriorityQueue<>();for(int i = 0; i<5;i++){ Work process = new Work(); process.setName(name1[i]); process.setArrivalTime(at1[i]); process.setBurstTime(bt1[i]); process.setPriority(pri1[i]); runQueue1.add(process);}return runQueue1;}// 第二组数据(到达时间不同)public static PriorityQueue<Work> generateProcess2(){String[] name2 = {"A","B","C","D","E"};int[] at2 = {0,2,4,6,8};int[] bt2 = {7,3,9,5,1};int[] pri2 = {3,5,2,1,4};PriorityQueue<Work> runQueue2= new PriorityQueue<>();for(int i = 0; i<5;i++){ Work process = new Work(); process.setName(name2[i]); process.setArrivalTime(at2[i]); process.setBurstTime(bt2[i]); process.setPriority(pri2[i]); runQueue2.add(process);}return runQueue2;}}
Test Class:
/* * Student name: Xin * Program name: Test (Program 3) * Program purpose: Test the scheduling algorithm sumulation (PriorityFirst) */import java.util.*;/* * 思路:要实现优先级算法模拟,考虑优先级外也要考虑进程的到达时间(如果进程先到达,即使它的优先级低,也要先运行)。因此我在原始的JobQUEUE和后来的readyQUEUE分别对进程进行排序。在jobQUEUE里,如果进程的到达时间不同,则按到达时间先后排序;在readyQUEUE里,则按优先级排序。这样可以确保每一个进程进入readyQUEUE时,都是先到达的进程 */public class Test {public static int numberOfProcess;// 用 Comparator 对readyQueue里的进程进行排序,根据优先级public static Comparator<Work> theComparator = new Comparator<Work>(){ public int compare(Work work1, Work work2){ return work1.getPriority() < work2.getPriority()? -1:1;}}; // Main methodpublic static void main(String[] args) { Scanner userInput = new Scanner(System.in); // 用户输入进程数 System.out.println("Enter the # of processes."); numberOfProcess = userInput.nextInt(); // 创建两个 PriorityQueue q1,q2 PriorityQueue<Work> q1 = new PriorityQueue<>(); PriorityQueue<Work> q2 = new PriorityQueue<>(); // generateProcess method 对进程进行排序 q1 = Work.generateProcess1(); q2 = Work.generateProcess2(); System.out.println("\nThe running order and details of data set 1: "); priorityFirst(q1); System.out.println("\nThe running order and details of data set 2: "); priorityFirst(q2);}// The priorityFirst method public static Queue<Work> priorityFirst(PriorityQueue<Work> queue) { // 设置变量 double averageWaitTime = 0.00; double averageTurnAroundTime = 0.00; int startTime = 0; int finishTime = 0; int queueSize = queue.size(); Work process; // 创建readyQueue(大小为进程的数量,用Comparetor排序进程) PriorityQueue<Work> readyQueue = new PriorityQueue<Work>(numberOfProcess, theComparator); // (这个数字是我随便设的-。- 我也不太确定要loop多少次) for (int i = 0; i<10;i++){ // 当queue和readyQueue其中有不为空时(即还有进程没有运行) while(!queue.isEmpty() || !readyQueue.isEmpty()){ // 看readyQueue是否为空,若为空,则意味着所有READY state 的进程都完成运行了。此时从queue中取下一个进程 process=readyQueue.isEmpty()? queue.poll():readyQueue.poll(); // 计算开始时间,结束时间 startTime = finishTime; finishTime = startTime + process.getBurstTime(); // 如果queue里第一个进程的到达时间小于刚刚进入readyQueue的进程的结束时间(即意味着当刚刚进入的那个进程,完成运行,下一个进程已会到达),则queue里的进程可以继续被加入到readyQueue while(queue.peek()!=null && queue.peek().getArrivalTime()<=finishTime) readyQueue.add(queue.poll()); // 计算等待时间(开始时间-到达时间) process.setWaitingTime(startTime-process.getArrivalTime()); // 输入等待时间 System.out.println(process.getName()+" Process's waiting time:"+process.getWaitingTime()); // 计算周转时间(结束时间-到达时间) process.setTurnAroundTime(finishTime-process.getArrivalTime()); // 输出到达时间 System.out.println(process.getName()+" Process's turn around time:"+process.getTurnAroundTime()); // 计算平均值 averageWaitTime = averageWaitTime + process.getWaitingTime(); averageTurnAroundTime = averageTurnAroundTime + process.getTurnAroundTime(); }}// 计算平均值averageTurnAroundTime /= queueSize;averageWaitTime /= queueSize;// 输出平均值System.out.println("\nAverage Wait time: "+ averageWaitTime);System.out.println("Average Turn Around time: "+ averageTurnAroundTime);return readyQueue; }}
最终输出结果:
阅读全文
0 0
- CPU进程调度简单模拟(PriorityFirst)--Java
- CPU进程调度简单模拟(Round Robin)--Java
- 操作系统进程调度简单模拟
- 模拟简单进程调度实验
- [模拟] 简单的进程调度模拟
- 模拟进程调度(简单实现)
- 模拟在单处理器多进程操作系统的CPU调度
- CPU调度(进程调度)策略
- 进程调度和内存分配模拟(java)
- 使用java实现模拟进程调度
- CPU进程调度
- 进程调度模拟程序
- 进程调度模拟
- 模拟进程调度
- 进程调度模拟
- 进程调度模拟算法
- 模拟设计进程调度
- 进程调度模拟
- 2.9 Object类,包相关
- leetcode Third Maximum Number 第三大的数
- leetcode Guess Number Higher or Lower 猜大小
- go包管理工具-glide使用方法及踩坑记录
- 10.1 国庆 考试
- CPU进程调度简单模拟(PriorityFirst)--Java
- Windows下Redis配置
- mongodb(二):索引基础知识
- nginx处理post请求(http响应包体收发之上游网速优先策略)
- A. Fair Game
- ERROR: invalid byte sequence for encoding "UTF8": 0xd5 0xc5
- 【转】J.U.C之阻塞队列:LinkedTransferQueue
- 使用NodeJS、GruntCLI遇到的问题
- 无法打开模块文件“C:\Users\wangmei-pc\AppData\Local\Temp\.NETFramework,Version=v4.5.AssemblyAttributes.v