实验二 模拟处理机调度的SJF调度算法
一、实验目的:用c++模拟SJF调度算法(短作业优先)
二、实验内容:本实验首先输入进程的个数,然后输入进程名称,最后输入每个进程提交到系统的时间和每个进程所需要的处理时间。然后通过模拟程序,显示以下信息:
1)处理机对进程的调度过程。
2)计算这N个进程的平均周转时间。
注意:
- 作业在运行过程中不能抢断,只有作业运行完毕才能允许其它作业运行。
- 如果两个作业的处理时间相等,则提交时间早的优先执行。
三、示例
输入:
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)));
}
}