实验四、虚拟存储管理
一、实验目的:
通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种页面置换算法的基本思想和实现过程,并比较它们的效率。
二、实验内容:
本实验要求使用C语言编程模拟一个拥有若干个虚页的进程在给定的若干个实页中运行、并在缺页中断发生时分别使用FIFO、OPT和LRU算法进行页面置换的情形。
三、实验要求:

  1. 虚页的个数可以事先给定(例如10个),对这些虚页访问的页地址流(其长度可以事先给定,例如20次虚页访问)可以由程序随机产生,也可以事先保存在文件中。
  2. 要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的页面命中率(命中率=1-页面失效次数/页地址流长度)。
  3. 程序应允许通过为该进程分配不同的实页数,来比较几种置换算法的稳定性。
#include <iostream>
#include <cstring>
using namespace std;

#define num_page 20
#define page_cnt 3

//int page[num_page] = {7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};//页面号引用串
int page[num_page] = {1, 2, 3, 4, 2, 1, 5, 6, 2, 1, 2, 3, 7, 6, 3, 2, 1, 2, 3, 6}; //页面号引用串
int res[page_cnt][num_page]; //保存每一次页面置换的结果
int last;     //指向在内存中的页面
int lack;     //缺页次数

//打印结果
void print()
{
    for (int i = 0; i < num_page; i++)
    {
        cout << page[i] << "\t";
    }
    cout << endl;
    for (int i = 0; i < page_cnt; i++)
    {
        for (int j = 0; j < num_page; j++)
        {
            if (res[i][j] != -1)
                cout << "   " << res[i][j] << "\t";
            else
                cout << "    "
                     << "\t";
        }
        cout << endl;
    }
    cout << "缺页次数:" << lack << endl;
    cout << "命中率:" << 1 - ((float)lack / num_page) << endl;
}
//内存初始化
void init()
{
    lack = 0;
    last = 0;
    memset(res, -1, sizeof(int) * num_page * page_cnt);
}
void FIFO()
{
    int cnt = 0;
    int i, j;
    for (i = 0; i < num_page; i++)
    {
        for (j = 0; j < page_cnt; j++)
        {
            if (res[j][last] == page[i])
            {
                break;
            }
        }
        if (j >= page_cnt)
        {
            lack++;
            for (int k = 0; k < page_cnt; k++)
            {
                res[k][i] = res[k][last];
            }
            res[(cnt++) % page_cnt][i] = page[i];
            last = i;
        }
    }
}
//返回最长时间不再访问的页面(所在行号)
int seek(int i)
{
    int a[page_cnt];
    for (int j = 0; j < page_cnt; j++)
    {
        a[j] = num_page;
    }
    bool b[page_cnt] = {false};
    for (int j = i; j < num_page; j++)
    {
        for (int k = 0; k < page_cnt; k++)
        {
            if (!b[k] && res[k][i] == page[j])
            {
                a[k] = j;
                b[k] = true;
            }
        }
    }
    int max = 0;
    for (int j = 1; j < page_cnt; j++)
    {
        if (a[j] > a[max])
        {
            max = j;
        }
    }
    return max;
}
void OPT()
{
    int i, j;
    for (i = 0; i < num_page; i++)
    {
        for (j = 0; j < page_cnt; j++)
        {
            if (res[j][last] == page[i])
            {
                break;
            }
        }
        if (j >= page_cnt)
        {
            lack++;
            for (int k = 0; k < page_cnt; k++)
            {
                res[k][i] = res[k][last];
            }
            res[seek(i)][i] = page[i];
            last = i;
        }
    }
}
//返回最近最久未使用的页面(返回页面所在行号)
int search(int i)
{
    int a[page_cnt];
    memset(a, -1, sizeof(int) * page_cnt);//如果没有搜索到,说明此时还有空闲页面,其值就为-1,返回空闲页面
    bool b[page_cnt] = {false};
    for (int j = i - 1; j >= 0; j--)
    {
        for (int k = 0; k < page_cnt; k++)
        {
            if (!b[k] && res[k][i] == page[j])
            {
                a[k] = j;
                b[k] = true;
            }
        }
    }
    int min = 0;
    for (int j = 1; j < page_cnt; j++)
    {
        if (a[j] < a[min])
        {
            min = j;
        }
    }
    return min;
}
void LRU()
{
    int i, j;
    // bool flag = false;//是否有空闲页面
    // int record;//记录找到的空闲页面
    for (i = 0; i < num_page; i++)
    {
        for (j = 0; j < page_cnt; j++)
        {
            if (res[j][last] == page[i])
            {
                break;
            }
        }
        if (j >= page_cnt)
        {
            lack++;
            for (int k = 0; k < page_cnt; k++)
            {
                res[k][i] = res[k][last];
                // if (res[k][last] == -1 && !flag)
                // {
                //     flag = true;
                //     record = k;
                // }
            }
            res[search(i)][i] = page[i];
            // if (flag)
            // {
            //     res[record][i] = page[i];
            //     flag = false;
            // }
            // else
            // {
            //     res[search(i)][i] = page[i];
            // }
            last = i;
        }
    }
}
int main()
{
    cout << "FIFO算法" << endl;
    init();
    FIFO();
    print();
    cout << "OPT" << endl;
    init();
    OPT();
    print();
    cout << "LRU算法" << endl;
    init();
    LRU();
    print();
    return 0;
}

结果
在这里插入图片描述

Logo

鸿蒙生态一站式服务平台。

更多推荐