进程调度(一)——FIFO算法

    xiaoxiao2021-03-25  101

    一 定义

    这是最早出现的置换算法。该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。但该算法与进程实际运行的规律不相适应,因为在进程中,有些页面经常被访问,比如,含有全局变量、常用函数、例程等的页面,FIFO 算法并不能保证这些页面不被淘汰。这里,我们只需要设置一个先进先出队列就可以。最先进入内存的页面最早被转换出去。


    二 代码


    进程类如下:

    import java.util.Iterator; import java.util.Scanner; import java.util.TreeSet; public class Process implements Comparable<Process>{ private String ProcessName; //进程名 private int ReachTime; //到达时间 private int ProcessTime; //处理时间 private int FinishTime; //完成时间 private int PeriodTime; //周转时间 private int StartTime; //开始时间 private double WeightedPeriodTime; //带权周转时间 private int Priority; //优先级 public Process(String processname,int reachTime, int processTime) { super(); ProcessName = processname; ReachTime = reachTime; ProcessTime = processTime; } public Process(String processName, int reachTime, int processTime, int priority) { super(); ProcessName = processName; ReachTime = reachTime; ProcessTime = processTime; Priority = priority; } public int getPriority() { return Priority; } public String getProcessName() { return ProcessName; } public int getReachTime() { return ReachTime; } public int getProcessTime() { return ProcessTime; } public int getFinishTime() { return FinishTime; } public int getPeriodTime() { return PeriodTime; } public void setProcessTime(int processTime) { ProcessTime = processTime; } public void setFinishTime(int finishTime) { FinishTime = finishTime; } public void setPeriodTime(int periodTime) { PeriodTime = periodTime; } public int getStartTime() { return StartTime; } public void setStartTime(int startTime) { StartTime = startTime; } public double getWeightedPeriodTime() { return WeightedPeriodTime; } public void setWeightedPeriodTime(double weightedPeriodTime) { WeightedPeriodTime = weightedPeriodTime; } @Override public int compareTo(Process o) { // TODO Auto-generated method stub if ( this.ReachTime > o.ReachTime) return 1; else if ( this.ReachTime < o.ReachTime) return -1; return 0; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ReachTime; return result; } public void Print(){ System.out.print(this.ProcessName+" "+this.ReachTime+" "+this.ProcessTime+" "+" "+this.StartTime+" "+this.FinishTime+" "+this.PeriodTime+" "); System.out.printf("%.4f",this.WeightedPeriodTime); System.out.println(); } }

    FIFO算法代码如下:

    import java.util.Iterator; import java.util.Scanner; import java.util.TreeSet; public class FIFO{ private TreeSet<Process> process = new TreeSet<Process>() ; public FIFO() { //添加进程 Scanner in = new Scanner(System.in); System.out.println("请输入要添加的进程数:"); int Num = in.nextInt(); System.out.println("开始初始化进程信息(进程名 到达时间 耗时):"); for ( int i = 0 ; i < Num ; i++){ String processname = in.next(); int reachtime = in.nextInt(); int processtime = in.nextInt(); Process p = new Process(processname,reachtime, processtime); process.add(p); } in.close(); } void CarryOut_FIFO(){ //执行先来先服务调度算法 Iterator<Process> it = this.process.iterator(); Process p0 = it.next(); p0.setStartTime(p0.getReachTime()); p0.setFinishTime(p0.getProcessTime()+p0.getStartTime()); p0.setPeriodTime(p0.getFinishTime()-p0.getReachTime()); p0.setWeightedPeriodTime(p0.getPeriodTime() *1.0 /p0.getProcessTime()); int starttime = this.process.first().getFinishTime(); while ( it.hasNext()){ Process p = it.next(); p.setStartTime(starttime); p.setFinishTime(p.getProcessTime()+p.getStartTime()); p.setPeriodTime(p.getFinishTime()-p.getReachTime()); p.setWeightedPeriodTime(p.getPeriodTime() * 1.0 / p.getProcessTime()); starttime = p.getFinishTime(); } } public double Avg_ProcessTime(){ //平均周转时间 double avg = 0; Iterator<Process> it = this.process.iterator(); while( it.hasNext()){ Process p = it.next(); avg += p.getPeriodTime(); } avg /= this.process.size(); return avg; } public double Avg_WeightedProcessTime(){ //平均带权周转时间 double avg = 0; Iterator<Process> it = this.process.iterator(); while( it.hasNext()){ Process p = it.next(); avg += p.getWeightedPeriodTime(); } avg /= this.process.size(); return avg; } public void Print(){ //打印 System.out.println(" 调度示意图"); System.out.println("进程 到达时间 耗时 开始时间 完成时间 周转时间 带权周转时间"); Iterator<Process> it = process.iterator(); while( it.hasNext()){ Process p = it.next(); p.Print(); } System.out.printf("平均周转时间:%.4f",this.Avg_ProcessTime()); System.out.println(); System.out.printf("平均带权周转时间:%.4f",this.Avg_WeightedProcessTime()); } public static void main(String[] args) { // TODO Auto-generated method stub FIFO fifo = new FIFO(); fifo.CarryOut_FIFO(); fifo.Print(); } }
    转载请注明原文地址: https://ju.6miu.com/read-34114.html

    最新回复(0)