資源簡介
模擬計算機主存儲器空間的分配和回收,設計一個在可變分區管理方式下的最先適應分配算法的的分配與回收程序。
代碼片段和文件信息
import?java.util.Scanner;
class?MemoryUnit{
????public?boolean?state?=?false;//內存單元的狀態(0表示已使用?1表示未使用)?
}
class?Memory{
????public?MemoryUnit[]?memories;//表示內存大小
????
????Memory(int?n){
????//初始化內存大小
????????memories?=?new?MemoryUnit[n];
????????for?(int?i?=?0;?i?????????????memories[i]?=?new?MemoryUnit();
????????}
????}
}
class?FirstFit{//采用最先使用算法對內存進行分配
????public?Memory?memory;
????public?int?mSize;//表示內存大小
????public?Job[]?jobs;
????public?FirstFit(int?mSize?Memory?memory?Job[]?jobs){
????????this.mSize?=?mSize;
????????this.memory?=?memory;
????????this.jobs?=?jobs;
????}
????
????public?void?alloc(int?jOrder){//為job分配內存
????????int?i?j?k?count;
????????for?(i?=?0;?i?????????//先遍歷整個內存尋找最先適應的內存區域,將job裝載進內存
????????????if(memory.memories[i].state?==?false){
????????????//找到未被占用的第一個內存地址,并計算從這個地址開始連續單元長度
????????????//判斷大小是否可以裝載進job
????????????????count?=?0;
????????????????for?(j?=?i;?j?????????????????????if(memory.memories[j].state?==?true){
????????????????????????break;
????????????????????}
????????????????????count++;??
????????????????}
????????????????if(count?>=?jobs[jOrder].len){
????????????????????System.out.println(“~~~~第“?+?jOrder?+?“個job分配成功!~~~~“);
????????????????????System.out.println();
????????????????????jobs[jOrder].state?=?true;
????????????????????jobs[jOrder].start?=?i;//設置job在內存中的起始單元
????????????????//連續的內存單元長度大于job長度?可以裝載進去
????????????????????for(k?=?i;?k?????????????????????????memory.memories[k].state?=?true;
????????????????????}
????????????????????emptyMemory();
????????????????}
????????????????
????????????????//i從j的地址開始繼續循環
????????????????i?=?j;
????????????}
????????}
????????if?(jobs[jOrder].state?==?false){
????????????System.out.println(jOrder?+?“~~~~分配失敗!~~~~“);
????????}?
????}
????public?void?back(int?jOrder){//釋放job所占用的內存
????????int?i?j?endLocation?=?0;
????????boolean?flag?=?false;//用來標記是否找到了下一個job
????????//回收的時候只能回收到下一個job的起始位置
????????for(i?=?jobs[jOrder].start?+?1;?i?????????????endLocation?=?0;
????????????for?(j?=?0;?j?????????????????//遍歷每一個job?尋找在內存中當前job的下一個job
????????????????if?(jobs[j].start?==?i?&&?j?!=?jOrder){
????????????????????endLocation?=?jobs[j].start--;
????????????????????flag?=?true;
????????????????????break;//跳出內循環
????????????????}???
????????????}
????????????
????????????if(flag?==?true){//如果找到了下一個job
????????????????i?=?mSize;
????????????}
????????}
?????????//判斷endlocation是否超出當前job的地址范圍
????????if(endLocation?>?jobs[jOrder].start?+?jobs[jOrder].len?-?1){
????????????endLocation?=?jobs[jOrder].start?+?jobs[jOrder].len;
????????}
????????for?(i?=?jobs[jOrder].start;?i?????????????memory.memories[i].state?=?false;
????????}
????????System.out.println(“~~~~回收成功~~~~“);
????????emptyMemory();
????}
????public?void?emptyMemory(){//打印出當前空閑的內存單元區域
????????int?i?j?k?count;
????????System.out.println(“<======空閑的內存區域======>“);
??
評論
共有 條評論