当前位置 博文首页 > 无限迭代中......:软件测试——进程调度(短作业优先调度算法+先

    无限迭代中......:软件测试——进程调度(短作业优先调度算法+先

    作者:[db:作者] 时间:2021-07-19 16:23

    源代码

    被测代码

    Schedule

    package net.mooctest;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Schedule {
    
    	public List<Double> FCFS(List<Work> works) {
    		double avgCircleTime = 0;
    		double avgCircleTimeWP = 0;
    		List<Double> lst = new ArrayList<Double>();
    		for (int i = 0; i < works.size(); i++) {
    			// works.get(i).getArrivalTime();
    			// works.get(i).getServiceTime();
    			if (i != 0) {
    				works.get(i).setBeginTime(works.get(i - 1).getEndTime());
    			} else {
    				works.get(i).setBeginTime(works.get(i).getArrivalTime());
    			}
    			works.get(i)
    					.setEndTime(
    							works.get(i).getBeginTime()
    									+ works.get(i).getServiceTime());
    			avgCircleTime += works.get(i).getCircleTime();
    			avgCircleTimeWP += works.get(i).getCircleWPTime();
    		}
    		avgCircleTime /= works.size();
    		avgCircleTimeWP /= works.size();
    		lst.add(avgCircleTime);
    		lst.add(avgCircleTimeWP);
    		return lst;
    	}
    
    	/**
    	 * 改后的短作业优先调度算法
    	 * 
    	 * @param works
    	 * @return
    	 */
    	public List<Double> SJF(List<Work> works) {
    		List<Double> lst = new ArrayList<Double>();
    		double avgCircleTime = 0;
    		double avgCircleTimeWP = 0;
    		List<Work> ins = new ArrayList<Work>();
    		int i = 0;
    		int counter = 0; // 已完成作业的计数器
    		// 判断是否已经把所有的作业都处理完毕
    		while (counter < works.size()) {
    			// 找到所有未执行,且到达时间小于i的作业
    			for (int j = 0; j < works.size(); j++) {
    				if (works.get(j).isIn())
    					continue;
    				if (works.get(j).getArrivalTime() <= i) {
    					ins.add(works.get(j));
    				}
    			}
    			if (ins.isEmpty()) {
    				i++;
    			} else {
    				ins = sortByServiceTime(ins);
    				// 将当前已到达的作业中,服务时间最短的作业加入到CPU执行
    				Work now = ins.get(0);
    				now.setBeginTime(i);
    				now.setEndTime(now.getBeginTime() + now.getServiceTime());
    				now.setIn(); // 标记作业已调度
    				counter++;
    				i = now.getEndTime(); // 更新当前时间
    				ins.clear(); // 清空临时数组ins
    			}
    
    		}
    		for (int m = 0; m < works.size(); m++) {
    			avgCircleTime += works.get(m).getCircleTime();
    			avgCircleTimeWP += works.get(m).getCircleWPTime();
    		}
    		avgCircleTime = avgCircleTime / works.size();
    		avgCircleTimeWP = avgCircleTimeWP / works.size();
    		lst.add(avgCircleTime);
    		lst.add(avgCircleTimeWP);
    		return lst;
    	}
    
    	/**
    	 * 对加入到系统中的作业依据服务时间多少进行排序<BR>
    	 * 然后直接返回
    	 * 
    	 * @param ins
    	 * @return ins
    	 */
    	public static List<Work> sortByServiceTime(List<Work> ins) {
    		for (int i = 0; i < ins.size(); i++) {
    			for (int j = i + 1; j < ins.size(); j++) {
    				Work aw = ins.get(i);
    				int a = aw.getServiceTime();
    				Work bw = ins.get(j);
    				int b = bw.getServiceTime();
    				if (a > b) {
    					ins.remove(j);
    					ins.add(i, bw);
    				}
    			}
    		}
    		return ins;
    	}
    }
    

    Work

    package net.mooctest;
    public class Work {
        /** 作业名*/
        private String name;
        /** 作业到达时间*/
        private int arrivalTime;
        /** 作业服务时间*/
        private int serviceTime;
        /** 开始执行时间*/
        private int beginTime;
        /** 完成时间*/
        private int endTime;
        /** 作业是否调入系统*/
        private boolean in=false;
        /**
         * 作业已调入
         */
        public void setIn(){
            this.in=true;
        }
        /**
         * 判断作业是否已调入系统
         * @return
         */
        public boolean isIn(){
            return this.in;
        }
        /**
         * Constructor
         * @param name
         * @param t1
         * @param t2
         */
        public Work(String name,int t1,int t2){
            this.name=name;
            this.arrivalTime=t1;
            this.serviceTime=t2;
        }
        /**
         * 设置开始执行时间
         * @param t
         */
        public void setBeginTime(int t){
            this.beginTime=t;
        }
        /**
         * 获取开始时间
         * @return
         */
        public int getBeginTime(){
            return this.beginTime;
        }
        /**
         * 设置完成时间
         * @param t
         */
        public void setEndTime(int t){
            this.endTime=t;
        }
        /**
         * 获取结束时间
         * @return
         */
        public int getEndTime(){
            return this.endTime;
        }
        /**
         * 计算“周转时间”=完成时间-到达时间
         * @return int
         */
        public int getCircleTime(){
            return this.endTime-this.arrivalTime;
        }
        /**
         * 计算“带权周转时间”=周转时间/服务时间
         * @return
         */
        public double getCircleWPTime(){
    
    
            return ((double)getCircleTime()