📄 compare.cs
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Compare : Form
{
public int wuli, yemian;//物理块数和页面块数
static private Random Rand = new Random();//随机数生成器
static private int MaxPages = 15;//定义最大页面序列的个数
public int[] pages = new int[MaxPages];//储存随机页面信息
public int[] wulikuai;//储存物理块信息
private int success, fail;//置换成功次数和失败次数
private double sRate, fRate;//置换成功率和缺页率
public Compare()
{
InitializeComponent();
}
private void randompage_Click(object sender, EventArgs e)
{
wuli = Int32.Parse(textBoxWuli.Text);
yemian = Int32.Parse(textBoxYemian.Text);
if (wuli >= yemian)
{
MessageBox.Show("物理块数大于等于页面块数,不需要进行页面置换", "不需要置换");
}
else
{
//生成随机页面
Random rnd = Compare.Rand;
textBox1.Text = "";
int t;//这里要生成相邻两个数字不重复的页面请求序列
t = pages[0] = rnd.Next(yemian);
textBox1.Text += pages[0].ToString() + " ";
for (int i = 1; i < MaxPages; i++)
{
t = rnd.Next(yemian);
if (t != pages[i - 1])
{
pages[i] = t;
textBox1.Text += pages[i].ToString() + " ";
}
else//这里不够严密
{
pages[i] = rnd.Next(yemian);
textBox1.Text += pages[i].ToString() + " ";
}
}
}
this.textBox1.Invalidate();
}
private void fifo_Click(object sender, EventArgs e)
{
//初始化物理块
wulikuai = new int[wuli];
success = fail = 0;
sRate = fRate = 0.0;
for (int i = 0; i < wuli; i++)
{
wulikuai[i] = -1;
}
listBox1.Items.Clear();
listBox1.Items.Add("页面替换过程:");
listBox2.Items.Clear();
listBox2.Items.Add("物理块状态:");
if (wuli == 0)
{
MessageBox.Show("物理块数为零,不能进行置换!", "ERROR");
return;
}
else if (yemian == 0)
{
MessageBox.Show("页面块数为零,不能进行置换!", "ERROR");
return;
}
else
{
//开始FIFO
int memory = 0;
string result = "";
string memoryState = "";
bool findSuccess;
for (int i = 0; i < MaxPages; i++)
{
memoryState = "";
findSuccess = false;
for (int j = 0; j < wuli; j++)
{
if (wulikuai[j] == pages[i])
{
findSuccess = true;//查找成功
break;
}
}
if (!findSuccess)//没有找到
{
//开始替换
fail++;
if (wulikuai[memory] == -1)
{
//请求调入
result = "请求:" + pages[i].ToString() + " 缺页,请调中断。";
listBox1.Items.Add(result);
for (int m = 0; m < wuli; m++)
{
memoryState += wulikuai[m].ToString() + " ";
}
listBox2.Items.Add(memoryState);
wulikuai[memory] = pages[i];//写入物理块
memory = (memory + 1) % wuli;
}
else
{
//缺页中断
result = "请求:" + pages[i].ToString() + " 缺页,FIFO置换。";
listBox1.Items.Add(result);
for (int m = 0; m < wuli; m++)
{
memoryState += wulikuai[m].ToString() + " ";
}
listBox2.Items.Add(memoryState);
wulikuai[memory] = pages[i];
memory = (memory + 1) % wuli;
}
}
else
{
//在物理块中找到该页面
success++;
result = "请求:" + pages[i].ToString() + " 成功,不置换。";
listBox1.Items.Add(result);
for (int m = 0; m < wuli; m++)
{
memoryState += wulikuai[m].ToString() + " ";
}
listBox2.Items.Add(memoryState);
}
}
//计算成功率、缺页率
sRate = success / MaxPages;
fRate = (fail * 100 / MaxPages);//便于用百分比表示
//写回用户界面
queyeCishu.Text = fail.ToString();
queyeLv.Text = fRate.ToString() + "%";
xuliegeshu.Text = MaxPages.ToString();
}
}
private void lru_Click(object sender, EventArgs e)
{
//修改页面数据结构,使之带有时间信息,以适应LRU算法
int[,] newwulikuai = new int[wuli, 2];
//初始化物理块
int accessTime = 1;//表示访问时间
success = fail = 0;
sRate = fRate = 0.0;
for (int i = 0; i < wuli; i++)
{
newwulikuai[i, 0] = -1;
newwulikuai[i, 1] = 0;
}
listBox1.Items.Clear();
listBox1.Items.Add("页面替换过程:");
listBox2.Items.Clear();
listBox2.Items.Add("物理块状态:");
if (wuli == 0)
{
MessageBox.Show("物理块数为零,不能进行置换!", "ERROR");
return;
}
else if (yemian == 0)
{
MessageBox.Show("页面块数为零,不能进行置换!", "ERROR");
return;
}
else
{
//开始LRU
string result = "";
string memoryState = "";
bool findSuccess, isEmpty;
int index;
for (int i = 0; i < MaxPages; i++)
{
memoryState = "";
findSuccess = false;
isEmpty = false;
index = 0;
for (int j = 0; j < wuli; j++)
{
if (newwulikuai[j, 0] == pages[i])
{
findSuccess = true;//查找成功
index = j;
break;
}
}
if (!findSuccess)//没有找到,开始替换
{
fail++;
//判断是否是请调中断
int j;
for (j = 0; j < wuli; j++)
{
if (newwulikuai[j, 0] == -1)
{
isEmpty = true;//物理块中还有空块
break;
}
}
if (isEmpty)
{
//请求调入
result = "请求:" + pages[i].ToString() + " 缺页,请调中断。";
listBox1.Items.Add(result);
for (int m = 0; m < wuli; m++)
{
memoryState += newwulikuai[m, 0].ToString() + " ";
}
listBox2.Items.Add(memoryState);
newwulikuai[j, 0] = pages[i];//写入物理块
newwulikuai[j, 1] = accessTime;//写入访问时间
}
else
{
//缺页中断
result = "请求:" + pages[i].ToString() + " 缺页,LRU置换。";
listBox1.Items.Add(result);
for (int m = 0; m < wuli; m++)
{
memoryState += newwulikuai[m, 0].ToString() + " ";
}
listBox2.Items.Add(memoryState);
//找到最久没有使用的物理块
int small = 0;
for (int k = 0; k < wuli; k++)
{
if (newwulikuai[small, 1] > newwulikuai[k, 1])
{
small = k;
}
}
//写入信息
newwulikuai[small, 0] = pages[i];
newwulikuai[small, 1] = accessTime;
}
}
else
{
//在物理块中找到该页面
success++;
result = "请求:" + pages[i].ToString() + " 成功,不置换。";
listBox1.Items.Add(result);
for (int m = 0; m < wuli; m++)
{
memoryState += newwulikuai[m, 0].ToString() + " ";
}
listBox2.Items.Add(memoryState);
//修改使用信息
newwulikuai[index, 1] = accessTime;
}
accessTime++;
}
//计算成功率、缺页率
sRate = success / MaxPages;
fRate = (fail * 100 / MaxPages);//便于用百分比表示
//写回用户界面
queyeCishu.Text = fail.ToString();
queyeLv.Text = fRate.ToString() + "%";
xuliegeshu.Text = MaxPages.ToString();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -