📄 allocatememoryblock.java
字号:
package com.ysu.cwy;
import java.util.List;
public class AllocateMemoryBlock {
private List<MemoryBlock> memoryFreeBlockList=null; //空闲链
private List<MemoryBlock> memoryBlockInUseList=null; //使用链
private int point; //记录下一次分配开始的位置
private boolean secondAllocation; //是否是内存初始化后的第一次内存分配
private MemoryInit memoryInit=null; //内存初始化
//构造函数
public AllocateMemoryBlock(List<MemoryBlock> memoryFreeBlockList, List<MemoryBlock> memoryBlockInUseList,MemoryInit memoryInit) {
this.memoryFreeBlockList = memoryFreeBlockList;
this.memoryBlockInUseList = memoryBlockInUseList;
point=0;
secondAllocation=true;
this.memoryInit=memoryInit;
}//end method AllocateMemoryBlock
/**
* @function 为进程分配内存
* @param process 请求分配内存的进程
* @return true 分配成功
* @return false 分配不成功
*/
public synchronized boolean AllocateOneMemoryBlock(Process process){
int maxId=getMaxBlockId();
int processMemoryNeed=process.getMemorySizeNeed();
int flag=point;
MemoryBlock memoryFreeBlock=null;
MemoryBlock memoryNeedUseBlock=new MemoryBlock();
for(int i=0;i<memoryFreeBlockList.size();i++){
if(secondAllocation){
memoryFreeBlock=memoryFreeBlockList.get(i);
}else{
memoryFreeBlock=memoryFreeBlockList.get(++point);
}
if(processMemoryNeed>memoryFreeBlock.getBlockSize()){
if(point==(memoryFreeBlockList.size()-1)){
point=0;
}else{
point++;
}
if(point==flag){
//在内存空闲链表中循环一圈后,没有合适内存空间,分配失败。
secondAllocation=false;
return false;
}
}else{
secondAllocation=false;
break;
}
}
memoryFreeBlock=memoryFreeBlockList.get(point);
if(processMemoryNeed==memoryFreeBlock.getBlockSize()){
memoryNeedUseBlock.setBlockId(maxId+1);
memoryNeedUseBlock.setBlockEndPlace(memoryFreeBlock.getBlockEndPlace());
memoryNeedUseBlock.setBlockStartPlace(memoryFreeBlock.getBlockStartPlace());
memoryNeedUseBlock.setBlockSize(processMemoryNeed);
memoryNeedUseBlock.setFullBlock(true);
memoryFreeBlockList.remove(point);
}else{
memoryNeedUseBlock.setBlockStartPlace(memoryFreeBlock.getBlockStartPlace());
memoryNeedUseBlock.setBlockEndPlace(memoryFreeBlock.getBlockStartPlace()+processMemoryNeed-1);
memoryNeedUseBlock.setBlockSize(processMemoryNeed);
memoryNeedUseBlock.setBlockId(maxId+1);
int memoryStartPlace=memoryFreeBlock.getBlockStartPlace()+processMemoryNeed;
memoryFreeBlock.setBlockStartPlace(memoryStartPlace);
memoryFreeBlock.setBlockSize(memoryFreeBlock.getBlockSize()-processMemoryNeed);
memoryFreeBlockList.remove(point);
memoryFreeBlockList.add(point, memoryFreeBlock);
}
memoryNeedUseBlock.setProcessId(process.getProcessID());
memoryNeedUseBlock.setBlockStatus(true);
memoryBlockInUseList.add(memoryNeedUseBlock);
return true;
}//end method AllocateOneMemoryBlock
/**
* @function 获得所有内存块中最大的ID
* @return ID
*/
public int getMaxBlockId(){
int index;
int memoryFreeBlockListMaxIndex=0;
int memoryBlockInUseListMaxIndex=0;
for(int i=0;i<memoryFreeBlockList.size();i++){
index=memoryFreeBlockList.get(i).getBlockId();
if(memoryFreeBlockListMaxIndex<=index){
memoryFreeBlockListMaxIndex=index;
}
}
for(int i=0;i<memoryBlockInUseList.size();i++){
index=memoryBlockInUseList.get(i).getBlockId();
if(memoryBlockInUseListMaxIndex<=index){
memoryBlockInUseListMaxIndex=index;
}
}
index=memoryFreeBlockListMaxIndex>=memoryBlockInUseListMaxIndex?memoryFreeBlockListMaxIndex:memoryBlockInUseListMaxIndex;
return index;
}//end method getMaxBlockId
/**
* @function 获得内存使用率
* @return 内存使用率
*/
public float getMemoryUsedRate(){
float memoryUsedRate=0;
int usedBlocksSize=0;
MemoryBlock memoryBlock=null;
for(int i=0;i<memoryBlockInUseList.size();i++){
memoryBlock=memoryBlockInUseList.get(i);
usedBlocksSize+=memoryBlock.getBlockSize();
}
memoryUsedRate=(float)usedBlocksSize/(float)memoryInit.getMemorySize();
memoryUsedRate*=100;
return memoryUsedRate;
}//end method getMemoryUsedRate
/**
* @function 获得已使用内存的总合
* @return 已使用内存的总合
*/
public int getSumUsedMemory(){
int sum=0;
for(int i=0;i<memoryBlockInUseList.size();i++){
MemoryBlock memoryBlock=memoryBlockInUseList.get(i);
sum+=memoryBlock.getBlockSize();
}
return sum;
}//end method getSumUsedMemory
/**
* @function 获得空闲内存的总合
* @return 空闲内存的总合
*/
public int getSumFreeMemory(){
return memoryInit.getMemorySize()-getSumUsedMemory();
}//end method getSumFreeMemory
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -