优先级调度算法"/>
进程调度:时间片轮转+抢占+动态优先级调度算法
时间片轮转:每个进程至多持续运行一定时间。
抢占:进程进入就绪队列,进行优先级比较,优先级大的可抢占正在运行的进程。
动态优先级:进程进入就绪队列一定时间未获取cpu,则提升优先级。
进程类
package process;/*** 进程类*/
public class Process implements Comparable<Process>{// 进程标识管理器private static int processIdManage = 1;// 进程大小private int size;// 进程控制块private Pcb pcb;// 进程优先级更新时间条件private long priorityUpdateCondition;public Process(int size){this.size = size;this.pcb = new Pcb();}public int getSize() {return size;}public long getPriorityUpdateCondition() {return priorityUpdateCondition;}public void setPriorityUpdateCondition(long priorityUpdateCondition) {this.priorityUpdateCondition = priorityUpdateCondition;}@Overridepublic int compareTo(Process o) {// 通过优先级实现进程比较return -(this.getPcb().getPriority() - o.getPcb().getPriority());}/*** 进程控制块类*/public static class Pcb{// 进程标识private int id;// 进程状态private String status;// 进程优先级private int priority;// 进程运行至结束需要的时间private long needRunTime;// 进程等待时间private long waitRunTotalTime;public Pcb(){this.id = processIdManage++;this.status = "创建";this.priority = 0;this.needRunTime = 0;this.waitRunTotalTime = 0;}public int getId(){return id;}public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}public int getPriority() {return priority;}public long getNeedRunTime() {return needRunTime;}public void setNeedRunTime(long needRunTime) {this.needRunTime = needRunTime;}public void setPriority(int priority){this.priority = priority;}public long getWaitRunTotalTime() {return waitRunTotalTime;}public void setWaitRunTotalTime(long waitRunTotalTime) {this.waitRunTotalTime = waitRunTotalTime;}}public Pcb getPcb() {return pcb;}}
调度类
package process;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/*** 进程调度类*/
public class ProcessDispatch {// 就绪队列private final static List<Process> PROCESS_QUEUE = new ArrayList<Process>();// 优先级更新条件:50秒不被调度则更新private static long condition = 50;/*** 添加进程进入就绪队列,更改进程状态为:就绪* @param process 进程* @return boolean 添加成功返回true,否则false*/public synchronized static boolean add(Process process){if(process == null)return false;process.getPcb().setStatus("就绪");PROCESS_QUEUE.add(process);showStatus(process);// 更新队列顺序Collections.sort(PROCESS_QUEUE);return true;}/*** 抢占cpu,更改进程状态为:运行* @return Process 抢占的进程*/private synchronized static Process removeTop(){if(PROCESS_QUEUE.isEmpty()){return null;}Process process = PROCESS_QUEUE.remove(0);process.getPcb().setStatus("运行");process.setPriorityUpdateCondition(0);showStatus(process);return process;}/*** 显示进程状态* @param process 进程*/private synchronized static void showStatus(Process process){if(process == null)return;Process.Pcb pcb = process.getPcb();System.out.printf("进程Id:%5d 进程优先级:%5d 进程状态:%6s 剩余需运行时间:%5d 等待时间:%5d\n",pcb.getId(),pcb.getPriority(),pcb.getStatus(),pcb.getNeedRunTime(),pcb.getWaitRunTotalTime());}/*** 获得就绪队列第一个进程* @return Process 进程*/private synchronized static Process getTop(){if(PROCESS_QUEUE.isEmpty()){return null;}return PROCESS_QUEUE.get(0);}/*** 更新进程等待时间,并判断是否更新优先级*/private synchronized static void addWaitTimeAndUpdatePriority(){boolean isUpdate = false;for(Process p:PROCESS_QUEUE){// 更新进程优先级更新时间条件p.setPriorityUpdateCondition(p.getPriorityUpdateCondition()+1);Process.Pcb pcb = p.getPcb();// 更新总的等待时间pcb.setWaitRunTotalTime(pcb.getWaitRunTotalTime()+1);// 增加进程优先级if(p.getPriorityUpdateCondition() == condition){isUpdate = true;pcb.setPriority(pcb.getPriority()+1);}}// 优先级更新,进行重新排序队列if(isUpdate)Collections.sort(PROCESS_QUEUE);}/*** 时间片管理类*/protected static class TimeSliceManage implements Runnable{// 时间片大小为5private static long size = 5-1;// 开始时间private static long start;// 当前时间private static long stop;// cpu进程private static Process cpuProcess;public void setSize(long size){TimeSliceManage.size = size;}@Overridepublic void run(){start = stop = 0;while(true){stop++;// 如果没有进程运行if(cpuProcess == null){start = stop = 0;cpuProcess = removeTop();continue;}long intervalSize = stop - start;Process.Pcb pcb = cpuProcess.getPcb();// 时间片用完if(intervalSize == size){// 进程未运行结束if(pcb.getNeedRunTime() > 1){// 更新运行时间pcb.setNeedRunTime(pcb.getNeedRunTime()-1);showStatus(cpuProcess);// 更换时间片,将cpu进程添加到就绪队列add(cpuProcess);// 就绪进程抢占cpucpuProcess = removeTop();// 进程运行结束}else{pcb.setStatus("结束");pcb.setNeedRunTime(0);showStatus(cpuProcess);// 更换时间片cpuProcess = removeTop();}start = stop = 0;// 时间片未用完}else{// 进程未运行结束if(pcb.getNeedRunTime() > 1){// 更新运行时间pcb.setNeedRunTime(pcb.getNeedRunTime()-1);showStatus(cpuProcess);// 就绪队列最高优先级进程 可抢占 当前cpu进程Process topProcess = getTop();if(topProcess != null && topProcess.getPcb().getPriority() > pcb.getPriority()){// 更换时间片,将cpu进程添加到就绪队列add(cpuProcess);// 就绪进程抢占cpucpuProcess = removeTop();start = stop = 0;}// 进程运行结束}else{pcb.setStatus("结束");pcb.setNeedRunTime(0);showStatus(cpuProcess);// 更换时间片cpuProcess = removeTop();start = stop = 0;}}// 就绪队列所有进程等待时间+1addWaitTimeAndUpdatePriority();}}}// 时间片线程对象private static Thread thread = new Thread(new TimeSliceManage());// 启动时间片public static void startTimeSlice(){thread.start();}// 停止时间片public static void stopTimeSlice(){thread.hashCode();}
}
Test类
package process;public class Test {public static void main(String[] args) {ProcessDispatch.startTimeSlice();Process p1 = new Process(2000);p1.getPcb().setNeedRunTime(20);Process p2 = new Process(150);p2.getPcb().setNeedRunTime(10);p2.getPcb().setPriority(1);Process p3 = new Process(300);p3.getPcb().setNeedRunTime(30);p3.getPcb().setPriority(1);Process p4 = new Process(1000);p4.getPcb().setNeedRunTime(20);p4.getPcb().setPriority(1);ProcessDispatch.add(p1);ProcessDispatch.add(p2);ProcessDispatch.add(p3);ProcessDispatch.add(p4);while (true);}
}
结果演示
更多推荐
进程调度:时间片轮转+抢占+动态优先级调度算法
发布评论