Java实现操作系统实验之磁盘调度

时间:2022-07-23
本文章向大家介绍Java实现操作系统实验之磁盘调度,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

这一版的磁盘调度,作者只分析了磁盘通道号,之后作者会加入对最晚完成时间的分析。 首先理解一下,什么是磁盘调度,磁盘调度的意思是,所有的进程都是在磁盘中得某个同道号中享受资源的,那么就会存在一个问题,我们是按什么顺序来执行这些进程呢,

一种是按照最晚完成时间的前后来安排,这种可以使得任务能够顺序的执行。但是任务完成的时间会大大的增加。

有一种就是按照磁盘的通道号的大小来操作,这样的话,能够更快速的完成任务,但是可能其中有些进程会因为超过最晚完成时间而导致进程的失效。

还有一种就是两种都比较兼顾的算法就是,电梯调度算法,这种算法既考虑到了磁盘通道号,也考虑到了最晚完成时间,这种算法首先是按照最晚完成时间进行排序,排序完了之后,再将最晚完成时间进行划分区间,比如说在时间区间内,有几个进程都可以顺利的完成,那样的话,在这种基础上,就可再对这几个进程进行磁盘通道号进行排序,这样的话又能在规定的时间内完成,又能够保证完成的时间尽量少。所以非常适合实现。

这里作者先做了电梯调度算法的一部分,源代码中会详细讲解。 下面贴源代码 第一个是纯粹是通过机器自动选择操作的方式

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Random;
import java.util.Scanner;

public class 磁盘调度 {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		Random ran=new Random();
		System.out.println("输入随机产生的进程数的范围");//初始化
		System.out.print("最小是:");
		int n=sc.nextInt();
		System.out.print("最大是:");
		int m=sc.nextInt();
		int n1=ran.nextInt(m-n+1)+n;
		System.out.println("输入磁盘号的范围");
		System.out.print("最小是:");
		int nn=sc.nextInt();
		System.out.print("最大是:");
		int mm=sc.nextInt();
		Queue<node>queue=new PriorityQueue<node>(compare);
		node []node1=new node[n1];
		for(int i=0;i<n1;i++)
		{
			node1[i]=new node();
			node1[i].name=i+1;
			node1[i].number=ran.nextInt(mm-nn+1)+nn;
			queue.add(node1[i]);
		}
		System.out.println("初始化已经完成!!");
		int length=queue.size();
		double count=ran.nextDouble();
		if(count<0.5)//磁盘调度
		{
			length--;
			System.out.println("进行磁盘调度操作!!");
			node node2=queue.poll();
			System.out.println(node2.name+"--"+node2.number+"已经执行结束!!");
		}
		else //压入新的进程
		{
			length++;
			System.out.println("进行压入新的进程操作!!");
			node node2=new node();
			System.out.println("输入压入的进程的进程号,类型为int类型");
			node2.name=sc.nextInt();
			System.out.println("输入压入的进程的磁盘通道号,注意范围是"+nn+"----"+mm);
			node2.number=sc.nextInt();
			queue.add(node2);
			System.out.println("已经压入");
		}
		System.out.println("是否继续,输入Y或者N");
		String str=sc.next();
		while(!str.equals("Y")&&!str.equals("N"))
		{
			System.out.println("你输入的操作不存在,请重新输入!!");
			str=sc.next();
		}
		while(str.equals("Y")&&length>0)
		{
			count=ran.nextDouble();
			if(count<0.5)//进行磁盘调度
			{
				length--;
				System.out.println("进行磁盘调度操作!!");
				node node2=queue.poll();
				System.out.println(node2.name+"--"+node2.number+"已经执行结束!!");
			}
			else//压入新的进程
			{
				length++;
				System.out.println("进行压入新的进程操作!!");
				node node2=new node();
				System.out.println("输入压入的进程的进程号,类型为int类型");
				node2.name=sc.nextInt();
				System.out.println("输入压入的进程的磁盘通道号,注意范围是"+nn+"----"+mm);
				node2.number=sc.nextInt();
				queue.add(node2);
				System.out.println("已经压入");
			}
			System.out.println("是否继续,输入Y或者N");
			str=sc.next();
			while(!str.equals("Y")&&!str.equals("N"))
			{
				System.out.println("你输入的操作不存在,请重新输入!!");
				str=sc.next();
			}
		}
		if(length==0)
		{
			System.out.println("进程已经全部执行完毕!!!");
		}	
	}
	static Comparator<node>compare=new Comparator<node>() {

		@Override
		public int compare(node o1, node o2) {
			// TODO Auto-generated method stub
			return o1.number-o2.number;
		}
	};
	static class node
	{
		int name;//进程名
		//int limittime;//最晚完成时间
		int number;//磁道通道号
		public node() {
			// TODO Auto-generated constructor stub
		}
	}
}

第二个是通过人自己选择操作的方式

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Random;
import java.util.Scanner;

public class 磁盘调度第二版 {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		Random ran=new Random();
		System.out.println("输入随机产生的进程数的范围");//初始化
		System.out.print("最小是:");
		int n=sc.nextInt();
		System.out.print("最大是:");
		int m=sc.nextInt();
		int n1=ran.nextInt(m-n+1)+n;
		System.out.println("输入磁盘号的范围");
		System.out.print("最小是:");
		int nn=sc.nextInt();
		System.out.print("最大是:");
		int mm=sc.nextInt();
		Queue<node>queue=new PriorityQueue<node>(compare);
		node []node1=new node[n1];
		for(int i=0;i<n1;i++)
		{
			node1[i]=new node();
			node1[i].name=i+1;
			node1[i].number=ran.nextInt(mm-nn+1)+nn;
			queue.add(node1[i]);
		}
		System.out.println("初始化已经完成!!");
		int length=queue.size();
		//double count=ran.nextDouble();
		System.out.println("是否继续,输入Y或者N");
		String str=sc.next();
		while(!str.equals("Y")&&!str.equals("N"))
		{
			System.out.println("你输入的操作不存在,请重新输入!!");
			str=sc.next();
		}
		if(str.equals("Y"))//磁盘调度
		{
			length--;
			System.out.println("进行磁盘调度操作!!");
			node node2=queue.poll();
			System.out.println(node2.name+"--"+node2.number+"已经执行结束!!");
		}
		else //压入新的进程
		{
			length++;
			System.out.println("进行压入新的进程操作!!");
			node node2=new node();
			System.out.println("输入压入的进程的进程号,类型为int类型");
			node2.name=sc.nextInt();
			System.out.println("输入压入的进程的磁盘通道号,注意范围是"+nn+"----"+mm);
			node2.number=sc.nextInt();
			queue.add(node2);
			System.out.println("已经压入");
		}
		System.out.println("是否继续,输入Y或者N");
		str=sc.next();
		while(!str.equals("Y")&&!str.equals("N"))
		{
			System.out.println("你输入的操作不存在,请重新输入!!");
			str=sc.next();
		}
		while(length>0)
		{
			if(str.equals("Y"))//进行磁盘调度
			{
				length--;
				System.out.println("进行磁盘调度操作!!");
				node node2=queue.poll();
				System.out.println(node2.name+"--"+node2.number+"已经执行结束!!");
			}
			else//压入新的进程
			{
				length++;
				System.out.println("进行压入新的进程操作!!");
				node node2=new node();
				System.out.println("输入压入的进程的进程号,类型为int类型");
				node2.name=sc.nextInt();
				System.out.println("输入压入的进程的磁盘通道号,注意范围是"+nn+"----"+mm);
				node2.number=sc.nextInt();
				queue.add(node2);
				System.out.println("已经压入");
			}
			System.out.println("是否继续,输入Y或者N");
			str=sc.next();
			while(!str.equals("Y")&&!str.equals("N"))
			{
				System.out.println("你输入的操作不存在,请重新输入!!");
				str=sc.next();
			}
		}
		if(length==0)
		{
			System.out.println("进程已经全部执行完毕!!!");
		}	
	}
	static Comparator<node>compare=new Comparator<node>() {

		@Override
		public int compare(node o1, node o2) {
			// TODO Auto-generated method stub
			return o1.number-o2.number;
		}
	};
	static class node
	{
		int name;//进程名
		//int limittime;//最晚完成时间
		int number;//磁道通道号
		public node() {
			// TODO Auto-generated constructor stub
		}
	}
}

还是老样子,作者很菜,如有不足,不吝赐教!!!