?? quickfit.java
字號:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/*
* 快速適應(yīng)算法
* 算法概述:將空閑分區(qū)按容量大小進行分類,為每一類具有相同容量的空閑分區(qū)單獨設(shè)立一個空閑分區(qū)鏈表,
* 分配時僅根據(jù)線程長度尋找能容納它的最小空閑分區(qū)
* 實現(xiàn)方法:由于元素少,所以很難出現(xiàn)相同的數(shù)值,于是改為將數(shù)值接近的元素分為一組(以10為單位分類),
* 分配時將大于該作業(yè)的一組元素中最小的一個分配出來
*
*/
public class QuickFit extends JFrame implements MouseListener {
JTextPane t = new JTextPane();
JPanel p = new JPanel();
// 定義一個二維數(shù)組用于存儲分組后的元素,二維數(shù)組可實現(xiàn)按元素所在行而分辨出它所在的組
mem[][] aa;
// m表示分組后最長組的數(shù)組長度,index用于指示未得到分配的作業(yè)存入c的位置
int m, index;
// c用于存儲未得到分配的作業(yè),構(gòu)造方法中將它的長度設(shè)為與作業(yè)數(shù)組長度相同
int[] c;
// 通過count方法統(tǒng)計各個分組的大小,然后以最大的長度作為二維數(shù)組aa的列數(shù)
public void count(mem[] b) {
int i0 = 0, i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0;
// 通過switch語句把所有空閑分區(qū)分組的大小確定
for (int i = 0; i < b.length; i++) {
if (b[i].m4 == 0) {
switch (b[i].m2 / 10) {
case 0: {
i0++;
break;
}
case 1: {
i1++;
break;
}
case 2: {
i2++;
break;
}
case 3: {
i3++;
break;
}
case 4: {
i4++;
break;
}
case 5: {
i5++;
break;
}
case 6: {
i6++;
break;
}
case 7: {
i7++;
break;
}
case 8: {
i8++;
break;
}
default: {
i9++;
break;
}
}
}
}
m = Math.max(Math.max(Math.max(Math.max(Math.max(Math.max(Math.max(Math
.max(Math.max(i0, i1), i2), i3), i4), i5), i6), i7), i8), i9);
aa = new mem[10][m];
}
// 分組存數(shù)據(jù),即給二維數(shù)組aa的對應(yīng)位置賦值
// 通過i0~i9幾個數(shù)起到指針的作用,將各組元素依次存入對應(yīng)位置
public void create(mem[] b) {
int i0 = 0, i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0;
for (int i = 0; i < b.length; i++) {
if (b[i].m4 == 0) {
switch (b[i].m2 / 10) {
case 0: {
aa[0][i0] = b[i];
i0++;
break;
}
case 1: {
aa[1][i1] = b[i];
i1++;
break;
}
case 2: {
aa[2][i2] = b[i];
i2++;
break;
}
case 3: {
aa[3][i3] = b[i];
i3++;
break;
}
case 4: {
aa[4][i4] = b[i];
i4++;
break;
}
case 5: {
aa[5][i5] = b[i];
i5++;
break;
}
case 6: {
aa[6][i6] = b[i];
i6++;
break;
}
case 7: {
aa[7][i7] = b[i];
i7++;
break;
}
case 8: {
aa[8][i8] = b[i];
i8++;
break;
}
default: {
aa[9][i9] = b[i];
i9++;
break;
}
}
}
}
}
// 快速適應(yīng)算法分組的顯示方法
public void print(mem[][] a, JTextPane t) {
add.insert(" - - - - - - - - - - - - - - - - - - - - - - -" + "\n", t);
add.insert(" 空閑分區(qū)分組如下所示:", t);
// 使用for循環(huán)將各組元素依次輸出,即輸出二維數(shù)組中各行的非零元素
add.insert("\n" + " 1~ 9: ", t);
if (a[0][0] != null) {// 假如第一位非零,則說明該組元素非空
int i = 0;
while (i < m && a[0][i] != null) {// 將在數(shù)組長度范圍內(nèi)的非零元素輸出
add.insert3(" [" + a[0][i].m2 + "]", t);
i++;
}
}
add.insert("\n" + " 10~19: ", t);
if (a[1][0] != null) {
int i = 0;
while (i < m && a[1][i] != null) {
add.insert3(" [" + a[1][i].m2 + "]", t);
i++;
}
}
add.insert("\n" + " 20~29: ", t);
if (a[2][0] != null) {
int i = 0;
while (i < m && a[2][i] != null) {
add.insert3(" [" + a[2][i].m2 + "]", t);
i++;
}
}
add.insert("\n" + " 30~39: ", t);
if (a[3][0] != null) {
int i = 0;
while (i < m && a[3][i] != null) {
add.insert3(" [" + a[3][i].m2 + "]", t);
i++;
}
}
add.insert("\n" + " 40~49: ", t);
if (a[4][0] != null) {
int i = 0;
while (i < m && a[4][i] != null) {
add.insert3(" [" + a[4][i].m2 + "]", t);
i++;
}
}
add.insert("\n" + " 50~59: ", t);
if (a[5][0] != null) {
int i = 0;
while (i < m && a[5][i] != null) {
add.insert3(" [" + a[5][i].m2 + "]", t);
i++;
}
}
add.insert("\n" + " 60~69: ", t);
if (a[6][0] != null) {
int i = 0;
while (i < m && a[6][i] != null) {
add.insert3(" [" + a[6][i].m2 + "]", t);
i++;
}
}
add.insert("\n" + " 70~79: ", t);
if (a[7][0] != null) {
int i = 0;
while (i < m && a[7][i] != null) {
add.insert3(" [" + a[7][i].m2 + "]", t);
i++;
}
}
add.insert("\n" + " 80~89: ", t);
if (a[8][0] != null) {
int i = 0;
while (i < m && a[8][i] != null) {
add.insert3(" [" + a[8][i].m2 + "]", t);
i++;
}
}
add.insert("\n" + " 90~99: ", t);
if (a[9][0] != null) {
int i = 0;
while (i < m && a[9][i] != null) {
add.insert3(" [" + a[9][i].m2 + "]", t);
i++;
}
}
add.insert("\n", t);
}
// select方法用于確定將哪個空閑分區(qū)分配給作業(yè)
public void select(int a, mem[] b) {
// 將作業(yè)大小除以十可知該作業(yè)屬十組中哪一組,而比該組大的組中的元素肯定可以分配給它,以此作為算法
int n = a / 10;
// 由于使用的算法決定了無法分配大于90的作業(yè),所以以下循環(huán)中僅比較1~89的值,超過90直接認(rèn)定為無法分配
for (int i = n; i < 10; i++) {
if (n < 9 && i < 9) {// 僅在作業(yè)大小小于90以及未比較至最后一組空閑分區(qū)的情況下進行
if (aa[i + 1][0] != null) {// 若比該作業(yè)大的一組空閑空間數(shù)組頭位元素存在
add.insert2("\n" + " [" + aa[i + 1][0].m2 + "] 分配給 [" + a
+ "] " + "\n", t);
// 將該數(shù)組從第二位開始前移,末位設(shè)零,然后結(jié)束本次循環(huán)
for (int j = 0; j < m - 1; j++) {
aa[i + 1][j] = aa[i + 1][j + 1];
}
int xx = aa[i + 1][0].m1 - 1;
b[xx].m4 = 1;
aa[i + 1][m - 1] = null;
break;
} else {// 假如比該作業(yè)大的一組空閑空間數(shù)組頭位元素不存在,則再往上找
continue;
}
} else {// 假如作業(yè)大于90或者比較到最后(i=9)仍無合適空間,則輸出“無法分配”,并將index加一
c[index] = a;
add.insert2("\n" + " [" + a + "] 無法分配" + "\n", t);
index++;
}
}
}
// 構(gòu)造方法
public QuickFit(int[] ai, mem[] bi) {
// 為避免改變傳遞進來的數(shù)組值,影響操作,新建兩個相同的數(shù)組
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];
}
c = new int[a.length];
// 以下為界面代碼
JScrollPane sp = new JScrollPane(t);
p.setLayout(new GridLayout(1, 1));
p.add(sp);
t.addMouseListener(this);
t.setBackground(Color.yellow);
t.setEditable(false);
add(p);
setSize(350, 250);
setVisible(true);
setLocation(100, 60);
setTitle("快速適應(yīng)算法");
add.printJ(a, t);
add.insert2(" 內(nèi)存分區(qū)初始狀態(tài):" + "\n", t);
Test.print(b, t);
// 調(diào)用分組的方法生成一個空的二維數(shù)組
count(b);
// 將二維數(shù)組對應(yīng)位置逐一賦值
create(b);
// 調(diào)用顯示分組結(jié)果的方法
print(aa, t);
// 使用循環(huán)依次將作業(yè)按select方法分配
for (int i = 0; i < a.length; i++) {
int cc = 0;
for (int j = 0; j < 10; j++) {
if (aa[j][0] == null) {
cc++;
}
if (cc == 10) {
add.insert2(" 內(nèi)存中已無空閑分區(qū)" + "\n", t);
break;
}
}
select(a[i], b);
add.insert(" - - - - - - - - - - - - - - - - - - - - - - -" + "\n",
t);
add.insert("\n", t);
print(aa, t);
}
add.insert("\n", t);
if (c[0] != 0) {// 若未分配作業(yè)數(shù)組非空
add.insert2(" 以下作業(yè)未得到分配:" + "\n", t);
for (int i = 0; i < c.length; i++) {
if (c[i] != 0) {// 輸出非零元素
add.insert(" [" + c[i] + "]", t);
}
}
} else {// 如果未分配作業(yè)數(shù)組為空,則輸出"所有作業(yè)分配完成"
add.insert2(" 所有作業(yè)分配完成" + "\n", t);
}
add.insert2("\n" + " 內(nèi)存最終狀態(tài):" + "\n", t);
Test.print(b, 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 自動生成方法存根
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -