Java语言实现SJF算法思想_操作系统- 实验二 模拟处理机调度的SJF调度算法(Java实现)-Go语言中文社区...

本文介绍了使用Java模拟实现SJF(短作业优先)调度算法的实验,包括实验目的、内容和示例输入输出。实验中,根据进程的提交时间和处理时间进行排序,确保短进程优先执行,并考虑了处理时间相等时按提交时间优先的情况。
摘要由CSDN通过智能技术生成

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

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

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

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

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

注意:

作业在运行过程中不能抢断,只有作业运行完毕才能允许其它作业运行。

如果两个作业的处理时间相等,则提交时间早的优先执行。

三、示例

输入:

4

A  0.1   5

B  0.1   3

C  2    3

D  5    8

输出:

bfc30c8b01a48c1a83018ecb71dcd05f.png

测试数据:

66435a2c68e0d7389258a0f5bca4154d.png

e13078855bbc824877b1d1d6f73dd3b4.png

747cff278f762ae9e6b23b3b060edb3f.png

解题思路:

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

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

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

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

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

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{

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 list12=new ArrayList<>();

Iterator iterator =list12.iterator();

Scanner in = new Scanner(System.in);

int n = in.nextInt();

String name;

float ttime;

float needtime;

List 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 list2 = new ArrayList<>();

float sum1=0;

for(int i = 0;i

List 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

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)));

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值