⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 worstfit.java

📁 操作系统-动态分区分配算法 操作系统-动态分区分配算法
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

/*
 * 最坏适应算法
 * 算法概述:每次为作业分配内存时,总是挑选一个最大的空闲分区分割给作业使用
 * 实现方法:算法与最佳适应算法几乎相同,仅在排序时把空闲分区表按从大到小的顺序排列,所以未作详细注释
 * 
 */

public class WorstFit extends JFrame implements MouseListener {
	JTextPane t = new JTextPane();
	JPanel p = new JPanel();

	// 把空闲分区表按从小到大的顺序排列的方法

	public WorstFit(int[] ai, mem[] bi) {

		// 为避免改变传递进来的数组值,影响操作,新建两个相同的数组
		int la = ai.length, lb = bi.length;
		int[] a = new int[la];
		mem[] b = new mem[lb];
		for (int i = 0; i < la; i++) {
			a[i] = ai[i];
		}
		for (int i = 0; i < lb; i++) {
			b[i] = bi[i];
		}
		add.printJ(a, t);
		add.insert2(" 内存分区初始状态:" + "\n", t);
		Test.print(b, t);

		mem[] f = mem.lian1(b);
		mem.px2(f);
		add.printF(f, t);
		int freeLength = f.length;

		// 以下为界面代码
		// 界面主体仅为一个TextArea,内容为程序运行时所输出
		JScrollPane sp = new JScrollPane(t);

		p.setLayout(new GridLayout(1, 1));
		p.add(sp);
		t.addMouseListener(this);
		t.setBackground(Color.yellow);
		add(p);
		setSize(350, 250);
		setVisible(true);
		setLocation(60, 40);
		setTitle("最坏适应算法");

		// 从这里开始是算法的主要代码
		// notIndex用于记录无法找到匹配分区的作业数,数组sav的长度与a相同,用于存储无法分配的作业
		int notIndex = 0;
		int[] sav = new int[a.length];

		if (freeLength == 0) {// 若无空闲分区则不进行后面的运算
			add.insert("内存中无空闲分区" + "\n", t);
		} else {
			// 将各个作业与空闲分区比较
			for (int i = 0; i < a.length; i++) {
				add.insert("\n", t);
				// 定义n用于记录不符合的次数
				int n = 0;
				add.insert(" - - - - - - - - - - - - - - - - - - - - - - - - -"
						+ "\n", t);
				// 此循环将本次的作业与空闲分区比较
				for (int j = 0; j < f.length; j++) {
					add.insert(" [" + a[i] + "] 与分区号为" + f[j].m1 + "的空闲分区 ["
							+ f[j].m2 + "] 比较,", t);
					if (a[i] <= f[j].m2) {// 假如作业小于空闲分区,则可分配
						add.insert("符合,分配" + "\n", t);
						// 数组对应元素减去作业大小,即表示分配后的大小

						int x = f[j].m1 - 1;
						mem[] nb = new mem[b.length + 1];
						for (int k = 0; k < x; k++) {
							nb[k] = b[k];
						}
						int size = b[x].m2 - a[i];
						nb[x] = b[x];
						nb[x].m2 = a[i];
						nb[x].m4 = 1;
						nb[x + 1] = new mem(nb[x].m1 + 1, size, nb[x].m2
								+ nb[x].m3, 0);
						for (int k = x + 2; k < nb.length; k++) {
							nb[k] = b[k - 1];
							nb[k].m1 += 1;
						}
						b = new mem[nb.length];
						for (int k = 0; k < nb.length; k++) {
							b[k] = nb[k];
						}

						Test.print(b, t);

						f = mem.lian1(b);
						mem.px2(f);
						add.printF(f, t);
						freeLength = f.length;

						// 得到分配,结束此作业比较循环
						break;
					} else {
						n++;// 每不符一次把n加1
						add.insert("不符,往下找" + "\n", t);
					}

				}
				if (n == freeLength) {// 假如n等于空闲数组的长度,则说明找遍空闲分区都无符合项
					add.insert("\n", t);
					add.insert2(" 未找到符合的空闲分区" + "\n", t);
					add.insert("\n", t);
					if ((i + 1) < a.length) {// i+1<a.length表示以下信息不会出现在最后一次查找后
						add.insert(" 剩下的待分配作业大小为" + "\n", t);
						// 将a数组剩下的元素输出,即待分配的作业
						for (int j = (i + 1); j < a.length; j++) {
							add.insert(" [" + a[j] + "]", t);
						}
						add.insert("\n", t);
					}
					sav[notIndex] = a[i];
					notIndex++;

				} else {// 假如n不等于空闲数组的长度,则说明该次循环找到了可分配空间,于是输出两数组分配后的情况

					add.insert("\n", t);
					// 若不是最后一次分配,则显示剩下的待分配作业
					if ((i + 1) < a.length) {
						add.insert(" 剩下的待分配作业大小为" + "\n", t);
						for (int j = (i + 1); j < a.length; j++) {
							add.insert(" [" + a[j] + "]", t);
						}
						add.insert("\n", t);
					}
				}
				add.insert(" - - - - - - - - - - - - - - - - - - - - - - - - -"
						+ "\n", t);

			}
			// 若notIndex不为零,则sav数组中必存储了无法分配的作业,将它们输出
			if (notIndex != 0) {
				add.insert("\n", t);
				add.insert2(" 有以下大小的作业未得到分配:" + "\n", t);
				for (int i = 0; i < notIndex; i++) {
					add.insert(" [" + sav[i] + "]", t);
				}
				add.insert("\n", t);
				// 最后输出空闲分区链在完成所有操作后的情况
				add.insert2(" 内存分区状态:" + "\n", t);
				Test.print(b, t);
			} else {// 若notIndex为零,说明所有作业都得到分配
				add.insert2(" 所有作业分配完成", t);
			}

		}

	}

	public void mouseClicked(MouseEvent arg0) {
		// TODO 自动生成方法存根

	}

	public void mouseEntered(MouseEvent arg0) {
		// TODO 自动生成方法存根
		t.setBackground(Color.white);
	}

	public void mouseExited(MouseEvent arg0) {
		// TODO 自动生成方法存根

	}

	public void mousePressed(MouseEvent arg0) {
		// TODO 自动生成方法存根

	}

	public void mouseReleased(MouseEvent arg0) {
		// TODO 自动生成方法存根

	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -