操作系统·用Java编写通用处理机调度演示程序的实现

在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个,为了使系统中的进程有条不紊地工作,必须选用某种调度策略,在一定的时机选择一个进程占有处理机。要求设计一个模拟处理机调度算法,以巩固和加深处理机调度的概念。

设计要求

每一个进程有一个PCB ,其内容可以根据具体情况设定。进程数、进入内存时间、要求服务时间、进程大小、优先级等可以通过在界面上设定,也可读取样例数据进行初始化。


 进程调度算法包括:先来先服务算法、短进程优先算法、静态优先权优先调度算法、高响应比调度算法、时间片轮转算法


可比较同一组数据在不同调度算法下的平均等待时间、平均周转时间、平均带权周转时间


代码实现:

  • PCB类:


public class PCB {
/*设计要求
 * 每一个进程有一个PCB ,其内容可以根据具体情况设定
 * 进程数、进入内存时间、要求服务时间、进程大小、优先级等可以通过在界面上设定,
 * 也可读取样例数据(要求存放在外部文件中)进行初始化。
*/	
	private String name;//进程名
	private int arr_time;//进入内存时间
	private int run_time;//要求服务时间
	private int wait_time;//等待时间
	private double c_time;//周转时间
	private int pri;//优先权
	private double response;//响应比
	private char sta;//状态
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getArr_time() {
		return arr_time;
	}
	public void setArr_time(int arr_time) {
		this.arr_time = arr_time;
	}
	public int getRun_time() {
		return run_time;
	}
	public void setRun_time(int run_time) {
		this.run_time = run_time;
	}
	public int getWait_time() {
		return wait_time;
	}
	public void setWait_time(int wait_time) {
		this.wait_time = wait_time;
	}
	public double getC_time() {
		return c_time;
	}
	public void setC_time(double c_time) {
		this.c_time = c_time;
	}
	public int getPri() {
		return pri;
	}
	public void setPri(int pri) {
		this.pri = pri;
	}
	public double getResponse() {
		return response;
	}
	public void setResponse(double response) {
		this.response = response;
	}
	public char getSta() {
		return sta;
	}
	public void setSta(char sta) {
		this.sta = sta;
	}
	public PCB(String name, int arr_time, int run_time, int wait_time, double c_time, int pri, double response,
			char sta) {
		super();
		this.name = name;
		this.arr_time = arr_time;
		this.run_time = run_time;
		this.wait_time = wait_time;
		this.c_time = c_time;
		this.pri = pri;
		this.response = response;
		this.sta = sta;
	}
	public PCB() {
		super();
		// TODO 自动生成的构造函数存根
	}
	@Override
	public String toString() {
		return "PCB [name=" + name + ", arr_time=" + arr_time + ", run_time=" + run_time + ", wait_time=" + wait_time
				+ ", c_time=" + c_time + ", pri=" + pri + ", response=" + response + ", sta=" + sta + "]";
	}
	
	
}
  • 算法测试类:

import java.util.Scanner;
// org.springframework.beans.BeanUtils;
/**
 * 1、通用处理机调度演示程序的实现
在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个,
为了使系统中的进程有条不紊地工作,必须选用某种调度策略,在一定的时机选择一个进程占有处理机。
要求学生设计一个模拟处理机调度算法,以巩固和加深处理机调度的概念。
 * @author Liuhuimin
 * 
 */
public class Test {
 /*设计要求
 * 进程调度算法包括
 * 先来先服务算法、短进程优先算法、静态优先权优先调度算法、高响应比调度算法、时间片轮转算法
 * (选择至少三种算法进行实现)。*/	
	static int c=10000;
	static int late=0;
	static int longtime=0;
	static int highpri=0;
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入进程数量:");
		int Pnum=sc.nextInt();
		//PCB [] pcb=new PCB[Pnum];
		PCB [] test=new PCB[Pnum];
		intal_pcb(test);
		System.out.println("您的设定结果如下:");
		print(test);
		//test=(PCB[])pcb.clone();
		//BeanUtils.copyProperties(pcb, test);
		System.out.println("开始为进程调度算法:");
		FCFS(test);//先来先服务
		Prepare(test);
		//print(pcb);
		intal_pcb(test);
		//test=pcb.clone();;
		SJF(test);//短作业优先
		Prepare(test);
		intal_pcb(test);
		//test=pcb.clone();;
		HPF(test);//优先权高者优先
		Prepare(test);
		intal_pcb(test);
		//test=pcb.clone();;
		HRRN(test);//响应比高者优先
		Prepare(test);
	}
	public static void intal_pcb(PCB[] pcb) {
		Scanner sc=new Scanner(System.in);
//		int [] arr_time= {800,815,830,835,845,700,820};//进入内存时间
//		int [] run_time= {50,30,25,20,15,10,5};//要求服务时间
//		int [] pri= {0,1,2,3,4,1,0};//优先权
		
		for(int i=0;i<pcb.length;i++) {
			pcb[i]=new PCB();
			pcb[i].setName((i+1)+"");
			System.out.println("请输入第"+(i+1)+"个进程的进入内存时间:");
			int arr_time=sc.nextInt();
			pcb[i].setArr_time(arr_time);
			if(c>arr_time)//设置当前时间(最小进入内存时间)
			{c=arr_time;}
			if(late<arr_time)//最迟进入内存时间
			{late=arr_time;}
			System.out.println("请输入第"+(i+1)+"个进程的要求服务时间:");
			int run_time=sc.nextInt();
			pcb[i].setRun_time(run_time);
			if(longtime<run_time)//最迟进入内存时间
			{longtime=run_time;}
			System.out.println("请输入第"+(i+1)+"个进程的优先权:");
			int pri=sc.nextInt();
			pcb[i].setPri(pri);
			if(highpri<pri)//最高优先权
			{highpri=pri;}
			pcb[i].setSta('W');
		}
	}
	//输出
	public static void print(PCB[]pcb) {
		for(int i=0;i<pcb.length;i++) {
			System.out.println(pcb[i]);
		}
		System.out.println();
	}
	//判断是否全部完成
	private static boolean fun(PCB[] pcb) {
		for(int i=0;i<pcb.length;i++) {
			if(pcb[i].getSta()!='F') {
				return true;
			}
		}
		return false;
	}
/*设计要求
 * 有性能比较功能,可比较同一组数据在不同调度算法下的平均等待时间、平均周转时间、平均带权周转时间。*/
	//比较
	public static void Prepare(PCB [] pcb) {
		double wait=0;double ct=0;double wait_ct;
		for(int i=0;i<pcb.length;i++) {
			wait=pcb[i].getWait_time()+wait;
			ct=pcb[i].getC_time()+ct;
		}
		wait=wait/7;//平均等待时间=等待时间/进程数
		ct=ct/7;//平均周转时间=周转时间/进程数
		wait_ct=wait/ct;//平均带权周转时间=平均等待时间/平均周转时间
		System.out.println("平均等待时间:"+wait+" 平均周转时间:"+ct+"平均带权周转时间:"+wait_ct);
	}
	
	//先来先服务(First-Come First-Served,FCFS)调度算法
	//按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。
	public static void FCFS(PCB [] pcb) {
		System.out.println("-------FCFS------");

		while(fun(pcb)) {
			int max=late;
			int min_i=-1;
			for(int i=0;i<pcb.length;i++) {
				if(pcb[i].getArr_time()<=c&&pcb[i].getSta()!='F') {
					//if(到达时间<=本轮开始时间)
					if(pcb[i].getArr_time()<=max) {
						max=pcb[i].getArr_time();
						min_i=i;//作业排序
					}
				}
			}
			if(min_i==-1) {
				c+=1;
			}else {
				pcb[min_i].setSta('R');
				pcb[min_i].setWait_time(c-pcb[min_i].getArr_time());
				print(pcb);//输出R的情况

				c=c+pcb[min_i].getRun_time();
				//System.out.println("c:"+c);
				pcb[min_i].setSta('F');

				pcb[min_i].setC_time(c-pcb[min_i].getArr_time());
				print(pcb);//输出F的情况
			}
		}

	}
	
	//短作业优先 (Shortest-Job-First,SJF) 调度算法
	//优先调度要求运行时间最短的作业。
	public static void SJF(PCB [] pcb) {
		System.out.println("-------SJF------");

		while(fun(pcb)) {
			int min=longtime;
			int min_i=-1;
			for(int i=0;i<pcb.length;i++) {
				if(pcb[i].getArr_time()<=c&&pcb[i].getSta()!='F') {
					if(pcb[i].getRun_time()<=min) {
						min=pcb[i].getRun_time();
						min_i=i;//作业排序
					}
				}
			}
			if(min_i==-1) {
				c+=1;
			}else {
				pcb[min_i].setSta('R');
				pcb[min_i].setWait_time(c-pcb[min_i].getArr_time());
				print(pcb);//输出R的情况
	
				c+=pcb[min_i].getRun_time();
				pcb[min_i].setSta('F');

				pcb[min_i].setC_time(c-pcb[min_i].getArr_time());
				print(pcb);//输出F的情况
				min_i=-1;
			}
		}
	}
	
	//优先权高者优先(Highest-Priority-First,HPF)调度算法
	//为每个作业设置一个优先数,优先数高者优先调度。
	public static void HPF(PCB [] pcb) {
		System.out.println("-------HPF------");

		while(fun(pcb)) {
			int min=highpri;
			int min_i=-1;
			for(int i=0;i<pcb.length;i++) {
				if(pcb[i].getArr_time()<=c&&pcb[i].getSta()!='F') {
					if(pcb[i].getPri()<=min) {
						min=pcb[i].getPri();
						min_i=i;//作业排序
					}
				}
			}
			if(min_i==-1) {
				c+=1;//未开始 时间+1
			}else {
				pcb[min_i].setSta('R');
				pcb[min_i].setWait_time(c-pcb[min_i].getArr_time());
				print(pcb);//输出R的情况
				
				c+=pcb[min_i].getRun_time();
				pcb[min_i].setSta('F');
				
				pcb[min_i].setC_time(c-pcb[min_i].getArr_time());
				print(pcb);//输出F的情况
			}
		}
	}
	
	//计算响应比  响应比= 作业周转时间 / 作业运行时间,数值越大越优先。
	public static double Response(int c,PCB [] pcb) {
		for(int i=0;i<pcb.length;i++) {
			if(pcb[i].getArr_time()<=c&&pcb[i].getSta()!='F') {
				pcb[i].setResponse((c-pcb[i].getArr_time())/pcb[i].getRun_time());
			}
		}
		//排序
		PCB [] temp=new PCB[1];
		for(int n=0;n<pcb.length-1;n++) {
			for(int m=0;m<pcb.length-n-1;m++) {
				//根据响应比
				if(pcb[m+1].getResponse()<pcb[m].getResponse()) {
					temp[0]=pcb[m];
					pcb[m]=pcb[m+1];
					pcb[m+1]=temp[0];
				}
			}
		}
		return pcb[pcb.length-1].getResponse();
	}
	//响应比高者优先(Highest Response Ratio Next,HRRN)调度算法
	//计算每个作业的响应比,响应比= 作业周转时间 / 作业运行时间,数值越大越优先。
	public static void HRRN(PCB [] pcb) {
		System.out.println("-------HRRN------");

		while(fun(pcb)) {
			double max=Response(c,pcb);
			int min_i=-1;
			for(int i=0;i<pcb.length;i++) {
				if(pcb[i].getArr_time()<=c&&pcb[i].getSta()!='F') {
					if(pcb[i].getResponse()>=max) {
						max=pcb[i].getResponse();//修改最高响应比
						min_i=i;//作业排序
					}
				}
			}
			if(min_i==-1) {
				c+=1;
			}else {
				pcb[min_i].setSta('R');

				pcb[min_i].setWait_time(c-pcb[min_i].getArr_time());
				print(pcb);//输出R的情况

				c+=pcb[min_i].getRun_time();
				pcb[min_i].setSta('F');
				
				pcb[min_i].setC_time(c-pcb[min_i].getArr_time());
				print(pcb);//输出F的情况
			}
		}
	}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值