栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

操作系统——虚拟内存替换算法C++代码实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

操作系统——虚拟内存替换算法C++代码实现

问题描述:

设计程序模拟先进先出FIFO,最佳置换OPI和最近最久未使用LRU页面置换算法的工作过程。假设内存中分配给每个进程的最小物理块数为m,在进程运行过程中要访问的页面个数为n,页面访问序列为P1, … ,Pn,分别利用不同的页面置换算法调度进程的页面访问序列,给出页面访问序列的置换过程,计算每种算法缺页次数和缺页率。程序要求如下:

1)利用先进先出FIFO,最佳置换OPI和最近最久未使用LRU三种页面置换算法模拟页面访问过程。

2)模拟三种算法的页面置换过程,给出每个页面访问时的内存分配情况。

3)输入:最小物理块数m,页面个数n,页面访问序列P1, … ,Pn,算法选择1-FIFO,2-OPI,3-LRU。

4)输出:每种算法的缺页次数和缺页率

要求:复习页面置换算法,熟悉FIFO,OPI,LRU三种页面分配和置换算法的过程;

实验用例:假定系统为某进程分配了三个物理块,并按以下的页面号引用串测试这三种算法:

7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1。

实验开发环境

clion

程序主要构成部分及其算法说明

主函数里调用了四个函数Input()、FIFO()、OPI()、LRU();、Input():引导用户输入物理、页面数、页面号引用串。FIFO()算法中对第一个页面单独拿出来放进物理块,然后之后的页面进行是否相同检查与物理块是否满了的检查,用LongPageloc来记录在物理块里待的最长时间的页面下标,查找后进行置换或进行下一个页面,输出当前物理块情况,记录缺页数,计算缺页率,并进行输出。OPI()算法中也对第一个页面单独拿出来放进物理块,然后之后的页面进行是否相同检查与物理块是否满了的检查,在三个物理块里比较在之后最晚要使用的页面,记录下标进行置换。输出当前物理块情况,记录缺页数,计算缺页率,并进行输出。LRU()算法中同样也是对第一个页面单独拿出来放进物理块,然后对页面进行是否相同检查与物理块是否满了的检查,在三个物理块里比较在之前中最久没有被访问的,从算法里体现就是在当前物理块里与之前使用过的相同页面距离最远的,如果没有距离就是0,记录下标进行置换。输出当前物理块情况,记录缺页数,计算缺页率,并进行输出。

调试过程和运行结果

附完整代码:

#include
using namespace std;

const int MaxNumber = 100;
int  PageOrder[MaxNumber];
int  OPIBlock[MaxNumber];//OPI算法使用的数组
int  LRUBlock[MaxNumber];//LRU算法使用的数组
int  BlockOrder[MaxNumber]; //FIFO算法使用的数组
int  FarPageloc[MaxNumber];  //OPI算法中储存Block的距离
int  OldPageloc[MaxNumber];  //LRU算法中储存Block使用过最近
int  PageNum;
int  BlockNum;  //物理块数
bool found;

void Input() {
    cout << "物理块数:";
    cin >> BlockNum;
    cout << "页面数:";
    cin >> PageNum;
    cout << "页面号引用串:";
    for (int i = 0; i < PageNum; i++) {
        cin >> PageOrder[i];
    }
}

void FIFO() {
    int LackNum = 0;
    double  LackPageRate;
    cout << "FIFO:" << endl;
    int LongPageloc = 0, Blockloc = 0;
    BlockOrder[0] = PageOrder[0];  //放入第一个
    cout << PageOrder[0] << " " << BlockOrder[0] << endl;
    Blockloc += 1;  //装满物理块的判定
    LongPageloc = 0;  //待时间最长的页面下标
    for (int i = 1; i < PageNum; i++) {
        found = false;
        if (Blockloc < BlockNum) {
            for (int j = 0; j < Blockloc; j++) {
                if (PageOrder[i] == BlockOrder[j]) {
                    found = true;
                    break;
                }
            }
            if (!found) {
                BlockOrder[Blockloc] = PageOrder[i];
                Blockloc += 1;
            }
            cout << PageOrder[i] << "  ";
            for (int temp = 0; temp < Blockloc; temp++) {
                cout << BlockOrder[temp] << " ";
            }
            cout << endl;
        }
        else {
            for (int j = 0; j < BlockNum; j++) {
                if (PageOrder[i] == BlockOrder[j]) {
                    found = true;
                    break;
                }
            }
            if (!found) {
                BlockOrder[LongPageloc] = PageOrder[i];
                LongPageloc += 1;
                if (LongPageloc == 3) {
                    LongPageloc = 0;
                }
                LackNum += 1;
            }
            cout << PageOrder[i] << "  ";
            for (int temp = 0; temp < BlockNum; temp++) {
                cout << BlockOrder[temp] << " ";
            }
            cout << endl;
        }
    }

    LackNum = LackNum+BlockNum;
    LackPageRate = (double)LackNum / PageNum;
    cout << "缺页数:" << LackNum << "缺页率:" << LackPageRate * 100 << "%" << endl;
}

void OPI() {
    cout << "OPI:" << endl;
    int  Blockloc = 0;//装满物理块的判定
    int LackNum = 0;
    double  LackPageRate;
    OPIBlock[0] = PageOrder[0];
    cout << PageOrder[0] << " " << OPIBlock[0] << endl;
    Blockloc += 1;
    for (int i = 1; i < PageNum; i++) {
        found = false;
        if (Blockloc < BlockNum) {
            for (int j = 0; j < Blockloc; j++) {
                if (PageOrder[i] == OPIBlock[j]) {
                    found = true;
                    break;
                }
            }
            if (!found) {
                OPIBlock[Blockloc] = PageOrder[i];
                Blockloc += 1;
            }
            cout << PageOrder[i] << "  ";
            for (int temp = 0; temp < Blockloc; temp++) {
                cout << OPIBlock[temp] << " ";
            }
            cout << endl;
        }
        else {
            for (int j = 0; j < BlockNum; j++) {
                if (PageOrder[i] == OPIBlock[j]) {
                    found = true;
                    break;
                }
            }
            if (!found) {
                for (int j = 0; j < BlockNum; j++) {
                    bool farFound = false;
                    for (int k = i + 1; k < PageNum; k++) {
                        if (OPIBlock[j] == PageOrder[k]) {
                            FarPageloc[j] = k;
                            farFound = true;
                            break;
                        }
                    }
                    if (!farFound) {
                        FarPageloc[j] = PageNum;
                    }
                }
                int FarMax = FarPageloc[0];
                int Farloc = 0;   //找出未来最晚使用的下标
                for (int j = 1; j < BlockNum; j++) {
                    if (FarPageloc[j] > FarMax) {
                        FarMax = FarPageloc[j];
                        Farloc = j;
                    }
                }
                OPIBlock[Farloc] = PageOrder[i];
                LackNum += 1;
            }
            cout << PageOrder[i] << "  ";
            for (int temp = 0; temp < BlockNum; temp++) {
                cout << OPIBlock[temp] << " ";
            }
            cout << endl;
        }

    }

    LackNum = LackNum+BlockNum;
    LackPageRate = (double)LackNum / PageNum;
    cout << "缺页数:" << LackNum << "缺页率:" << LackPageRate * 100 << "%" << endl;
}
void LRU() {
    cout << "LRU:" << endl;
    int  Blockloc = 0;//装满物理块的判定
    int OldBlockloc;
    int LackNum = 0;
    double  LackPageRate;
    LRUBlock[0] = PageOrder[0];
    OldBlockloc = 0;
    cout << PageOrder[0] << " " << LRUBlock[0] << endl;
    Blockloc += 1;
    for (int i = 1; i < PageNum; i++) {
        found = false;
        if (Blockloc < BlockNum) {
            for (int j = 0; j < Blockloc; j++) {
                if (PageOrder[i] == LRUBlock[j]) {
                    found = true;
                    break;
                }
            }
            if (!found) {
                LRUBlock[Blockloc] = PageOrder[i];
                Blockloc += 1;
            }
            cout << PageOrder[i] << "  ";
            for (int temp = 0; temp < Blockloc; temp++) {
                cout << LRUBlock[temp] << " ";
            }
            cout << endl;
        }
        else {
            for (int j = 0; j < BlockNum; j++) {
                if (PageOrder[i] == LRUBlock[j]) {
                    found = true;
                    break;
                }
            }
            if (!found) {
                for (int j = 0; j < BlockNum; j++) {
                    for (int k = i - 1; k >= 0; k--) {
                        if (LRUBlock[j] == PageOrder[k]) {
                            OldPageloc[j] = k;
                            break;
                        }
                    }
                }
                int OldMax = OldPageloc[0];
                int Oldloc = 0;
                for (int j = 1; j < BlockNum; j++) {
                    if (OldPageloc[j] < OldMax) {
                        OldMax = OldPageloc[j];
                        Oldloc = j;
                    }
                }
                LRUBlock[Oldloc] = PageOrder[i];
                LackNum += 1;
            }
            cout << PageOrder[i] << "  ";
            for (int temp = 0; temp < BlockNum; temp++) {
                cout << LRUBlock[temp] << " ";
            }
            cout << endl;
        }
    }

    LackNum = LackNum+BlockNum;
    LackPageRate = (double)LackNum / PageNum;
    cout << "缺页数:" << LackNum << "缺页率:" << LackPageRate * 100 << "%" << endl;
}

int main() {
    //7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1 测试数据
    Input();
    FIFO();
    OPI();
    LRU();
    //system("pause");
    //int temp;
    //cout << "请输入想选择的算法";
    //cin >> temp;
    

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1012965.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号