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

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

                                                             实验三  模拟处理机HRRN调度算法

 

一、实验目的:用c,c++,java设计HRRN调度算法程序。

二、实验内容:本实验随机输入的进程个数、进程名称、进程提交到系统的时间、进程运行所需时间。通过模拟程序。显示以下信息:

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

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

三、HRRN(最高响应比调度算法)原理

最高响应比调度:在每次调度作业时,先计算后备队中每个作业的响应比,然后挑选响应比高者投入运行。

响应比R定义:

                  R=(w+S)/S

  (R:响应比,W=等待时间,S=运行时间)

 响应比R= 周转时间 / 运行时间

          =(运行时间 + 等待时间)/ 运行时间

          = 1 +(等待时间 / 运行时间)

四、示例

如:输入

进程个数:5

进程名称   到达系统时间   所需服务时间

A              0           3

B              2           6

C              4           4

D              6           5

E              8           2

显示运行结果:

进程名称  到达系统时间 所需服务时间  开始时间  结束时间

A              0           3           0          3

B              2           6           3          9

C              4           4           9          13   

E              8           2           13         15

D              6           5           15         20

5个进程的平均周转时间:(3+7+9+7+14)/5=8

 

五、运行结果

背景: 这是我们操作系统课程的一道实验题

做这道题,我只花了打算8分钟左右的样子,因为这道题和之前实验二的一道题差不多

 

解题思路:

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

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

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

对这个集合进行响应比排序,将响应比最高的进程进行执行,执行结束后当前时间为当前时间加上这个进程的所需时间

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

代码如下:

package com.eternally.dfs;

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

/**
 * HRRN算法
 * @author Administrator
 *
 */

public class Test2 {
	public static void main(String[] args) {
	    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((sum-list1.get(k).getTtime())/list1.get(k).getNeedtime()<(sum-list1.get(k+1).getTtime())/list1.get(k+1).getNeedtime()) {
			       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)));
	    }
}

 

 

 

 

代码如下:

package com.eternally.dfs;

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

/**
 * HRRN算法
 * @author Administrator
 *
 */
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 Test2 {
	public static void main(String[] args) {
	    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((sum-list1.get(k).getTtime())/list1.get(k).getNeedtime()<(sum-list1.get(k+1).getTtime())/list1.get(k+1).getNeedtime()) {
			       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/84952659
今日推荐