操作系统课设—模拟磁盘调度

Main.java

import java.awt.EventQueue;

public class Main {

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Design frame = new Design();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
}

Algorithm.java

import java.util.ArrayList;

//磁盘调度算法
public class Algorithm {

	static ArrayList<Track> finishedList = new ArrayList<Track>();		//算法调度后磁道信息装入该表
	static double averDistance;// 平均移动距离

	// FCFS
	public static void fcfs(ArrayList<Track> unfinishedList, int startNum) {//参数为请求队列,开始磁道号
		int preNum = startNum;//上一磁道号
		while (unfinishedList.isEmpty() == false) {//请求队列非空,进行调度算法
			unfinishedList.get(0).distance = Math.abs(unfinishedList.get(0).num - preNum);//计算移动距离
			preNum = unfinishedList.get(0).num;
			finishedList.add(unfinishedList.get(0));
			unfinishedList.remove(0);
		}
		double sum = 0;
		for (int i = 0; i < finishedList.size(); i++) {
			sum += finishedList.get(i).distance;
		}
		averDistance = sum / finishedList.size();
	}

	// SSTF
	public static void sstf(ArrayList<Track> unfinishedList, int startNum) {
		Track min = unfinishedList.get(0);//最小距离的磁道
		int preNum = startNum;
		while (unfinishedList.isEmpty() == false) {
			for (int i = 1; i < unfinishedList.size(); i++) {
				if (Math.abs(min.num - preNum) > Math.abs(unfinishedList.get(i).num - preNum)) {
					min = unfinishedList.get(i);
				}
			}
			min.distance = Math.abs(min.num - preNum);
			finishedList.add(min);
			unfinishedList.remove(min);
			preNum = min.num;
			if (unfinishedList.isEmpty() == false) {
				min = unfinishedList.get(0);
			}
		}
		double sum = 0;
		for (int i = 0; i < finishedList.size(); i++) {
			sum += finishedList.get(i).distance;
		}
		averDistance = sum / finishedList.size();
	}

	// SCAN,开始时磁头移动方向为由里向外,再由外向里
	public static void scan_1(ArrayList<Track> unfinishedList, int startNum) {
		ArrayList<Track> list_1 = new ArrayList<Track>();//将由里向外的磁道号装入该表
		ArrayList<Track> list_2 = new ArrayList<Track>();//将由外向里的磁道号装入该表
		for (int i = 0; i < unfinishedList.size(); i++) {
			if (unfinishedList.get(i).num >= startNum) {
				list_1.add(unfinishedList.get(i));
			} else {
				list_2.add(unfinishedList.get(i));
			}
		}
		numSort_1(list_1);//小到大排序
		numSort_2(list_2);//大到小排序
		int preNum = startNum;
		while (list_1.isEmpty() == false) {
			list_1.get(0).distance = Math.abs(list_1.get(0).num - preNum);
			preNum = list_1.get(0).num;
			finishedList.add(list_1.get(0));
			list_1.remove(list_1.get(0));
		}
		while (list_2.isEmpty() == false) {
			list_2.get(0).distance = Math.abs(list_2.get(0).num - preNum);
			preNum = list_2.get(0).num;
			finishedList.add(list_2.get(0));
			list_2.remove(list_2.get(0));
		}
		double sum = 0;
		for (int i = 0; i < finishedList.size(); i++) {
			sum += finishedList.get(i).distance;
		}
		averDistance = sum / finishedList.size();
	}

	// SCAN,开始时磁头移动方向为由外向里,再由里向外
	public static void scan_2(ArrayList<Track> unfinishedList, int startNum) {
		ArrayList<Track> list_1 = new ArrayList<Track>();//将由外向里的磁道号装入该表
		ArrayList<Track> list_2 = new ArrayList<Track>();//将由里向外的磁道号装入该表
		for (int i = 0; i < unfinishedList.size(); i++) {
			if (unfinishedList.get(i).num <= startNum) {
				list_1.add(unfinishedList.get(i));
			} else {
				list_2.add(unfinishedList.get(i));
			}
		}
		numSort_2(list_1);//大到小排序
		numSort_1(list_2);//小到大排序
		int preNum = startNum;
		while (list_1.isEmpty() == false) {
			list_1.get(0).distance = Math.abs(list_1.get(0).num - preNum);
			preNum = list_1.get(0).num;
			finishedList.add(list_1.get(0));
			list_1.remove(list_1.get(0));
		}
		while (list_2.isEmpty() == false) {
			list_2.get(0).distance = Math.abs(list_2.get(0).num - preNum);
			preNum = list_2.get(0).num;
			finishedList.add(list_2.get(0));
			list_2.remove(list_2.get(0));
		}
		double sum = 0;
		for (int i = 0; i < finishedList.size(); i++) {
			sum += finishedList.get(i).distance;
		}
		averDistance = sum / finishedList.size();
	}

	//CSCAN,磁头移动方向始终为由里向外
	public static void cscan_1(ArrayList<Track> unfinishedList, int startNum) {
		ArrayList<Track> list_1 = new ArrayList<Track>();//大于开始磁道号的磁道装入该表
		ArrayList<Track> list_2 = new ArrayList<Track>();//小于开始磁道号的磁道装入该表
		for (int i = 0; i < unfinishedList.size(); i++) {
			if (unfinishedList.get(i).num >= startNum) {
				list_1.add(unfinishedList.get(i));
			} else {
				list_2.add(unfinishedList.get(i));
			}
		}
		numSort_1(list_1);//小到大排序
		numSort_1(list_2);//小到大排序
		int preNum = startNum;
		while (list_1.isEmpty() == false) {
			list_1.get(0).distance = Math.abs(list_1.get(0).num - preNum);
			preNum = list_1.get(0).num;
			finishedList.add(list_1.get(0));
			list_1.remove(list_1.get(0));
		}
		while (list_2.isEmpty() == false) {
			list_2.get(0).distance = Math.abs(list_2.get(0).num - preNum);
			preNum = list_2.get(0).num;
			finishedList.add(list_2.get(0));
			list_2.remove(list_2.get(0));
		}
		double sum = 0;
		for (int i = 0; i < finishedList.size(); i++) {
			sum += finishedList.get(i).distance;
		}
		averDistance = sum / finishedList.size();
	}

	//CSCAN,磁头移动方向始终为由外向里
	public static void cscan_2(ArrayList<Track> unfinishedList, int startNum) {
		ArrayList<Track> list_1 = new ArrayList<Track>();//小于开始磁道号的磁道装入该表
		ArrayList<Track> list_2 = new ArrayList<Track>();//大于开始磁道号的磁道装入该表
		for (int i = 0; i < unfinishedList.size(); i++) {
			if (unfinishedList.get(i).num <= startNum) {
				list_1.add(unfinishedList.get(i));
			} else {
				list_2.add(unfinishedList.get(i));
			}
		}
		numSort_2(list_1);//大到小排序
		numSort_2(list_2);//大到小排序
		int preNum = startNum;
		while (list_1.isEmpty() == false) {
			list_1.get(0).distance = Math.abs(list_1.get(0).num - preNum);
			preNum = list_1.get(0).num;
			finishedList.add(list_1.get(0));
			list_1.remove(list_1.get(0));
		}
		while (list_2.isEmpty() == false) {
			list_2.get(0).distance = Math.abs(list_2.get(0).num - preNum);
			preNum = list_2.get(0).num;
			finishedList.add(list_2.get(0));
			list_2.remove(list_2.get(0));
		}
		double sum = 0;
		for (int i = 0; i < finishedList.size(); i++) {
			sum += finishedList.get(i).distance;
		}
		averDistance = sum / finishedList.size();
	}

	// 磁道号从小到大排序
	public static void numSort_1(ArrayList<Track> list) {
		for (int i = 0; i < list.size() - 1; i++)
			for (int j = i + 1; j < list.size(); j++) {
				if (list.get(i).num > list.get(j).num) {
					Track t = list.get(i);
					list.set(i, list.get(j));
					list.set(j, t);
				}
			}
	}

	// 磁道号 从大到小排序
	public static void numSort_2(ArrayList<Track> list) {
		for (int i = 0; i < list.size() - 1; i++)
			for (int j = i + 1; j < list.size(); j++) {
				if (list.get(i).num < list.get(j).num) {
					Track t = list.get(i);
					list.set(i, list.get(j));
					list.set(j, t);
				}
			}
	}
}

//磁道类
class Track {
	int num;//磁道号
	int distance;//磁道移动距离
	Track(int num) {
		this.num = num;
	}
}

Design.java

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextArea;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JRadioButton;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.awt.event.ActionEvent;
import java.awt.Color;
import javax.swing.UIManager;

public class Design extends JFrame {

	private int[] queue = new int[10];	//数组-队列
	private int startNum;
	private JPanel contentPane;		//窗体
	private JLabel lblStartTrack;	//显示文本
	private JLabel lblQueue;
	private JLabel lblNextTrack;
	private JLabel lblDistance;
	private JLabel lblSelect;
	private JLabel lblAverDistance;
	private JTextArea taStartTrack;		//文本框
	private JTextArea taQueue;
	private JTextArea taNextTrack;
	private JTextArea taDistance;
	private JTextArea taAverDistance;
	private JButton btnReset;		//按钮
	private JButton btnRandom;
	private JButton btnQuit;
	private JButton btnCommit;
	private JRadioButton rdbtnFCFS;		//先来先服务算法
	private JRadioButton rdbtnSSTF;		//最短寻道时间优先算法
	private JRadioButton rdbtnSCAN_1;		//扫描(自里向外)
	private JRadioButton rdbtnCSCAN_1;		//循环扫描(自里向外)
	private JRadioButton rdbtnSCAN_2;		//扫描(自外向里)
	private JRadioButton rdbtnCSCAN_2;		//循环扫描(自外向里)
	private ButtonGroup gb;		//按钮组
	private ImageIcon icon;		//背景图片
	private JLabel lblBackground;		//将背景图片添加到布局

	public Design() {

		setTitle("磁盘调度");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		//单击窗口的关闭按钮时执行的操作
		setBounds(500, 50, 410, 650);		//窗口初始位置

		contentPane = new JPanel();
		setContentPane(contentPane);
		contentPane.setLayout(null);	//no flowLayout
		contentPane.setOpaque(false);	//set control no lucency

		lblStartTrack = new JLabel("开始磁道号:");
		lblStartTrack.setBounds(33, 10, 70, 21);
		contentPane.add(lblStartTrack);

		lblQueue = new JLabel("请求队列");
		lblQueue.setBounds(33, 29, 66, 21);
		contentPane.add(lblQueue);

		lblNextTrack = new JLabel("被访问的下一磁道号");
		lblNextTrack.setBounds(143, 32, 130, 15);
		contentPane.add(lblNextTrack);

		lblDistance = new JLabel("移动距离");
		lblDistance.setBounds(304, 32, 54, 15);
		contentPane.add(lblDistance);

		lblSelect = new JLabel("请选择一种算法:");
		lblSelect.setBounds(10, 311, 121, 21);
		contentPane.add(lblSelect);

		lblAverDistance = new JLabel("平均寻道长度:");
		lblAverDistance.setBounds(164, 10, 86, 21);
		contentPane.add(lblAverDistance);

		taStartTrack = new JTextArea();
		taStartTrack.setBounds(106, 10, 48, 20);
		taStartTrack.setBackground(Color.lightGray);
		taStartTrack.setEditable(false);
		contentPane.add(taStartTrack);

		taQueue = new JTextArea();
		taQueue.setBounds(47, 60, 39, 184);
		taQueue.setBackground(Color.LIGHT_GRAY);
		taQueue.setEditable(false);
		contentPane.add(taQueue);

		taNextTrack = new JTextArea();
		taNextTrack.setBounds(181, 57, 55, 184);
		taNextTrack.setBackground(Color.LIGHT_GRAY);
		taNextTrack.setEditable(false);
		contentPane.add(taNextTrack);

		taDistance = new JTextArea();
		taDistance.setBounds(314, 57, 39, 184);
		taDistance.setBackground(Color.LIGHT_GRAY);
		taDistance.setEditable(false);
		contentPane.add(taDistance);

		taAverDistance = new JTextArea();
		taAverDistance.setBounds(253, 10, 130, 21);
		taAverDistance.setBackground(Color.lightGray);
		taAverDistance.setEditable(false);
		contentPane.add(taAverDistance);

		btnReset = new JButton("重置");
		btnReset.addActionListener(new ActionListener() {	//点击事件
			public void actionPerformed(ActionEvent e) {
				taStartTrack.setText(null);
				taAverDistance.setText(null);
				taQueue.setText(null);
				taNextTrack.setText(null);
				taDistance.setText(null);
				btnCommit.setEnabled(false);
			}
		});
		btnReset.setBounds(10, 278, 93, 23);
		contentPane.add(btnReset);

		btnRandom = new JButton("随机初始化");
		btnRandom.addActionListener(new ActionListener() {	//点击事件,添加数据
			public void actionPerformed(ActionEvent e) {
				taStartTrack.setText(null);
				taAverDistance.setText(null);
				taQueue.setText(null);
				taNextTrack.setText(null);
				taDistance.setText(null);
				btnCommit.setEnabled(true);
				for (int i = 0; i < 10; i++) {		//入栈,且无重复
					queue[i] = (int) (Math.random() * 100);
					for (int j = 0; j < i; j++) {
						while (queue[i] == queue[j]) {
							queue[i] = (int) (Math.random() * 100);
						}
					}
				}
				startNum = (int)(Math.random() * 100);
				for (int k = 0; k < 10; k++) {
					while (startNum == queue[k]) {
						startNum = (int) (Math.random() * 100);
					}
				}
				taStartTrack.append(String.valueOf(startNum));
				for (int h = 0; h < 10; h++) {
					taQueue.append(String.valueOf(queue[h]) + "\n");
				}
			}
		});
		btnRandom.setBounds(134, 278, 121, 23);
		contentPane.add(btnRandom);

		btnQuit = new JButton("退出");
		btnQuit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				System.exit(0);
			}
		});
		btnQuit.setBounds(290, 278, 93, 23);
		contentPane.add(btnQuit);

		rdbtnFCFS = new JRadioButton("先来先服务");
		rdbtnFCFS.setBounds(33, 338, 121, 23);
		rdbtnFCFS.setOpaque(false);
		contentPane.add(rdbtnFCFS);

		rdbtnSSTF = new JRadioButton("最短寻道时间优先");
		rdbtnSSTF.setBounds(208, 338, 150, 23);
		rdbtnSSTF.setOpaque(false);
		contentPane.add(rdbtnSSTF);

		rdbtnSCAN_1 = new JRadioButton("扫描(自里向外)");
		rdbtnSCAN_1.setBounds(33, 365, 132, 23);
		rdbtnSCAN_1.setOpaque(false);
		contentPane.add(rdbtnSCAN_1);

		rdbtnCSCAN_1 = new JRadioButton("循环扫描(自里向外)");
		rdbtnCSCAN_1.setBounds(208, 365, 159, 23);
		rdbtnCSCAN_1.setOpaque(false);
		contentPane.add(rdbtnCSCAN_1);

		rdbtnSCAN_2 = new JRadioButton("扫描(自外向里)");
		rdbtnSCAN_2.setBounds(33, 393, 132, 23);
		rdbtnSCAN_2.setOpaque(false);
		contentPane.add(rdbtnSCAN_2);

		rdbtnCSCAN_2 = new JRadioButton("循环扫描(自外向里)");
		rdbtnCSCAN_2.setBounds(210, 393, 173, 23);
		rdbtnCSCAN_2.setOpaque(false);
		contentPane.add(rdbtnCSCAN_2);

		gb = new ButtonGroup();
		gb.add(rdbtnFCFS);
		gb.add(rdbtnSSTF);
		gb.add(rdbtnSCAN_1);
		gb.add(rdbtnCSCAN_1);
		gb.add(rdbtnSCAN_2);
		gb.add(rdbtnCSCAN_2);

		btnCommit = new JButton("确定");
		btnCommit.setEnabled(false);
		btnCommit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (!rdbtnFCFS.isSelected() && !rdbtnSSTF.isSelected() && !rdbtnSCAN_1.isSelected()
						&& !rdbtnCSCAN_1.isSelected() && !rdbtnSCAN_2.isSelected() && !rdbtnCSCAN_2.isSelected()) {
					JOptionPane.showMessageDialog(btnRandom, "请选择一种算法!","提示",JOptionPane.ERROR_MESSAGE);
				} else {
					taNextTrack.setText(null);
					taDistance.setText(null);
					taAverDistance.setText(null);
					while (Algorithm.finishedList.isEmpty() == false) {
						Algorithm.finishedList.remove(0);
					}
					ArrayList<Track> list = new ArrayList<Track>();
					for (int i = 0; i < 10; i++) {
						list.add(new Track(queue[i]));
					}
					if (rdbtnFCFS.isSelected()) {
						Algorithm.fcfs(list, startNum);
					} else if (rdbtnSSTF.isSelected()) {
						Algorithm.sstf(list, startNum);
					} else if (rdbtnSCAN_1.isSelected()) {
						Algorithm.scan_1(list, startNum);
					} else if (rdbtnCSCAN_1.isSelected()) {
						Algorithm.cscan_1(list, startNum);
					} else if (rdbtnSCAN_2.isSelected()) {
						Algorithm.scan_2(list, startNum);
					} else if (rdbtnCSCAN_2.isSelected()) {
						Algorithm.cscan_2(list, startNum);
					}
					for (int j = 0; j < 10; j++) {
						taNextTrack.append(Algorithm.finishedList.get(j).num + "\n");
						taDistance.append(Algorithm.finishedList.get(j).distance + "\n");
					}
					taAverDistance.append(Algorithm.averDistance + "");
				}
			}
		});
		btnCommit.setBounds(143, 433, 93, 23);
		contentPane.add(btnCommit);

		icon = new ImageIcon("background.jpg");
		lblBackground = new JLabel(icon);
		lblBackground.setBounds(0, 0, icon.getIconWidth(), icon.getIconHeight());
		contentPane.add(lblBackground);
	}
}
发布了98 篇原创文章 · 获赞 148 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_40310148/article/details/103705460