📄 ram.cs
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace os
{
public class ram
{
public enum tstate { free, used };//内存块的状态
private static int pagesize;//页大小
private static int pagecount;//页数目
private int ramsize;//总内存大小
public tstate[] state;//状态数组
public char[] ram_;//内存数组
public int crun;
public ram()//初始化函数
{
ramsize = 512;//内存大小512
pagesize = 16;//页大小16
pagecount = ramsize / pagesize;//页数为32
ram_ = new char[ramsize];//内存数组
state = new tstate[pagecount];//
for (int i = 0; i < pagecount; i++)
{
state[i] = tstate.free;//初始化状态为空闲
}
}
public int[] assignram(int size, out int usepagecount)//分配内存函数:size为进程需要内存大小;usepagecount是需要的内存块数
{
usepagecount = (size + pagesize - 1) / pagesize;
int[] pagetable = new int[pagecount];//初始化页表
int freecount = 0;
for (int i = 0; i < pagecount; i++) //寻找空闲内存块
{
if (state[i] == tstate.free)
{
pagetable[freecount] = i;
freecount++;
}
}
if (freecount >= usepagecount)
{
for (int j = 0; j < usepagecount; j++)
use(pagetable[j]);
return pagetable;
}
pagetable = null;
usepagecount = 0;
return null;
}
public int useramnum()
{
int num = 0;
for (int i = 0; i < 32; i++)
{
if (state[i] == tstate.used)
num++;
}
return num * 16;
}
public string ramshow()
{
string show = "";
for (int i = 0; i < 32; i++)
{
if (state[i] == tstate.free && i != crun)
show += "□";
if (state[i] == tstate.used && i != crun)
show += "■";
if (i == crun )
{
if (state[i] == tstate.used)
show += "★";
if(state[i] == tstate.free)
show += "□";
}
}
return show;
}
public bool use(int page)//标记当前的已经被使用了
{
if (page > pagecount)
return false;
if (state[page] == tstate.used)
return false;
state[page] = tstate.used;
return true;
}
public void releaseram(int[] pagetable, int usepagecount)//释放内存函数:
{
for (int i = 0; i < usepagecount; i++)
free(pagetable[i]);
pagetable = null;
}
public bool free(int page)// 标记当前的内存是空闲的
{
if (page > pagecount)
return false;
state[page] = tstate.free;
return true;
}
public bool readdata(int[] pagetable, int offset, ref char data)//从内存读指令pagetable是页表首地址offset是指针偏移亮data是内存数据
{
int page = offset / pagesize;
int off = offset % pagesize;
if (page > pagecount)
return false;
data = ram_[pagetable[page] * pagesize + off];
crun = pagetable[page];
return true;
}
public bool loaddata(int[] pagetable, int usepagecount, string data, int datasize)
{//指令调入内存函数:pagetable页表首地址,usepagecount进程需要的内存块数,data指令,datasize进程的大小
if (usepagecount != (datasize + pagesize - 1) / pagesize)
return false;
int wcnt = 0;
for (int i = 0; i < usepagecount; i++)
for (int j = 0; j < pagesize; j++)
{
ram_[pagetable[i] * pagesize + j] = data[wcnt++];
if (wcnt >= datasize)
return true;
}
return false;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -