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

📄 test.java

📁 操作系统-动态分区分配算法 操作系统-动态分区分配算法
💻 JAVA
字号:
import java.awt.Color;
import java.util.*;
import javax.swing.JTextPane;
import javax.swing.text.*;

//代表内存信息的类
class mem {// 每个类有四个属性,m1,m2,m3,m4分别代表分区号、大小、起址、状态(0表示未分配,1表示已分配)
	int m1, m2, m3, m4;

	public mem(int a, int b, int c, int d) {
		m1 = a;
		m2 = b;
		m3 = c;
		m4 = d;
	}

	public static mem[] lian1(mem[] m) {// 将空闲分区存入数组
		// 先用for循环统计空闲分区数
		int freeLength = 0;
		for (int i = 0; i < m.length; i++) {
			if (m[i].m4 == 0) {// 假如0则代表未分配,即空闲分区
				freeLength++;
			}
		}
		// 生成空的数组准备存入空闲分区信息
		mem[] f = new mem[freeLength];
		int k = 0;
		for (int i = 0; i < m.length; i++) {
			if (m[i].m4 == 0) {// 假如有未分配分区则存入数组
				f[k] = new mem(m[i].m1, m[i].m2, m[i].m3, m[i].m4);
				k++;
			}
		}
		return f;// 将空闲分区数组返回
	}

	// 将数组进行排序的方法,用于最佳及最坏适应算法的空闲分区排序
	public static void px1(mem[] f) {
		// 从小到大排序
		for (int i = 0; i < f.length; i++) {
			for (int j = (i + 1); j < f.length; j++) {
				if (f[j].m2 < f[i].m2) {
					mem x = f[i];
					f[i] = f[j];
					f[j] = x;
				}
			}
		}
	}

	public static void px2(mem[] f) {
		// 从大到小排序
		for (int i = 0; i < f.length; i++) {
			for (int j = (i + 1); j < f.length; j++) {
				if (f[j].m2 > f[i].m2) {
					mem x = f[i];
					f[i] = f[j];
					f[j] = x;
				}
			}
		}
	}
}

// TextPane中的字体显示方案
class add {
	String str;
	JTextPane t;

	public add() {

	}

	public static void insert(String str, JTextPane t) {// 输出黑色文本的方法
		Document docs = t.getDocument();// 利用getDocument()方法取得现时JTextPane的Document
		SimpleAttributeSet attrset = new SimpleAttributeSet();// 字体属性
		StyleConstants.setFontFamily(attrset, "宋体");// 字体类型
		StyleConstants.setForeground(attrset, Color.black);// 颜色
		StyleConstants.setBold(attrset, false);// 是否加粗
		StyleConstants.setItalic(attrset, false);// 是否斜体
		StyleConstants.setFontSize(attrset, 12);// 字体大小
		try {
			docs.insertString(docs.getLength(), str, attrset);// 将str插入到当前文本的最后
		} catch (BadLocationException ble) {
			System.out.println("BadLocationException:" + ble);
		}
	}

	public static void insert2(String str, JTextPane t) {// 输出红色文本的方法
		Document docs = t.getDocument();
		SimpleAttributeSet attrset = new SimpleAttributeSet();
		StyleConstants.setFontFamily(attrset, "宋体");
		StyleConstants.setForeground(attrset, Color.red);
		StyleConstants.setBold(attrset, false);
		StyleConstants.setItalic(attrset, false);
		StyleConstants.setFontSize(attrset, 12);
		try {
			docs.insertString(docs.getLength(), str, attrset);
		} catch (BadLocationException ble) {
			System.out.println("BadLocationException:" + ble);
		}
	}

	public static void insert3(String str, JTextPane t) {// 输出蓝色文本的方法
		Document docs = t.getDocument();
		SimpleAttributeSet attrset = new SimpleAttributeSet();
		StyleConstants.setFontFamily(attrset, "宋体");
		StyleConstants.setForeground(attrset, Color.BLUE);
		StyleConstants.setBold(attrset, false);
		StyleConstants.setItalic(attrset, false);
		StyleConstants.setFontSize(attrset, 12);
		try {
			docs.insertString(docs.getLength(), str, attrset);
		} catch (BadLocationException ble) {
			System.out.println("BadLocationException:" + ble);
		}
	}

	// 用于输出空闲分区链的方法
	public static void printF(mem[] f, JTextPane t) {
		add.insert(" -------  空闲分区链  --------" + "\n", t);// 调用add类的insert方法插入黑色文本
		add.insert(" 分区号  大小/KB  起址/KB" + "\n", t);
		for (int i = 0; i < f.length; i++) {// 用for循环将空闲分区数组依次输出
			String s1 = " " + f[i].m1 + "", s2 = " " + f[i].m2 + "", s3 = " "
					+ f[i].m3;
			// 以下if语句用于为字符串加空格,以避免排列不整齐
			if (f[i].m1 < 10) {
				s1 = " " + s1;
			}
			if (f[i].m2 < 10) {
				s2 = " " + s2;
			}
			if (f[i].m3 < 10) {
				s3 = "  " + s3;
			} else {
				if (f[i].m3 < 100) {
					s3 = " " + s3;
				}
			}
			String mes = "  " + s1 + "     " + s2 + "      " + s3;
			add.insert3(mes + "\n", t);
		}
		add.insert(" -----------------------------" + "\n", t);
	}

	// 显示随机数组创建结果的方法,供各个分配算法调用
	public static void printJ(int[] a, JTextPane t) {
		add.insert(" 随机创建了以下大小的待分配作业:" + "\n", t);
		// 通过for循环将传入的数组a中的元素一个个输出,a即代表等待作业大小的数组
		for (int i = 0; i < a.length; i++) {
			add.insert(" [" + a[i] + "]", t);
		}
		add.insert("\n", t);
	}

}

// Test类中提供多个常用方法供其他类调用
public class Test {

	// 下面是输出所有内存分区状态的方法,类似于printF
	public static void print(mem[] spaces, JTextPane t) {
		add.insert(" --------------------------------" + "\n", t);
		add.insert(" 分区号  大小/KB  起址/KB   状态" + "\n", t);
		for (int i = 0; i < spaces.length; i++) {
			String s1 = " " + spaces[i].m1 + "", s2 = " " + spaces[i].m2 + "", s3 = " "
					+ spaces[i].m3 + "", s4;
			if (spaces[i].m1 < 10) {
				s1 = "  " + s1;
			} else {
				if (spaces[i].m1 < 100) {
					s1 = " " + s1;
				}
			}
			if (spaces[i].m2 < 10) {
				s2 = "  " + s2;
			} else {
				if (spaces[i].m2 < 100) {
					s2 = " " + s2;
				}
			}
			if (spaces[i].m3 < 10) {
				s3 = "  " + s3;
			} else {
				if (spaces[i].m3 < 100) {
					s3 = " " + s3;
				}
			}
			if (spaces[i].m4 == 0) {// 该类第四个属性若为零则代表未分配
				s4 = "未分配";
			} else {
				s4 = "已分配";
			}
			String mes = " " + s1 + "     " + s2 + "     " + s3 + "    " + s4;
			if (spaces[i].m4 == 0) {
				add.insert3(mes + "\n", t);
			} else {
				add.insert2(mes + "\n", t);
			}

		}
		add.insert(" --------------------------------" + "\n", t);
	}

	// build为随机创建内存分区状态的方法
	public static mem[] build() {
		int sum = 0, index = 0;
		// 创建一个足够大的数组存放随机生成的数,用于生成各个分区的大小,假定内存为256K
		int[] spa = new int[255];
		Random r = new Random();
		for (int i = 0; i < 255; i++) {
			int space = r.nextInt(99) + 1;// 使每个分区大小不超过100,以增多分区数
			sum += space;
			if (sum > 255) {// 假如已超过内存容量,则直接将内存大小减去之前已生成的内存大小总和,表示最后一个分区
				spa[i] = 256 - (sum - space);
				index++;
				break;
			} else {// 否则存入spa数组
				spa[i] = space;
				index++;
			}
		}
		//
		mem[] spaces = new mem[index];
		int j = 0;
		for (int i = 0; i < index; i++) {
			int allocate = r.nextInt(2);// 随机生成是否已分配的状态(0,1)
			spaces[i] = new mem(i + 1, spa[i], j, allocate);
			j += spa[i];// 起址为前一个元素的起址加上前一个元素的大小,j初始为0,供给第一个分区
		}
		return spaces;// 将此生成的分区信息数组返回
	}

}

⌨️ 快捷键说明

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