📄 memorymanager.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 + -