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

📄 memorymanager.java

📁 这是一份标准的课程设计文档
💻 JAVA
字号:
package Manager;
import memory.*;
import myException.*;
import Global.*;

public class MemoryManager
{
	private static PageTable	PAGETABLES[];
	private static int		TABLE_ID[];
	private static int 		TABLE_SIZE;
	private static boolean 		TABLE_USED[];
	private static boolean		firstRun	=	true;
	//private static int 		PAGESIZE;
	private Manager.HardDiskManager	HDM;
	public MemoryManager()
	{
		if(firstRun)
		{
			TABLE_SIZE	=	Global.TABLECOUNTS;
			//PAGESIZE	=	5;
			TABLE_ID	=	new int[TABLE_SIZE];
			PAGETABLES	=	new PageTable[TABLE_SIZE];
			TABLE_USED	=	new boolean[TABLE_SIZE];
			HDM		=	new Manager.HardDiskManager();
			this.Init();	
			firstRun	=	false;
			
		}
	}
	private void Init()
	{
		for(int i=0;i<TABLE_SIZE;i++)
		{
			TABLE_ID[i]	=	0;
			TABLE_USED[i]	=	false;	
			PAGETABLES[i]	=	new PageTable();
		}
	}
	/***************************************************
	*功能描述:	对一个作业新建一个页表
	*参数说明:	id:作业ID
	****************************************************/
	public void newTable(int id)
		throws myException
	{
		if(this.getIndex(id)==-1)
		{
			int index	=	this.find();
			int HD_index	=	-1;
			String HD_data[]=	new String[Global.PAGE_SIZE];
			int HD_size	=	HDM.Size(HDM.GetIndex(id));
			if(index!=-1)
			{
				try
				{
					PAGETABLES[index].addNew(HD_size);
					TABLE_ID[index]		=	id;
					TABLE_USED[index]	=	true;
					
					//扫描页表,把虚拟硬盘的指令装入虚拟内存
					for(int i=0;i<Global.PAGES;i++)
					{
						if(PAGETABLES[index].getValue(i,3)==1)//判断页表该项是否为空
						{
							HD_index	=	PAGETABLES[index].getValue(i,1);
							for(int j=0;j<Global.PAGE_SIZE;j++)
							{
								if(HD_index+j<HD_size)
									HD_data[j]=HDM.Get(HDM.GetIndex(id),HD_index+j);
								else HD_data[j] = "NULL";
							}
							Global.MEMORY.insertPage(PAGETABLES[index].getValue(i,4),HD_data);
						}	
					}
				}
				catch(myException e)
				{
					throw new myException(" 没有足够内存创建作业页表!");
				}
			}
			else throw new myException("页表已分配完了!");
		}
		else throw new myException("内存中已经有该作业了,不可以再添加进去了");
	}
	/********************************************
	*功能描述:	找一个空的页表
	*返回值:	页表序号	-1:找不到空页表
	*********************************************/
	private int find()
	{
		for(int i=0;i<TABLE_SIZE;i++)
		{
			if(!TABLE_USED[i])
				return i;
		}	
		return -1;
	}
	/**********************************************
	*功能描述:	通过序号获得作业ID
	***********************************************/
	public int getID(int index)
	{
		return	TABLE_ID[index];
	}
	/**********************************************
	*功能描述:	通过作业ID获得序号
	***********************************************/
	public int getIndex(int id)
	{
		for(int i=0;i<TABLE_SIZE;i++)
		{
			if(TABLE_ID[i]==id)
				return i;
				
		}	
		return -1;
	}
	/**************************************************
	*功能描述:	通过硬盘地址得出内存中的地址
	*参数说明:	id:作业ID	HDAdd:硬盘中的地址
	*返回值:		内存中的地址
	**************************************************/
	public int	getMemAddress(int id,int HDAdd)
	{
		int sub;
		int index	=	this.getIndex(id);
		int[] add	=	new int[2];
		add[0]	=	-1;
		add[1]	=	-1;
		//add	=	PAGETABLES[index].getMemAdd(HDAdd);
		for(int i=0;i<Global.PAGES;i++)
		{
			sub	=	HDAdd	-	PAGETABLES[index].getValue(i,1);
			if(sub>=0&&sub<Global.PAGE_SIZE)
			{
				add[0]	=	PAGETABLES[index].getValue(i,4);
				add[1]	=	sub;
				break;
			}
		}
		//缺页
		if(add[0]==-1)
		{
			String	value[]	=	new String[Global.PAGE_SIZE];
			int tableIndex	=	PAGETABLES[index].find();
			desktop.Desktop.addTextToStateTextField("作业"+id+"缺页,用该作业的第"+tableIndex+"页表项替换\n");
			PAGETABLES[index].setValue(tableIndex,1,HDAdd);
			PAGETABLES[index].UseAgain(tableIndex);
			int memIndex	=	PAGETABLES[index].getValue(tableIndex,4);//该页表项所对应的内存页地址
			int HDIndex		=	Global.HDTABLE.findIndex(id);//作业id所对应的硬盘中的链表序号
			//desktop.Desktop.addTextToStateTextField("-----------"+HDIndex+"----------");
			for(int i=HDAdd;i<HDAdd+Global.PAGE_SIZE;i++)//从缺页位置开始读取page_size条指令
			{
				if(i<Global.HARDDISK.size(HDIndex))
					value[i-HDAdd]	=	Global.HARDDISK.Get(HDIndex,i);
				else value[i-HDAdd]	=	"NULL";
				Global.MEMORY.insertPage(memIndex,value);//把页地址为memIndex的内存页的内容换掉
			}
			add[0]	=	memIndex;
			add[1]	=	0;

			int row1	=	add[0]*Global.PAGE_SIZE;
			int row2	=	add[0]*Global.PAGE_SIZE+Global.PAGE_SIZE-1;
			desktop.Desktop.setMEMTableRowsBGColor(row1,row2,2);//刷新虚拟内存table
		}
		
		desktop.Desktop.ReFlashTable();//刷新虚拟内存table
		int address	=	add[0]*1000+add[1]+1;
		return address;
	}
	/**************************************************
	*功能描述:	通过硬盘地址得出内存中的地址
	*参数说明:	id:作业ID	HDAdd:硬盘中的地址
	*返回值:		内存中的地址
	**************************************************/
	public int	insertPage(int id,int HDAdd)
	{
		//Global.HARDDISK.Get(id,2);
		//HardDiskManager hm=new HardDiskManager();
		int value=0;
		boolean bo=true;
		int Index	=	this.getIndex(id);
		int out=Global.HDTABLE.findIndex(id);
		for(int i=0;i<Global.PAGES;i++)
		{
			int index	=	Global.MEMORY.findBest();
			String ss[]	=	new String[Global.PAGE_SIZE];
			for(int j=0;j<Global.PAGE_SIZE;j++)
			{
				//desktop.Desktop.addTextToStateTextField(""+out+"\n");
				if(HDAdd+j+i*Global.PAGE_SIZE<Global.HARDDISK.size(out))
					ss[j]	=	Global.HARDDISK.Get(out,HDAdd+j+i*Global.PAGE_SIZE);
				else ss[j]="NULL";
			}
			Global.MEMORY.insertPage(index,ss);
			PAGETABLES[Index].setValue(i,0,i);
			PAGETABLES[Index].setValue(i,1,HDAdd+i*Global.PAGE_SIZE);
			PAGETABLES[Index].setValue(i,2,1);
			PAGETABLES[Index].setValue(i,3,1);
			PAGETABLES[Index].setValue(i,4,index);
			if(bo)
			{
				value=index;
				bo=false;
			}
		}
		return value*1000+1;
	}
	/*************************************************
	*功能描述:	清除作业id所占用的内存
	*参数描述:	作业ID
	**************************************************/
	public void Delete(int id)
	{
		int index	=	this.getIndex(id);
		//int memIndex[]	=	new int[Global.PAGES];
		for(int i=0;i<Global.PAGES;i++)
		{
			int memIndex;
			memIndex	=	PAGETABLES[index].getValue(i,4);
			if(memIndex!=-1)
				Global.MEMORY.setNew(memIndex);
		}
		PAGETABLES[index].clearAll();
		TABLE_USED[index]	=	false;
		TABLE_ID[index]		=	0;
	}
	/*************************************************
	*功能描述:	清除作业id所占用的内存
	*参数描述:	作业ID
	**************************************************/
	public void Clear(int id)
	{
		int index	=	this.getIndex(id);
		//int memIndex[]	=	new int[Global.PAGES];
		for(int i=0;i<Global.PAGES;i++)
		{
			int memIndex;
			memIndex	=	PAGETABLES[index].getValue(i,4);
			if(memIndex!=-1)
				Global.MEMORY.setNew(memIndex);
			PAGETABLES[index].setValue(i,4,-1);
		}
	}
	public int UsedMem()
	{
		int notUsed	=	Global.BLOCKS-Global.MEMORY.count();
		return notUsed;
	}
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -