实验4 虚拟存储管理

本文实现了一个程序,用于演示和比较三种经典的页面替换算法:FIFO(先进先出)、OPT(最佳页面替换)和LRU(最近最久未使用)。程序中定义了最大内存块数量和地址流长度,并通过用户输入获取实际的内存块数量、虚页数量和地址流。在每种算法下,程序会输出页面访问的命中率,以评估其效率。
摘要由CSDN通过智能技术生成
#include <bits/stdc++.h>
#define Maxm 2000000
#define Maxn 10000
using namespace std;

const int maxm = 2e6+10;//本程序可容纳的最大地址流长度
const int maxn = 1e4+10;//本程序可容纳最大内存块数量

int n, m;//n为虚页的个数,m为地址流的长度
int EmpBlock;//内存块的数量
int VPAccess[maxm];//虚页访问

void FIFO();
void OPT();
void LRU();
bool Find(int, int[]);
int Find(int, int);
int Find(int, int, int);
void Display(int[]);

int main()
{
    puts("温馨提示:\n1. 本程序最大可申请内存块为10000\n2. 最大可容纳地址流长度为2000000");
    puts("请输入现有内存块数量");
    scanf("%d", &EmpBlock);
    while (EmpBlock>Maxn)
    {
        puts("请重新输入现有内存块数量");
        scanf("%d", &EmpBlock);
    }
    
    puts("请输入虚页的数量和地址流的长度");
    scanf("%d %d", &n, &m);
    while (m>Maxm)
    {
        puts("请重新输入地址流长度");
        scanf("%d", &m);
    }
    puts("请输入本次页面走向");
    for(int i=0; i<m; ++i) scanf("%d", &VPAccess[i]);
    FIFO();
    OPT();
    LRU();
    return 0;
}

void FIFO()
{
    puts("正在调用FIFO算法");
    int cntS = 0;//计录成功次数
    int cnt = 0;//记录现在有多少已经在内存
    int Re[maxn];

    int Point = 0;//寻找在缺页情况下该被替换的页面
    for(int i=0; i<EmpBlock; ++i) Re[i] = -1;

    for(int i=0; i<m; ++i){
        int now = VPAccess[i];//代表现在要访问的页面
        if(now>=n){
            puts("Error visit");
            return;
        }
        if(Find(now, Re) == true){
            ++cntS;
            puts("success");
        }
        else{
            puts("failed");
            if(cnt<EmpBlock) Re[cnt++] = now;
            else{
                Re[Point] = now;
                Point = (Point+1) % EmpBlock;
            }
        }
    }

    puts("命中率为:");
    printf("%.6f\n", (cntS*1.0)/(m*1.0));
}

void OPT()
{
    puts("正在调用OPT算法");
    int cntS = 0;//计录成功次数
    int cnt = 0;//记录现在有多少已经在内存
    int Re[maxn];

    int Point = 0;//寻找在缺页情况下该被替换的页面
    for(int i=0; i<EmpBlock; ++i) Re[i] = -1;

    for(int i=0; i<m; ++i){
        int now = VPAccess[i];//代表现在要访问的页面
        if(now>=n){
            puts("Error visit");
            return;
        }
        if(Find(now, Re)){
            cntS++;
            puts("success");
        }
        else{
            if(cnt<EmpBlock) Re[cnt++] = now;
            else{
                int Max = -1;
                for(int j=0; j<EmpBlock; ++j){
                    int nexpos = Find(Re[j], j);
                    if(nexpos>Max){
                        Max = nexpos;
                        Point = j;
                    }
                }
                Re[Point] = now;
            }
            puts("failed");
        }
    }

    puts("命中率为:");
    printf("%.6f\n", (cntS*1.0)/(m*1.0));
}

void LRU()
{
    puts("正在调用LRU算法");
    int cntS = 0;//计录成功次数
    int cnt = 0;//记录现在有多少已经在内存
    int Re[maxn];

    int Point = 0;//寻找在缺页情况下该被替换的页面
    for(int i=0; i<EmpBlock; ++i) Re[i] = -1;

    for(int i=0; i<m; ++i){
        int now = VPAccess[i];//代表现在要访问的页面
        if(now>=n){
            puts("Error visit");
            return;
        }
        if(Find(now, Re)){
            cntS++;
            puts("success");
        }
        else{
            if(cnt<EmpBlock) Re[cnt++] = now;
            else{
                int Min = m;
                for(int j=0; j<EmpBlock; ++j){
                    int prepos = Find(Re[j], 0, i-1);
                    if(prepos<Min){
                        Min = prepos;
                        Point = j;
                    }
                }
                Re[Point] = now;
            }
            puts("failed");
        }
    }

    puts("命中率为:");
    printf("%f\n", (cntS*1.0)/(m*1.0));
}

bool Find(int t, int Re[])
{
    for(int i=0; i<EmpBlock; ++i)
    if(Re[i] == t) return true;
    return false;
}

int Find(int x, int st)
{
    for(int i=st; i<m; ++i){
        if(VPAccess[i] == x) return i;
    }
    return m;
}

int Find(int x, int en, int st)
{
    for(int i=st; i>=en; --i) if(VPAccess[i] == x) return i;
    return -1;
}

void Display(int Re[])
{
    puts("现阶段储存情况");
    for(int i=0; i<EmpBlock; ++i){
        if(Re[i] == -1) puts("Empty");
        else printf("%d\n", Re[i]);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值