操作系统——实验5:请求页式存储管理的模拟

操作系统实验报告

实验五:请求页式存储管理的模拟

 

一、实验内容

        熟悉虚拟存管理的各种页面置换算法,并编写模拟程序实现请求页式存储管理的页面置换算法----FIFO,测试分配不同数目物理页面时的缺页率,并绘制“物理页面/缺页率”曲线图,圈出工作点(Operating point)。

 

二、实验要求

  1. 1、理解固定物理页面情况下,FIFO页面置换算法, 分析算法的执行过程。页面访问序列是随机的,具有足够的长度(大于35个);序列中每个地址是随机的、每项元素有重复的(随机数取值最好的0~9之间)。
  2. 2、每次置换时,要求显示分配状态(每个页框里装载的具体内容)和缺页率。贴其中一个运行结果图。
  3. 3、记录同样的页面访问序列(使用同一组访问序列数据的情况下),在不同物理页框下(改变页框数)的缺页情况,查看缺页率的变化,记录到Excel表里。
  4. 4、用Excel绘制“物理页面/缺页率” 曲线图,圈出操作点(拐点)。

 

三、FIFO页面置换算法

3.1  算法描述

        总是选择在主存中停留时间最长(即最老)的一页置换,即先进入内存的页,先退出内存。

3.2  页面的数据结构说明

struct PageInfo{
    int  serial[50];   // 模拟的最大访问页面数,实际控制在30以上
    int  diseffect;    // 缺页次数
    int  total_pf;     // 分配的页框数
    int  total_pn;     // 访问页面序列长度
} pf_info;

3.3  算法实现的流程

f857b8be889744e18f0436df15dbe036.png

图1  算法实现流程图

 

四、代码实现

#include <iostream>
#include <random>
#include <synchapi.h>
#include <fstream>
#include <iomanip>

using namespace std;

//全局变量
int PAGEFRAMENUM;   //物理页面数目,假定刚开始先固定物理块为6
int vpoint;             //页面访问指针
int pageframe[1000];    // 分配的页框,将来可随时改变分配的页框数
int rpoint;             //页面替换指针

//页面信息结构
struct PageInfo {
    int serial[50];   // 模拟的最大访问页面数,实际控制在30以上
    int diseffect;    // 缺页次数
    int total_pf;     // 分配的页框数
    int total_pn;     // 访问页面序列长度
} pf_info;

void createps();        // 随机页面序列进程
void displayinfo(int pstate);       // 展示所创建的序列
void FIFO();                        // FIFO页面置换算法
int findpage();                     //查找页面是否在内存,1为在内存,0为不在即缺页


// 随机页面序列进程
void createps(){
    // 随机产生页面序列长度30~50
    pf_info.total_pn = ((float)rand() / 32767) * 21 + 35;
    // 随机访问的每个序列值0~9
    for(int i = 0; i < pf_info.total_pn; i++){
        pf_info.serial[i] = ((float)rand() / 32767) * 10;
    }
}


// 展示所创建的序列(每访问一个页面,打印一行信息(该页是否缺页))
void displayinfo(int pstate) {
    printf("ID:%2d 访问%2d, 内存状态: <%2d", vpoint, pf_info.serial[vpoint], pageframe[0]);
    for (int i = 1; i < PAGEFRAMENUM; ++i) {
        if (pageframe[i] == -1) {
            printf(",  ");
        } else {
            printf(",%2d", pageframe[i]);
        }
    }
    printf(">  ");
    // pstate 表示页面是否在内存,如果不在,则需要打印“缺页,缺页率=?”
    if (!pstate) {
        printf("==>缺页, 缺页率%.1f", pf_info.diseffect * 1.0 / (vpoint + 1) * 100);
    }
    printf("\n");
}


// FIFO页面置换算法
void FIFO(){
    // 初始化页框信息
    for (int i = 0; i < PAGEFRAMENUM; i++) {
        pageframe[i] = -1;
    }
    vpoint = rpoint = 0;    // 初始化页面访问指针和页面替换指针
    pf_info.diseffect = 0;  // 初始化缺页次数
    pf_info.total_pf = 0;   // 初始化页框数

    // 对于序列中的每个页执行算法
    for (vpoint = 0; vpoint < pf_info.total_pn; vpoint++) {
        int pstate = findpage();  // 页是否在内存
        // 若页不存在,则装入页面
        if (!pstate) {
            if (pf_info.total_pf < PAGEFRAMENUM) {
                pf_info.total_pf += 1;
            }
            pageframe[rpoint] = pf_info.serial[vpoint];
            rpoint = (rpoint + 1) % PAGEFRAMENUM;
            pf_info.diseffect += 1; // 缺页次数加1
        }

        displayinfo(pstate); // 显示当前状态
        Sleep(100);  // 延时100ms
    }  // 置换算法循环结束

    float x = pf_info.diseffect * 1.0 / pf_info.total_pn * 100;
    printf("\n总缺页数=%d,  总缺页率=%.1f\n\n\n", pf_info.diseffect, x);

    // 结果写入文件
    ofstream  outFile;
    outFile.open("结果.txt", ios::app) ;
    outFile << PAGEFRAMENUM<< "," << fixed << setprecision(1) << x << endl;
    outFile.close();
}

//查找页面是否在内存,1为在内存,0为不在即缺页
int findpage() {
    for (int i = 0; i < PAGEFRAMENUM; i++) {
        // 页面存在
        if (pageframe[i] == pf_info.serial[vpoint]) {
            return 1;
        }
    }
    return 0;       // 页面不存在,缺页
}

int main() {
//    system("cls") ;
    createps();        // 随机生成访问序列

    // 打印出每个页面信息
    cout << "==================页面访问序列==================" << endl;
    for(int i = 0; i < pf_info.total_pn; i++) {
        cout << pf_info.serial[i] << "\t";
        if( (i+1) % 10 == 0 || i == pf_info.total_pn-1) cout << endl;
    }
    cout << "===============================================" << endl;

    do {
        cout << "please input pysical page number:" << endl;
        scanf("%d", &PAGEFRAMENUM);
        cout << "\n------------------FIFO Algorithm: "<< PAGEFRAMENUM << "frames---------------------\n" << endl;
        FIFO();  // 执行FIFO置换算法
    } while(PAGEFRAMENUM > 0);
}

五、运行结果

5.1  随机生成内存序列

        实验中,我设置随机页面序列长度为30~50,每个序列值为0~9。某次运行中,生成的随机页面访问序列长度为35,具体如下图所示:

beef550aa83e4be8b7584f657319499b.png

图2  随机生成内存序列截图

5.2  中间运行结果

b2ac22e3adf14a6da10a9d09c16181d6.png

3cc11efaa444469087e3167574a58358.png

图3  中间运行结果截图

当物理页面数目设置为5时,其总缺页数为16,总缺页率为47.1。

5.3  运行结果 

        我进行了两组数据测试,两组数据都使随机访问页面序列长度为35,具体序列值如5.1中图片与下图4所示。

3c4820f29b724977b5204f3c5b232ef6.png

图4  随机生成内存序列截图2

        将物理页面值从1开始遍历至13,得到缺页率结果如下图5和图6所示。

612da0fc70db480199b36bc4ea80667b.png      da54e445116348b5882f54f5f4308c92.png

图5  第一次数据结果                                                        图6  第二次数据结果

5.4  物理页面/缺页率曲线图

        将结果一与结果二的.txt文件修改为.csv文件,利用Excel打开后绘制折线图,如下图7和图8所示。

fe78a35836574c8db15ba3a891236955.png

图7  第一次数据折线图

891281ab0b394d56ae74abd478446299.png

图8  第二次数据折线图

        从折线图中不难看出,对于页面序列长度为35的随机访问序列,当物理页面数量达到8时,缺页率不再发生明显变化。

 

六、结论心得

        本次实验,我通过编写C++程序实现了FIFO页面置换算法。此算法直接淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。其实现的核心思想在于:把已进入内存的页面按先后顺序连成一个队列,设置一个替换指针指向最久调入的页面,若在此队列中已存在,则不进行替换;否则替换指针所指向的页面出队,新调用的页面入队。实验中,我们首先定义了页面信息结构和队列指针等数据结构,然后分析算法原理、绘制程序流程图,继而在给的提示代码下完成模拟程序的编写。

        经过测试,程序可以随机生成页面访问序列,并成功实现FIFO页面置换,正确计算缺页率。最终,通过对实验结果绘制折线图,不难发现在页面访问序列长度为35时,物理页面达到8时,缺页率不再发生明显变化。

        作为最早出现的置换算法,我们可以在实验过程中发现,它实现起来比较简单,不需要硬件的支持,不需要增加系统的成本;但是,没有考虑到缓存页面被使用的情况,很可能将一个被频繁访问的页面清除出缓存。

        总之,这次实验不仅锻炼了我的实践能力,也让我更加深刻地理解了FIFO页面置换算法的原理,受益匪浅。

 

  • 3
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
假设每个页面中可存放10条指令,分配给作业的内存块数为4。 用C语言语言模拟一个作业的执行过程,该作业共有320条指令, 即它的地址空间为32页,目前它的所有页都还未调入内存。在模拟过程中,如果所访问的指令已在内存,则显示其物理地址,并转下一条指令。如果所访问的指令还未装入内存,则发生缺页,此时需要记录缺页的次数,并将相应页调入内存。如果4个内存块均已装入该作业,则需要进行页面置换,最后显示其物理地址,并转向下一条指令。在所有320条指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。 置换算法:请分别考虑最佳置换算法(OPT)、先进先出(FIFO)算法和最近最久未使用算法(LRU)。 作业中指令的访问次序按下述原则生成: 50%的指令是顺序执行的; 25%的指令是均匀分布在前地址部分; 25%的指令是均匀分布在后地址部分; 具体的实施方法是:    在[0,319]的指令地址之间随机选取一起点m;    顺序执行下一条指令,即执行地址序号为m+1的指令;    通过随机数,跳转到前地址部分[0,m+1]中的某条指令处,其序号为m1;    顺序执行下一条指令,其地址序号为m1+1的指令;    通过随机数,跳转到后地址部分[m1+2,319]中的某条指令处,其序号为m2;    顺序执行下一条指令,其地址序号为m2+1的指令; 重复跳转到前地址部分,顺序执行,跳转到后地址部分,顺序执行的过程直至执行320条指令。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阮阮的阮阮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值