操作系统--磁盘调度算法

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;

class Disk{
	private int n;
	private int m;
	private String direction;
	
	private ArrayList<Integer> disk = new ArrayList<Integer>();
	
	public Disk(int n,int m,String direction){
		this.n=n;
		this.m=m;
		this.direction=direction;
	}
	
	public void Init() {
		Scanner in=new Scanner (System.in);
		System.out.println("请输入请求队列:(输入完毕请以“/”结束并回车)");
		while (in.hasNextInt()) {
			disk.add(in.nextInt());
		}
	}
	
	public void FCFS(){
		System.out.println("********************FIFS Algorithm*******************");
		int amount=disk.size();
		int distance=Math.abs(disk.get(0)-m);
		for(int i=1;i<amount;i++) {
			distance+=Math.abs(disk.get(i)-disk.get(i-1));
		}
		System.out.println("磁头移动顺序:");
		System.out.print(m);
		for(int k:disk) {
			System.out.print("→"+k);
		}
		System.out.println();
		System.out.println("磁头移动总量:"+distance);
	}
	
	public void SSTF() {
		System.out.println("********************SSTF Algorithm*******************");
		ArrayList<Integer> temp=new ArrayList<Integer>();
		for(int i=0;i<disk.size();i++) {
			temp.add(disk.get(i));
		}
		int c=m;//c表示当前位置
		int distance=0;
		System.out.println("磁头移动顺序:");
		System.out.print(m);
		while(temp.size()!=0) {
			int min=Math.abs(c-temp.get(0));
			for(int i=0;i<temp.size();i++) {
				int d=Math.abs(c-temp.get(i));
				if(d<min) {
					min=d;
				}else {
					
				}
			}
			for(int i=0;i<temp.size();i++) {
				if(min==Math.abs(c-temp.get(i))) {
					c=temp.get(i);
					System.out.print("→"+temp.get(i));
					distance+=min;
					temp.remove(i);
				}
			}
		}
		System.out.println();
		System.out.println("磁头移动总量:"+distance);
		
	}
	
	public void SCAN() {
		System.out.println("********************SCAN Algorithm*******************");
		int distance=0;
		int count1=0;
		int count2=0;
		int c1=0;
		int c2=0;
		for(int i=0;i<disk.size();i++) {
			if(m<=disk.get(i)) {
				c2++;
			}else {
				c1++;
			}
		}
		int temp1[]=new int[c1];
		int temp2[]=new int[c2];
		for(int i=0;i<disk.size();i++) {
			if(m<=disk.get(i)) {
				temp2[count2]=disk.get(i);
				count2++;
			}else {
				temp1[count1]=disk.get(i);
				count1++;
			}
		}
		Arrays.sort(temp1);
		Arrays.sort(temp2);
		System.out.println("磁头移动顺序:");
		System.out.print(m);
		if("向外".equals(direction)) {
			for(int i=0;i<count2;i++) {
				System.out.print("→"+temp2[i]);
			}
			for(int i=count1-1;i>=0;i--) {
				System.out.print("→"+temp1[i]);
			}
			if(count1==0) {
				distance=(temp2[count2-1]-m);
			}else {
				distance=(n-m)+(n-temp1[0]);
			}
		}else {
			for(int i=count1-1;i>=0;i--) {
				System.out.print("→"+temp1[i]);
			}
			for(int i=0;i<count2;i++) {
				System.out.print("→"+temp2[i]);
			}
			if(count2==0) {
				distance=m-temp1[0];
			}else {
				distance=m+temp2[count2-1];
			}
		}
		System.out.println();
		System.out.println("磁头移动总量:"+distance);
	}
	
	public void ESA() {
		System.out.println("********************电梯调度算法*******************");
		int distance=0;
		int count1=0;
		int count2=0;
		int c1=0;
		int c2=0;
		for(int i=0;i<disk.size();i++) {
			if(m<=disk.get(i)) {
				c2++;
			}else {
				c1++;
			}
		}
		int temp1[]=new int[c1];
		int temp2[]=new int[c2];
		for(int i=0;i<disk.size();i++) {
			if(m<=disk.get(i)) {
				temp2[count2]=disk.get(i);
				count2++;
			}else {
				temp1[count1]=disk.get(i);
				count1++;
			}
		}
		Arrays.sort(temp1);
		Arrays.sort(temp2);
		System.out.println("磁头移动顺序:");
		System.out.print(m);
		if("向外".equals(direction)) {
			for(int i=0;i<count2;i++) {
				System.out.print("→"+temp2[i]);
			}
			for(int i=count1-1;i>=0;i--) {
				System.out.print("→"+temp1[i]);
			}
			if(count1==0) {
				distance=(temp2[count2-1]-m);
			}else {
				distance=(temp2[count2-1]-m)+(temp2[count2-1]-temp1[0]);
			}
		}else {
			for(int i=count1-1;i>=0;i--) {
				System.out.print("→"+temp1[i]);
			}
			for(int i=0;i<count2;i++) {
				System.out.print("→"+temp2[i]);
			}
			if(count2==0) {
				distance=m-temp1[0];
			}else {
				distance=m-temp1[0]+temp2[count2-1];
			}
		}
		System.out.println();
		System.out.println("磁头移动总量:"+distance);
	}
	
	
}

public class Main3{
  public static void main(String[] args) {
	  Scanner in =new Scanner (System.in);
	  System.out.println("磁盘上的柱面数:(逻辑值从零开始)");
	  int n=in.nextInt();
	  System.out.println("当前所处磁道位置:");
	  int m=in.nextInt();
	  System.out.println("存取臂当前移动方向:(向内 or 向外)");
	  String direction=in.next();
	  Disk disk1 = new Disk(n,m,direction);
	  disk1.Init();
	  while(true) {
		  System.out.println("请输入想要实现的算法: 1:FCFS  2:SSTF  3:SCAN  4:电梯调度算法  5:退出");
		  int choice=in.nextInt();
		  switch(choice) {
		  	case 1:
		  		disk1.FCFS();break;
		  	case 2:
		  		disk1.SSTF();break;
		  	case 3:
		  		disk1.SCAN();break;
		  	case 4:
		  		disk1.ESA();break;
		  	case 5:
		  		System.out.println("退出成功!");
				System.exit(0);break;
		  }
	  }
  }
  
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值