?? firstfit.java
字號:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
/*
*
* 首次適應算法
* 算法概述:分配內存時,從鏈首開始順序查找,找到滿足的空閑分區則劃出空間分配,余下的空閑空間仍保留在空閑鏈表中
* 實現方法:分配時從數組第一個元素開始比較,若符合條件則將該元素減去對應作業的值
*
*/
public class FirstFit extends JFrame implements MouseListener {
JTextPane t = new JTextPane();
JPanel p = new JPanel();
public FirstFit(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);
add.printF(f, t);
int freeLength = f.length;
// 以下為界面代碼
JScrollPane sp = new JScrollPane(t);
p.setLayout(new GridLayout(1, 1));
p.add(sp);
t.addMouseListener(this);
t.setBackground(Color.yellow);
add(p);
setLocation(20, 20);
setSize(350, 250);
setVisible(true);
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++){//以作業數組長度作為循環次數
int n=0;
for(int j=0;j<f.length;j++){//與各個空閑分區進行比較
add.insert(" [" + a[i] + "] 與分區號為" + f[j].m1 + "的空閑分區 ["
+ f[j].m2 + "] 比較,"+"\n", t);
if(a[i]<f[j].m2){//分區大于作業
add.insert("符合,分配" + "\n", t);
mem[] nb=new mem[b.length+1];
int ni=f[j].m1;
if(f[j].m1==1){//如果該空閑分區是內存表頭
nb[0]=new mem(1,a[i],0,1);
nb[1]=new mem(2,f[j].m2-a[i],a[i],0);
for(int k=2;k<nb.length;k++){
nb[k]=new mem(nb[k-1].m1+1,b[k-1].m2,nb[k-1].m2+nb[k-1].m3,b[k-1].m4);
}
b=nb;
Test.print(b, t);
f = mem.lian1(b);
add.printF(f, t);
freeLength = f.length;
}else{//如果該空閑分區不是內存表頭
for(int k=0;k<ni;k++){
nb[k]=new mem(b[k].m1,b[k].m2,b[k].m3,b[k].m4);
}
nb[ni-1].m2=a[i];
nb[ni-1].m4=1;
nb[ni]=new mem(nb[ni-1].m1+1,f[j].m2-a[i],nb[ni-1].m2+nb[ni-1].m3,0);
for(int k=ni+1;k<nb.length;k++){
nb[k]=new mem(nb[k-1].m1+1,b[k-1].m2,nb[k-1].m2+nb[k-1].m3,b[k-1].m4);
}
b=nb;
Test.print(b, t);
f = mem.lian1(b);
add.printF(f, t);
freeLength = f.length;
}
break;
}else{
if(a[i]==f[j].m2){//分區等于作業
add.insert2(" 符合,分配" + "\n", t);
b[f[j].m1-1].m4=1;
Test.print(b, t);
f = mem.lian1(b);
add.printF(f, t);
freeLength = f.length;
break;
}else{//分區小于作業,將指示不符合次數的n加一
n++;
}
}
if(n==f.length){//如果不符合次數為空閑分區數組長度,說明找遍空閑分區都無符合項
add.insert2(" 無符合分區" + "\n", t);
sav[notIndex]=a[i];
notIndex++;
}
}
}
// 若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 + -