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

📄 compare.cs

📁 用C#写的关于虚拟存储器的算法
💻 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 + -