FIFO,LRU算法实现页面置换

目的:
熟悉页面置换算法及其实现,引入计算机系统性能评价方法的概念。
内容:
编制页面置换算法的模拟程序。
要求:
(1)用随机数方法产生页面走向,页面走向长度为L。
(2)根据页面走向,分别采用FIFO和LRU算法进行页面置换,统计缺页率。
(3)假定可用内存块和页表长度(作业的页面数)分别为m和k,初始时,作业页面都不在内存。

随机数产生程序:
function random : real:
begin Seed : = 125.0(seed + 1.0)
Seed : = Seed8192.0trunc(seed / 8192)
random : = (Seed + 0.5) / 8192
end;
上述随机数发生函数产生的随机数为0.01.0,稍另变化就可得到0n1之间的随机数。
程序开始时,应对变量Seed(实型)赋初值。

#include<iostream>
#include<time.h>
using namespace std;

#define L 20//页面走向长度最大为20
int M;        //内存块
struct Pro//定义一个结构体
{
    int num, time;
};

int Input(int m, Pro p[L])//打印页面走向状态
{
    cout << "请输入页面走向长度L:";
    cin >> m;
    int i, j;
    j = time(NULL);//取时钟时间
    srand(j);//以时钟时间x为种子,初始化随机数发生器
    cout << "输出随机数:  ";
    for (i = 0;i < m;i++)
    {
        p[i].num = rand() % 10 + 1;//产生1到10之间的随即数放到数组p中
        p[i].time = 0;
        cout << p[i].num << " ";
    }
    cout << endl;
    return m;
}

void print(Pro * page1)//打印当前的页面
{
    Pro* page = new Pro[M];
    page = page1;
    for (int i = 0;i < M;i++)
        cout << page[i].num << " ";
    cout << endl;
}
int  Search(int e, Pro * page1)//寻找内存块中与e相同的块号
{
    Pro* page = new Pro[M];
    page = page1;
    for (int i = 0;i < M;i++)
        if (e == page[i].num)
            return i;//返回i值
    return -1;
}

void timePlus(Pro* page1)//内存中页面时间增加
{
    Pro* page = new Pro[M];
    page = page1;
    for (int i = 0;i < M;i++)
        page[i].time++;
}

int foundMaxTime(Pro* page1)
{
    Pro* page = new Pro[M];
    page = page1;
    int max = -1000, n;
    for (int i = 0;i < M;i++)
    {
        if (page[i].time > max)
        {
            n = i;
            max = page[i].time;
        }
    }
    return n;
}

int Max(Pro * page1)//寻找最近最长未使用的页面
{
    Pro* page = new Pro[M];
    page = page1;
    int e = page[0].time, i = 0;
    while (i < M)                //找出离现在时间最长的页面
    {
        if (e < page[i].time) 
            e = page[i].time;
        i++;
    }
    for (i = 0;i < M;i++)
        if (e == page[i].time)
            return i;//找到离现在时间最长的页面返回其块号

    return -1;
}

int Count(Pro * page1, int i, int t, Pro p[L])//记录当前内存块中页面离下次使用间隔长度
{
    Pro* page = new Pro[M];
    page = page1;

    int count = 0;
    for (int j = i;j < L;j++)
    {
        if (page[t].num == p[j].num)
            break;//当前页面再次被访问时循环结束
        else
            count++;//否则count+1
    }
    return count;//返回count的值

}

int main()
{ 
    int c;
    int m = 0;
    float n = 0;
    Pro p[L];
    m = Input(m, p);//调用input函数,返回m值
    cout << "请输入可用内存页面数m: ";
    cin >> M;
    Pro* page = new Pro[M];
    do {
        for (int i = 0;i < M;i++)//初试化页面基本情况
        {
            page[i].num = -1;
            page[i].time = 100;//将初始化的物理块时间设得很大,这样就优先替换这些物理块
        }

        int i = 0;
        cout << "1:FIFO页面置换" << endl;
        cout << "2:LRU页面置换" << endl;
        cin >> c;
        if (c == 1)//FIFO页面置换
        {
            n = 0;
            cout << "FIFO算法页面置换情况如下:" << endl;
            while (i < m)
            {
                if (Search(p[i].num, page) >= 0)             //当前页面在内存中
                {
                    cout << "不缺页" << endl;
                    timePlus(page);
                    print(page);
                    i++;         //i加1
                }

                else                                 //当前页不在内存中
                {
                    int change = foundMaxTime(page);
                    n++;                             //缺页次数加1
                    page[change].num = p[i].num;    //把当前页面放入内存中
                    page[change].time = 0;
                    timePlus(page);
                    print(page);                   //打印当前页面
                    i++;                          //指向下一个页面
                }
            }
            cout << "缺页次数:" << n << "    缺页率:" << n / m << endl;
        }
        if (c == 2)//LRU页面置换
        {
            n = 0;
            int t;
            cout << "LRU算法页面置换情况如下:" << endl;
            while (i < m)
            {
                int a;
                t = Search(p[i].num, page);
                if (t >= 0)//如果已在内存块中
                {
                    cout << "不缺页" << endl;
                    timePlus(page);
                    page[t].time = 0;  //把与它相同的内存块的时间置0
                    print(page);
                }
                else                  //如果不在内存块中
                {
                    n++;           //缺页次数加1
                    t = Max(page);     //返回最近最久未使用的块号赋值给t
                    page[t].num = p[i].num;           //进行替换                            
                    print(page);
                    timePlus(page);            //其它的时间加1
                    page[t].time = 0;     //替换后时间置为0
                }
                i++;
            }

            cout << "缺页次数:" << n << "    缺页率:" << n / m << endl;
        }
    } while (c == 1 || c == 2 );
    return 0;
}

觉得有用的话就点个赞吧,蟹蟹!!!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值