⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 allocatememoryblock.java

📁 java内存分配演示程序
💻 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 + -