#操作系统#C++请求调页存储管理方式的模拟

  • 实验内容

(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;
//r = rand()%(n - m + 1) + m;用下列公式即可得到指定范围[m,n]的随机数



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()  //先进先出算法
{
    //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());
                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)
                {
                    //page_in[i].opt_time=temp;
                    max_opt=i;

                }
                break;
            }
            else
            {
                temp++;
                temp_j++;
            }
        }

    }
    /*cout<<endl<<"opt_time:";
    for(int i1=0;i1<4;i1++)
    {
        cout<<page_in[i1].opt_time<<endl;
    }*/
    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_t=0;
    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;
}

  • 运行结果:
  • 在这里插入图片描述FIFO算法缺页率为百分之42.5。
  • 在这里插入图片描述
    OPT算法缺页率为34%
    在这里插入图片描述LRU算法缺页率为43.75%
展开阅读全文

没有更多推荐了,返回首页