?? worstfit.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 + -