磁盘比调度算法代码

Arithmetic.java

import java.util.ArrayList;

public class Arithmetic {
public String string;
public int sumtime;
public Arithmetic(String string,int sumtime) {
	this.string=string;
	this.sumtime=sumtime;
}

public String toString() {
	return string+":"+sumtime+"\n";
}
}

FCFS.java


import java.util.ArrayList;

public class FCFS {
	public int time = 0;
	public int sumtime = 0;
	ArrayList<Integer> list = new ArrayList<Integer>();

	public FCFS(ArrayList<Integer> list) {
		for (int i = 0; i < list.size() - 1; i++) {
			if (list.get(i + 1) > list.get(i)) {
				time = list.get(i + 1) - list.get(i);
				sumtime = sumtime + time;
			} else {
				time = list.get(i) - list.get(i + 1);
				sumtime = sumtime + time;
			}
		}
	}

}

 LIFT.java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

public class LIFT {
	public int sumtime = 0;
	public int sun = 0;
	ArrayList<Integer> list1 = new ArrayList<Integer>();// 存放已经访问过的磁头
	ArrayList<Integer> list2 = new ArrayList<Integer>();

	public LIFT(ArrayList<Integer> list, int index) {

		int head = list.get(0);
		list1.add(list.get(0));

		if (index == 0) {// 向柱面里面移动
			for (int i = 0; i < list.size(); i++) {
				if (head < list.get(i)) {
					list1.add(list.get(i));

				}
			}

			Collections.sort(list1);

			sumtime = (list1.get(list1.size() - 1) - (list1.get(0)));

			for (int i = 0; i < list.size(); i++) {
				if (head > list.get(i)) {
					list2.add(list.get(i));
				}
			}
			Collections.sort(list2);
			Collections.reverse(list2);
			if(list2.isEmpty()) {
				
				sun = 0 ;
			}
			else
			sun = list1.get(list1.size() - 1) - list2.get(list2.size() - 1);
			sumtime = sumtime + sun;
			list1.addAll(list2);
		}

		if (index == 1) {// 向柱面外移动
			for (int i = 0; i < list.size(); i++) {
				if (head > list.get(i)) {
					list1.add(list.get(i));

				}
			}
			Collections.sort(list1);
			Collections.reverse(list1);

			sumtime = list1.get(0) - list1.get(list1.size() - 1);

			for (int i = 0; i < list.size(); i++) {
				if (head < list.get(i)) {
					list2.add(list.get(i));
				}
			}
			Collections.sort(list2);
			if(list2.isEmpty()) {
				
				sun = 0 ;
			}
			else
			sun = list2.get(list2.size() - 1) - list1.get(list1.size() - 1);
			sumtime = sumtime + sun;
			list1.addAll(list2);
		}

		if (index == 2) {

		}
	}
}

Moving_arm.java


import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.swing.*;
import java.awt.Color;
import java.awt.Font;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

class MYCompator implements Comparator<Arithmetic>{
	public int compare(Arithmetic ari1,Arithmetic ari2) {
		if(ari1.sumtime<=ari2.sumtime)
			return 1;
		else
			return -1;
	}
}



public class Moving_arm extends JFrame implements ActionListener {
	private JComboBox comboBox;
	private String string[] = { "FCFS", "SSTF", "Scan", "LIFT" };
	public JTextField text_list,scrolltext;// 给的访问序列
	private JPanel pane1, pane2, pane3;
	private JButton start, compare;
	private JTextArea text;// 显示访问的序列
	private JTextArea text_compare;// 算法比较
	private JScrollPane js, js1;
	private JSplitPane split,split1;
	private ArrayList<Integer> list;

	public Moving_arm() {
		super("磁盘移臂调度算法");
		this.setSize(700, 500);
		this.setLocationRelativeTo(null);
		this.setResizable(false);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		pane1 = new JPanel();
		pane2 = new JPanel();
		pane3=new JPanel();

		pane1.setLayout(new GridLayout(2, 3));
		pane1.add(new JLabel("磁头序列"));
		text_list = new JTextField(20);
		pane1.add(text_list);
		start = new JButton("开始");
		start.addActionListener(this);
		pane1.add(start);
		pane1.add(new JLabel("选择算法"));
		comboBox = new JComboBox(string);
		pane1.add(comboBox);
		compare = new JButton("算法比较");
		compare.addActionListener(this);
		pane1.add(compare);
		this.add(pane1);

		split = new JSplitPane(0, pane1, pane2);
		split.setDividerLocation(60);
		this.add(split);
		
		//pane3.setLayout(new GridLayout(1,1));
       //  scrolltext=new JTextField(22);
     //   pane3.add(scrolltext);
       // this.add(pane3);
		//split1=new JSplitPane(0,split,pane2);
	//split1.setDividerLocation(100);;
		//this.add(split1);
		
		pane2.setLayout(new GridLayout(1, 2));
		text = new JTextArea(20, 42);
		pane2.add(text);
		js = new JScrollPane(text, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		pane2.add(js);
		text_compare = new JTextArea(20, 42);
		js1 = new JScrollPane(text_compare, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
				JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		pane2.add(js1);
		// this.add(pane2);
		this.setVisible(true);

	}

	public void actionPerformed(ActionEvent ev) {
		if (ev.getSource() == start) {
			String str1 = (String) comboBox.getSelectedItem();//
			// 先来先服务算法
			input();
			if (str1.equals("FCFS")) {
				// 把文本框里面的内容放到动态数组里
				
				
				FCFS fcfs = new FCFS(list);
				
				text.append("\n-----先来先服务算法-------\n");
				text.append("所花总时间:" + fcfs.sumtime);
				text.append("\n平均寻道长度" + (float) fcfs.sumtime / list.size());
				text.append("\n磁头访问柱面序列:" + list.toString());
				text.append("\n \n");
				

			}

			// 最短寻道时间优先算法
			if (str1.equals("SSTF")) {
				SSTF sstf = new SSTF(list);
				text.append("\n-----最短寻道时间优先算法------\n");
				text.append("所花总时间:" + sstf.sumtime);
				text.append("\n平均寻道长度:" + (float) sstf.sumtime / (sstf.list1.size()));
				text.append("\n磁头访问柱面序列:" + sstf.list1.toString());
				text.append("\n \n");
			}
			// 单向扫描算法
			if (str1.equals("Scan")) {

				String inputstr = JOptionPane.showInputDialog(this, "输入柱面数");
				int cols = Integer.parseInt(inputstr);
				int i = JOptionPane.showConfirmDialog(this, "是否向柱面内方向移动");
				Scan scan = new Scan(list, cols, i);

				if (i == 0) {
					text.append("\n-----单向向磁盘内扫描扫描----\n");
					text.append("所花总时间:" + scan.sumtime);
					text.append("\n平均寻道长度:" + (float) scan.sumtime / (scan.list1.size()));
					text.append("\n磁头访问柱面序列:" + scan.list1.toString());
					text.append("\n \n");
				}

				if (i == 1) {
					text.append("\n-----单向向磁盘外扫描扫描----\n");
					text.append("所花总时间:" + scan.sumtime);
					text.append("\n平均寻道长度:" + (float) scan.sumtime / (scan.list1.size()));
					text.append("\n磁头访问柱面序列:" + scan.list1.toString());
					text.append("\n \n");
				}
				if (i == 2) {
					text.append("\n  \n");
				}

			}

			// 电梯扫描算法
			if (str1.equals("LIFT")) {

				int i = JOptionPane.showConfirmDialog(this, "是否向柱面内方向移动");

				LIFT lift = new LIFT(list, i);

				if (i == 0) {
					text.append("\n-----电梯算法向内部扫描------\n");
					text.append("所花总时间:" + lift.sumtime);
					text.append("\n平均寻道长度:" + (float) lift.sumtime / (lift.list1.size()));
					text.append("\n磁头访问柱面序列:" + lift.list1.toString());
					text.append("\n \n");
				}

				if (i == 1) {
					text.append("\n-----电梯算法向外扫描------\n");
					text.append("所花总时间:" + lift.sumtime);
					text.append("\n平均寻道长度:" + (float) lift.sumtime / (lift.list1.size()));
					text.append("\n磁头访问柱面序列:" + lift.list1.toString());
					text.append("\n \n");
				}
				if (i == 2) {
					text.append("\n \n");
				}

			}
		}

		if (ev.getSource() == compare) {
		
			String str = text_list.getText();
			String[] s = str.split(" ");
			ArrayList<Integer> list = new ArrayList<Integer>();
			ArrayList<Integer> list1 = new ArrayList<Integer>();
			ArrayList<Integer> list2 = new ArrayList<Integer>();
			ArrayList<Arithmetic> list3 = new ArrayList<Arithmetic>();// 存入各个算法的移动距离
			for (int i = 0; i < s.length; i++) {
				list.add(Integer.valueOf(s[i]));
			}
			list1 = (ArrayList<Integer>) list.clone();
			list2 = (ArrayList<Integer>) list.clone();
			FCFS fcfs = new FCFS(list);
			SSTF sstf = new SSTF(list);
			String inputstr = JOptionPane.showInputDialog(this, "输入柱面数");
			int cols = Integer.parseInt(inputstr);
			Scan scan1 = new Scan(list1, cols, 0);
			Scan scan2 = new Scan(list1, cols, 1);
			LIFT lift1 = new LIFT(list2, 0);
			LIFT lift2 = new LIFT(list2, 1);
			list3.add(new Arithmetic("FCFS",fcfs.sumtime));
			list3.add(new Arithmetic("SSTF",sstf.sumtime));
			list3.add(new Arithmetic("Scan向内",scan1.sumtime));
			list3.add(new Arithmetic("Scan向外",scan2.sumtime));
			list3.add(new Arithmetic("LIFT向内",lift1.sumtime));
			list3.add(new Arithmetic("LIFT向外",lift2.sumtime));
			
			List list4=new ArrayList(list3);
			Collections.sort(list4, new MYCompator());
			for(int i=0;i<list4.size();i++) {
			text_compare.append(list4.get(i).toString());
			
			}
			
			StandardChartTheme mChartTheme = new StandardChartTheme("CN");
	        mChartTheme.setLargeFont(new Font("黑体", Font.BOLD, 20));
	        mChartTheme.setExtraLargeFont(new Font("宋体", Font.PLAIN, 15));
	        mChartTheme.setRegularFont(new Font("宋体", Font.PLAIN, 15));
	        ChartFactory.setChartTheme(mChartTheme);
	        CategoryDataset mDataset = GetDataset(fcfs.sumtime,sstf.sumtime,scan1.sumtime,scan2.sumtime,lift1.sumtime,lift2.sumtime);
	        JFreeChart mChart = ChartFactory.createLineChart(
	                "折线图",//图名字
	                "算法",//横坐标
	                "移动距离",//纵坐标
	                mDataset,//数据集
	                PlotOrientation.VERTICAL,
	                true, // 显示图例
	                true, // 采用标准生成器
	                false);// 是否生成超链接

	        CategoryPlot mPlot = (CategoryPlot)mChart.getPlot();
	        mPlot.setBackgroundPaint(Color.LIGHT_GRAY);
	        mPlot.setRangeGridlinePaint(Color.BLUE);//背景底部横虚线
	        mPlot.setOutlinePaint(Color.RED);//边界线

	        ChartFrame mChartFrame = new ChartFrame("折线图", mChart);
	        mChartFrame.pack();
	        mChartFrame.setVisible(true);
			
	

		}

	}
	public static CategoryDataset GetDataset(int s1,int s2,int s3,int s4,int s5,int s6)
    {
        DefaultCategoryDataset mDataset = new DefaultCategoryDataset();
        mDataset.addValue(s1, "算法", "fcfs");
        mDataset.addValue(s2, "算法", "sstf");
        mDataset.addValue(s3, "算法", "scan向外");
        mDataset.addValue(s4, "算法", "scan2向内");
        mDataset.addValue(s5, "算法", "lift1向外");
        mDataset.addValue(s6, "算法", "lift2向内");
       
        return mDataset;
    }
	public void input() {// 获取文本框里面的内容
		String str = text_list.getText();
		String[] s = str.split(" ");
		list = new ArrayList<Integer>();
		for (int i = 0; i < s.length; i++) {
			list.add(Integer.valueOf(s[i]));
		}
	}
	
	
	
	     
	public static void main(String[] args) {
		new Moving_arm();
		// 14 25 66 77 99 125
		// 99 88 55 66 33 22
		// 50 24 69 33 77 6 7 55 46 88 40
	}
}

Scan.java


import java.util.ArrayList;
import java.util.Collections;

public class Scan {
	public int sumtime = 0;
	public int sun = 0;
	ArrayList<Integer> list1 = new ArrayList<Integer>();// 存放已经访问过的磁头
	ArrayList<Integer> list2 = new ArrayList<Integer>();

	public Scan(ArrayList<Integer> list, int cols, int index) {
		int head = list.get(0);
		list1.add(list.get(0));
		list.set(0, -1);

		if (index == 0) {// 向柱面里面移动
			for (int i = 0; i < list.size(); i++) {
				if (head < list.get(i)) {
					list1.add(list.get(i));
					list.set(i, -1);
				}
			}
			list1.add(cols);
			Collections.sort(list1);
			list1.add(0);
			for (int j = 0; j < list.size(); j++) {
				if (list.get(j) > 0) {
					list2.add(list.get(j));
				}
			}
			Collections.sort(list2);
			list1.addAll(list2);
			sumtime = cols - head;
			sun = cols + list1.get(list1.size() - 1);
			sumtime = sumtime + sun;
		}

		if (index == 1) {// 向柱面内移动
			for (int i = 0; i < list.size(); i++) {
				if (head > list.get(i) && list.get(i) > 0) {
					list1.add(list.get(i));
					list.set(i, -1);
				}
			}
			list1.add(0);
			Collections.sort(list1);
			Collections.reverse(list1);
			list1.add(cols);
			for (int j = 0; j < list.size(); j++) {
				if (list.get(j) < cols && list.get(j) > 0) {
					list2.add(list.get(j));
				}
			}
			Collections.sort(list2);
			Collections.reverse(list2);
			list1.addAll(list2);
			sun = list1.get(0) + cols;
			sumtime = cols - list1.get(list1.size() - 1);
			sumtime = sumtime + sun;
		}

	}
}

SSTF.java

import java.util.ArrayList;

public class SSTF {
	public int head;
	public int sumtime = 0;// 磁头移动总时间,用距离表示
	public int min = 0x7fffffff;
	public int mini = 0;// 记录数组下标
	ArrayList<Integer> list1 = new ArrayList<Integer>();// 存放已经访问过的柱面

	public SSTF(ArrayList<Integer> list) {
		head = list.get(0);
		list1.add(list.get(0));
		list.remove(0);
		while (!list.isEmpty()) {
			for (int j = 0; j < list.size(); j++) {

				if (Math.abs(head - list.get(j)) < min) {
					min = Math.abs(head - list.get(j));
					mini = j;

				}

			}
			sumtime = sumtime + min;
			list1.add(list.get(mini));
			head = list.get(mini);
			list.remove(mini);
			min = 0x7fffffff;

		}
	}
}
发布了68 篇原创文章 · 获赞 23 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zsd0819qwq/article/details/105291812