进程调度

来源:互联网 发布:烂番茄新鲜度100 知乎 编辑:程序博客网 时间:2024/05/08 14:55
 
package com.pcb.dao;import java.util.Collections;import java.util.LinkedList;import java.util.List;import java.util.Scanner;import com.pcb.dao.SortByPriNumber;import com.pcb.entity.PCB;/******************************************************************************* *  * @author Administrator * @description 进程调度 */public class ProcessScheduling {private static List<PCB> pcbList = new LinkedList<PCB>();// 创建进程列表// private static List<PCB> pcbQueue=new ArrayList<PCB>();//定义进程队列public static void main(String[] args) {initPCB();// 初始化进程控制块doWithPCB();// 进程处理}/** * 进程初始化:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等 */@SuppressWarnings("unchecked")public static void initPCB() {Scanner io = new Scanner(System.in);System.out.println("请输入进程的相关信息:");System.out.println("进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态");String oper = "n";// 是否继续输入进程do {PCB pcb = new PCB();// 创建进程实例System.out.print("进程名:");pcb.setPcbName(io.next());System.out.print("优先数:");pcb.setPriNumber(io.nextInt());// System.out.println("到达时间");pcb.setArrivalTime(pcbList.size() + 1);System.out.println("需要时间:");pcb.setNeedTime(io.nextInt());pcb.setUsedTime(0);// pcb.setPcbState(1);pcb.setPcbState("Wait");pcbList.add(pcb);// 把进程实例添加到进程列表中System.out.print("是否继续输入进程(y|n)");oper = io.next();} while (oper.equals("y"));System.out.println("进程数:" + pcbList.size() + "个");Collections.sort(pcbList, new SortByPriNumber());// 根据优先数排列// showPCBList(pcbList);// 显示进程列表信息}@SuppressWarnings("unchecked")public static void doWithPCB() {/* * int count = 0;// 就绪状态的进程个数; for (int i = 0; i < pcbList.size(); i++) * { if (pcbList.get(i).getPcbState().equals("Wait")) { count++; } } *  * // 如果就绪队列为空结束进程 if (count == 0) { return; } */while (pcbList.size() > 0) {Collections.sort(pcbList, new SortByPriNumber());// 根据优先数排序List<PCB> priNumPcbs = new LinkedList<PCB>();// 优先数相同的进程列表showPCBList(pcbList);PCB pcb = new PCB();// 创建进程实例pcb = pcbList.get(pcbList.size() - 1);// 取出优先数最高的进程int priorityNum=pcb.getUsedTime();//优先数            int arrivalTime=pcb.getArrivalTime();//到达时间for (int i = 0; i < pcbList.size() - 1; i++) {PCB commonPriPcb = new PCB();// 相同优先数的进程commonPriPcb = pcbList.get(i);if (priorityNum==commonPriPcb.getPriNumber()) {priNumPcbs.add(commonPriPcb);Collections.sort(priNumPcbs, new SortByArrivalTime());// 根据到达时间排序(先来先服务)}}if (priNumPcbs.size() != 0) {pcb = priNumPcbs.get(0);// 获得优先数相同的到达时间最早的进程System.out.println("最早到达的" + pcb.getArrivalTime());}System.out.println("就绪队列" + pcb.getPcbName() + "进程投入运行");pcbList.remove(pcb);// 把进程就绪队列中调入运行pcb.setPcbState("Run");// 状态为运行状态pcb.setPriNumber(pcb.getPriNumber() - 1);// 优先级减一pcb.setUsedTime(pcb.getUsedTime() + 1);// 已用时间增加一个时间片刻System.out.println("进程名:" + pcb.getPcbName() + "\t优先数:"+ pcb.getPriNumber() + "\t到达时间:" + pcb.getArrivalTime()+ "\t需要时间" + pcb.getNeedTime() + "\t状态:"+ pcb.getPcbState());if (pcb.getUsedTime() != pcb.getNeedTime()) {// 如果运行进程已占用时间达到需要时间,不撤销该进程pcb.setPcbState("Wait");pcb.setArrivalTime(pcbList.size() + 1);// 到达时间pcbList.add(pcb);// 把该进程重新调入就绪队列}}}/** * 显示进程列表信息 *  * @param pcbList */public static void showPCBList(List<PCB> pcbList) {System.out.println("--------------------------------------------------------------------------------");System.out.println("进程名\t\t优先数\t\t到达时间\t\t需要时间\t\t状态");/* * 循环访问进程列表 */for (PCB p : pcbList) {System.out.println(p.getPcbName() + "\t\t" + p.getPriNumber()+ "\t\t" + p.getArrivalTime() + "\t\t" + p.getNeedTime()+ "\t\t" + p.getPcbState());}System.out.println();}}

package com.pcb.dao;import java.util.Comparator;import com.pcb.entity.PCB;public class Sort implements Comparator<Object> {public int compare(Object ob1, Object ob2) {PCB pcb1 = (PCB) ob1;PCB pcb2 = (PCB) ob2;if (pcb1.getPriNumber() > pcb2.getPriNumber()) {return 1;} else if (pcb1.getPriNumber() == pcb2.getPriNumber()) {if (pcb1.getArrivalTime() > pcb2.getArrivalTime()) {return 1;} else {return 0;}} else {return 0;}}}

 

package com.pcb.entity;import java.io.Serializable;/*** *  * @version 1.0 * @author YYH * @description 进程控制块类    Process scheduling * 进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。 */public class PCB implements Serializable {private static final long serialVersionUID = -4551627274875247089L;/** * 进程名 */private String pcbName;public String getPcbName() {return pcbName;}public void setPcbName(String pcbName) {this.pcbName = pcbName;}/*** * priorityNumber优先数 */private int priNumber;public int getPriNumber() {return priNumber;}public void setPriNumber(int priNumber) {this.priNumber = priNumber;}/** * 到达时间 */private int arrivalTime;public int getArrivalTime() {return arrivalTime;}public void setArrivalTime(int arrivalTime) {this.arrivalTime = arrivalTime;}/** * 需要运行时间 */private int needTime;public int getNeedTime() {return needTime;}public void setNeedTime(int needTime) {this.needTime = needTime;}/** * 已用时间 */private int usedTime;public int getUsedTime() {return usedTime;}public void setUsedTime(int usedTime) {this.usedTime = usedTime;}/** * 进程状态 1:表示就绪状态  2:表示运行状态    3:表示完成状态 private int pcbState;public int getPcbState() {return pcbState;}public void setPcbState(int pcbState) {this.pcbState = pcbState;}*//* * 每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。 */private String pcbState;public String getPcbState() {return pcbState;}public void setPcbState(String pcbState) {this.pcbState = pcbState;}}


 

原创粉丝点击