操作系统- 实验二 模拟处理机调度的SJF调度算法(Java实现)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38712932/article/details/85088013

                                                      实验二 模拟处理机调度的SJF调度算法

一、实验目的:用c++模拟SJF调度算法(短作业优先)

二、实验内容:本实验首先输入进程的个数,然后输入进程名称,最后输入每个进程提交到系统的时间和每个进程所需要的处理时间。然后通过模拟程序,显示以下信息:

1)处理机对进程的调度过程。

2)计算这N个进程的平均周转时间。

注意:

  1. 作业在运行过程中不能抢断,只有作业运行完毕才能允许其它作业运行。
  2. 如果两个作业的处理时间相等,则提交时间早的优先执行。

三、示例  

输入:

4

A  0.1   5

B  0.1   3

C  2    3

D  5    8

输出:

测试数据:

解题思路:

首先进行根据提交时间排序一下,然后依次根据进程数来选择遍历次数

初始化当前时间为最先到达内存的进程的提交时间

然后判断在这个时间点有哪些任务已经到达内存,依次放入另外一个集合

对这个集合进行所需时间排序,需要时间最少的先执行,其次如果需要时间相等,就根据两者的到达时间最小的先执行,执行结束后当前时间为当前时间加上这个进程的所需时间

然后再判断在这个时间点有哪些任务已经到达内存,依次放入另外一个集合
 

package com.eternally.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;





class Pcb implements Comparable<Pcb>{
    public String name;
    public float ttime;
    public float needtime;
    public Pcb(String name, float ttime, float needtime) {
	this.name = name;
	this.ttime = ttime;
	this.needtime = needtime;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public float getTtime() {
        return ttime;
    }
    public void setTtime(float ttime) {
        this.ttime = ttime;
    }
    public float getNeedtime() {
        return needtime;
    }
    public void setNeedtime(float needtime) {
        this.needtime = needtime;
    }
    @Override
    public int compareTo(Pcb o) {
	if(this.ttime>o.ttime) {
	    return 1;
	}
	return -1;
    }
    
  
}
public class Test {

    public static void main(String[] args) {
	List<String> list12=new ArrayList<>();
	Iterator iterator =list12.iterator();
	
	Scanner in = new Scanner(System.in);
	int n = in.nextInt();
	String name;
	float ttime;
	float needtime;
	List<Pcb> list = new ArrayList<>();
	for(int i = 0; i < n;i ++) {
	    name=in.next();
	    ttime=in.nextFloat();
	    needtime=in.nextFloat();
	   Pcb pcb = new Pcb(name, ttime, needtime);
	   list.add(pcb);
	}
	Collections.sort(list);
	
	System.out.println("作业号       提交时间       所需时间       开始时间       完成时间");
	float sum=list.get(0).ttime;
	List<Float> list2 = new ArrayList<>();
	float sum1=0;
	for(int i = 0;i<n;i ++) {
	    List<Pcb> list1=new ArrayList<>();
	    for(int j = 0;j < list.size();j ++) {
		if(list.get(j).getTtime()<=sum) {
		    list1.add(list.get(j));
		}
	    }
	    
	    for(int j = 0;j < list1.size()-1;j ++) {
		for(int k = 0;k<list1.size()-1-j;k++) {
		   if(list1.get(k).getNeedtime()>list1.get(k+1).needtime) {
		       swap(list1, k, k+1);
		   }else if(list1.get(k).getNeedtime()==list1.get(k+1).needtime&&list1.get(k).getTtime()>list1.get(k+1).getTtime()) {
		       swap(list1, k, k+1);
		   }
		}
	    }
	    list.remove((Pcb)list1.get(0));
	    System.out.println(list1.get(0).getName()+"       "+list1.get(0).getTtime()+"      "+list1.get(0).getNeedtime()+"    "+sum+"    "+(sum+list1.get(0).getNeedtime()));
	    sum+=list1.get(0).getNeedtime();
	  sum1=sum1+sum-list1.get(0).getTtime();
	}
	System.out.println(String.format("%.2f", sum1/n));
    }
    public static void swap(List<?> list,int i,int j){
        final List l=list;
        l.set(i, l.set(j, l.get(i)));
    }
	
}

猜你喜欢

转载自blog.csdn.net/qq_38712932/article/details/85088013