请求调页存储管理方式的模拟

实验七 请求调页存储管理方式的模拟

1、实验目的
通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求调页系统
的原理和实现过程的理解。
2、实验内容
(1)假设每个页面中可存放 10 条指令,分配给一作业的内存块数为 4。
(2)用 C 语言模拟一作业的执行过程。该作业共有 320 条指令,即它的地址空
间为 32 页,目前它的所有页都还未调入内存。在模拟过程中,如果所访问的指
令已经在内存中,则显示其物理地址,并转下一条指令。如果所访问的指令还未
装入内存,则发生缺页,此时需记录缺页的次数,并将相应页调入内存。如果 4
个内存块中均已装入该作业,则需进行页面置换。最后显示其物理地址,并转下
一条指令。在所有 320 条指令执行完毕后,请计算并显示作业运行过程中发生的
缺页率。
(3)置换算法:请分别考虑 OPT、FIFO 和 LRU 算法。
(4)作业中指令的访问次序按下述原则生成:
•50%的指令是顺序执行的。
•25%的指令是均匀分布在前地址部分。
•25%的指令时均匀分布在后地址部分。
具体的实施办法是:
① 在[0,319]之间随机选取一条起始执行指令,其序号为 m;
② 顺序执行下一条指令,即序号为 m+1 的指令;
③ 通过随机数,跳转到前地址部分[0,m-1]中的某条指令处,其序号为 m1;
④ 顺序执行下一条指令,即序号为 m1+1 的指令;
⑤ 通过随机数,跳转到后地址部分[m1+2,319]中的某条指令处,其序号为 m2;
⑥ 顺序执行下一条指令,即序号为 m2+1 的指令;
⑦ 重复跳转到前地址部分、顺序执行、跳转到后地址部分、顺序执行的过程,
直至执行 320 条指令

#include<iostream>
#include<vector>
#include<stdlib.h>
#include<time.h>
using namespace std;
struct page
{
    int page_id;
    int opt_time;    //最长未被使用的时间
    int lru_time;    //有多久未被使用
};
int merge_time;
int random_num[320];
int count=0;
vector<page> page_in;
page temp;
void random_()
{	int i=1;
    int m;
	random_num[0]=rand()%(319 - 0 + 1) + 0 ;
	m=random_num[0];
	while(i<320)
	{
	    random_num[i]=++m;// m+1写入数组
	    i++;            //计数
	    if(i>=320)break;  //条件判断
	    random_num[i]=rand()%(m-1 -0 +1) + 0;  //前地址区
	    m=random_num[i];
	    i++;
	    if(i>=320)break;
	    random_num[i]=++m;
	    i++;
	    if(i>=320)break;   //后地址区域
	    random_num[i]=rand()%(319 -m +2) + m+1;
	    m=random_num[i];
	    i++;
	}
}
void page_print()     //输出内存中的东西
{
    cout<<endl<<"内存内页面为:";
    for(int k=0;k<page_in.size();k++)
    {
        cout<<" "<<page_in[k].page_id;
    }
}
int in_memory(int id)   //判断是否在内存
{   bool sign=0;
    for(int i=0;i<page_in.size();i++)
    {
        if(id/10==page_in[i].page_id)
        {
            sign=1;
            break;
        }
    }
    return sign;
}
int is_max()  //判断内存是否已满
{
    bool sign=0;
    if(page_in.size()==4)
    {
        sign=1;
    }
    return sign;
}
void FIFO()  //先进先出算法
{
    merge_time=0;
    for(int i=0;i<320;i++)
    {
        page_print();
        if(in_memory(random_num[i]))   //如果页面在内存里
        {
            cout<<"\t\t执行第"<<i<<"条指令,指令为:"<<random_num[i]<<endl;
            continue;
        }
        else
        {
            if(is_max())  //调页
            {   merge_time++;
                page_in.erase(page_in.begin());
                temp.page_id=random_num[i]/10;
                page_in.push_back(temp);
                cout<<"\t\t执行第"<<i<<"条指令,指令为:"<<random_num[i]<<endl;
                continue;

            }
            else
            {
                temp.page_id=random_num[i]/10;
                page_in.push_back(temp);
                cout<<"\t\t执行第"<<i<<"条指令,指令为:"<<random_num[i]<<endl;
                continue;

            }
        }
    }
    cout<<"总共调页:"<<merge_time<<"次"<<endl;
    cout<<"缺页率为百分之"<<merge_time/3.2<<endl;
}
int OPT_sort(int j)     //求最长未被使用的时间  返回的是页面在page_in 的id
{
    int max_opt=0;
    for(int i=0;i<4;i++)
    {
        page_in[i].opt_time=0;
        int temp=1;
        int temp_j=j;
        while(temp_j<320)
        {
            if(page_in[i].page_id==random_num[temp_j]/10)
            {
                page_in[i].opt_time=temp;
                if(page_in[i].opt_time>page_in[max_opt].opt_time)
                {
                    max_opt=i;
                }
                break;
            }
            else
            {
                temp++;
                temp_j++;
            }
        }

    }
    for(int i=0;i<page_in.size();i++)
    {
        if(page_in[i].opt_time==0)
        {
            return i;
        }else
        {}
    }
    return max_opt;
}
void OPT()
{
    page_in.erase(page_in.begin()+page_in.size()-1);
    merge_time=0;
    for(int i=0;i<320;i++)
    {
        page_print();
        if(in_memory(random_num[i]))   //如果页面在内存里
        {
            cout<<"\t\t执行第"<<i<<"条指令,指令为:"<<random_num[i]<<endl;
            continue;
        }
        else
        {
            if(is_max())       //如果不在内存里面
            {
                merge_time++;
                page_in.erase(page_in.begin()+OPT_sort(i));
                temp.page_id=random_num[i]/10;
                page_in.push_back(temp);
                cout<<"\t\t执行第"<<i<<"条指令,指令为:"<<random_num[i]<<endl;
                continue;
            }
            else
            {
                temp.page_id=random_num[i]/10;
                page_in.push_back(temp);
                cout<<"\t\t执行第"<<i<<"条指令,指令为:"<<random_num[i]<<endl;
                continue;
            }
        }
    }
    cout<<"总共调页:"<<merge_time<<"次"<<endl;
    cout<<"缺页率为百分之"<<merge_time/3.2<<endl;
}
void LRU_time()
{
    for(int i=0;i<page_in.size();i++)
    {
        page_in[i].lru_time++;
    }
}
int max_lrutime()
{
    int max_id=0;
    for(int i=0;i<page_in.size();i++)
    {
        if(page_in[i].lru_time>page_in[max_id].lru_time)
        {
            max_id=i;
        }
        else
        {
            continue;
        }
    }
    return max_id;
}
void LRU()
{
    page_in.erase(page_in.begin()+page_in.size()-1);
    merge_time=0;
    for(int i=0;i<320;i++)
    {
        page_print();
        if(in_memory(random_num[i]))   //如果页面在内存里
        {
            LRU_time();
            for(int i1=0;i1<page_in.size();i1++)
            {
                if(page_in[i1].page_id==random_num[i]/10)
                {
                    page_in[i1].lru_time=0;
                    break;
                }
            }
            cout<<"\t\t执行第"<<i<<"条指令,指令为:"<<random_num[i]<<endl;
            continue;
        }
        else
        {
            if(is_max())     //满了调页
            {
                merge_time++;
                LRU_time();
                page_in.erase(page_in.begin()+max_lrutime());
                temp.page_id=random_num[i]/10;
                temp.lru_time=0;
                page_in.push_back(temp);
                cout<<"\t\t执行第"<<i<<"条指令,指令为:"<<random_num[i]<<endl;
                continue;


            }
            else
            {
                LRU_time();
                temp.page_id=random_num[i]/10;
                temp.lru_time=0;
                page_in.push_back(temp);
                cout<<"\t\t执行第"<<i<<"条指令,指令为:"<<random_num[i]<<endl;
                continue;
            }
        }
    }
    cout<<"总共调页:"<<merge_time<<"次"<<endl;
    cout<<"缺页率为百分之"<<merge_time/3.2<<endl;
}
void print_num()
{
    for(int i=0;i<320;i++)
    {

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值