操作系统之存储管理

设计:

(1)通过计算不同算法的命中率比较算法的优劣。同时也考虑了用户内存容量对命中率的影响。

页面失效次数为每次访问相应指令时,该指令所对应的页不在内存中的次数。

在本实验中,假定页面大小为1k,用户虚存容量为32k,用户内存容量为4页到32页。

(2)produce_addstream通过随机数产生一个指令序列,共320条指令。

    A、指令的地址按下述原则生成:

            1)50%的指令是顺序执行的

            2)25%的指令是均匀分布在前地址部分

            3)25%的指令是均匀分布在后地址部分

    B、具体的实施方法是:

            1)在[0,319]的指令地址之间随机选取一起点m;

            2)顺序执行一条指令,即执行地址为m+1的指令;

            3)在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’;

            4)顺序执行一条指令,地址为m’+1的指令

            5)在后地址[m’+2,319]中随机选取一条指令并执行;

            6)重复上述步骤1)~5),直到执行320次指令

    C、将指令序列变换称为页地址流

          在用户虚存中,按每k存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:

          第0条~第9条指令为第0页(对应虚存地址为[0,9]);

          第10条~第19条指令为第1页(对应虚存地址为[10,19]);

          ......

          第310条~第319条指令为第31页(对应虚存地址为[310,319]);

          按以上方式,用户指令可组成32页。

(3)计算并输出下属算法在不同内存容量下的命中率。

        1)先进先出的算法(FIFO);

        2)最近最少使用算法(LRU);

        3)最佳淘汰算法(OPT);

        4)最少访问页面算法(LFR);

        其中3)和4)为选择内容


系统框图:

操作系统之存储管理

页面置换算法程序代码:

#include<stdio.h>
#include<string.h>
#include<iostream.h>
const int MAXSIZE=1000;//定义最大页面数 
const int MAXQUEUE=3;//定义页框数
typedef struct node
{ int loaded; int hit;
}page;
page pages[MAXQUEUE];                            //定义页框表 
int queue[MAXSIZE];
int quantity;                                          //初始化结构函数 
void initial()
{
      int i;
      for(i=0;i<MAXQUEUE;i++)
      {
             pages[i].loaded=-1;
             pages[i].hit=0; }
      for(i=0;i<MAXSIZE;i++)
      {
             queue[i]=-1;
      }
      quantity=0;
}                                                //初始化页框函数 
void init()
{
      int i;
      for(i=0;i<MAXQUEUE;i++)
      {
      pages[i].loaded=-1;
      pages[i].hit=0;
      }
}                                                 //读入页面流
void readData()
{
      FILE *fp;
      char fname[20];
      int i;
      cout<<"请输入页面流文件名:";
      cin>>fname;
      if((fp=fopen(fname,"r"))==NULL)
      {
             cout<<"错误,文件打不开,请检查文件名";
      }
      else
      {
             while(!feof(fp))
             {
                    fscanf(fp,"%d ",&queue[quantity]);
                    quantity++;
             }
      }
      cout<<"读入的页面流:";
      for(i=0;i<quantity;i++)
      {
             cout<<queue[i]<<" ";
      }
}                                            //FIFO调度算法
void FIFO()
{
      int i,j,p,flag;
      int absence=0;
      p=0;
      cout<<endl<<"----------------------------"<<endl;
      cout<<"先进先出调度算法(FIFO)页面调出流:";
      for(i=0;i<quantity;i++)
      { flag=0;
      for(j=0;j<MAXQUEUE;j++)
      {
             if(pages[j].loaded==queue[i])
             { flag=1; }
      }
      if(flag==0)
      {
             if(absence>=MAXQUEUE)
             { cout<<pages[p].loaded<<" "; }
             pages[p].loaded=queue[i];
             p=(p+1)%MAXQUEUE;
             absence++;
      }
      }
      absence-=MAXQUEUE;
      cout<<endl<<"总缺页数:"<<absence<<endl; }            //最近最少使用调度算法(LRU)
void LRU()
{
      int absence=0;
      int i,j;
      int flag;
      for(i=0;i<MAXQUEUE;i++)
      { pages[i].loaded=queue[i]; }
      cout<<endl<<"---------------------"<<endl;
      cout<<"最近最少使用调度算法(LRU)页面流:";
      for(i=MAXQUEUE;i<quantity;i++)
      { flag=-1;
      for(j=0;j<MAXQUEUE;j++)
      {
             if(queue[i]==pages[j].loaded)
             { flag=j; }
      } //CAUTION pages[0]是队列头
      if(flag==-1)
      {
//缺页处理
             cout<<pages[0].loaded<<" ";
             for(j=0;j<MAXQUEUE-1;j++)
             {
                    pages[j]=pages[j+1];
             }
             pages[MAXQUEUE-1].loaded=queue[i];
             absence++; }
      else
      {
//页面已载入 
             pages[quantity]=pages[flag];
             for(j=flag;j<MAXQUEUE-1;j++)
             {
                    pages[j]=pages[j+1];
             }
             pages[MAXQUEUE-1]=pages[quantity];
      }
      }
      cout<<endl<<"总缺页数:"<<absence<<endl;
}                                                          //显示 
void version()
{
      cout<<"     /*******************虚拟存储管理器的页面调度****************/"<<endl;
      cout<<endl;
       }
void main()
{
      version();
      initial();
      readData();
      FIFO();
      init();
      LRU();
      init();
      init();
}

运行结果:

运行程序前先新建一个页面流文件文件(格式为*.txt),在文件中存储的是一系列页面号(页面号用整数表示,用空格作为分隔符),用来模拟待换入的页面。例如: 14 5 18 56 20 25 6 3 8 17

操作系统之存储管理

你可能感兴趣的:(操作系统,存储管理)