⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 存byc.txt

📁 模拟分页式存储管理中硬件的地址转换和用先进先出调度算法(FIFO)处理缺页中断
💻 TXT
字号:
/****************************************************************************/

/*                           实验一:                                        */

/* 模拟分页式存储管理中硬件的地址转换和用先进先出调度算法(FIFO)处理缺页中断 */

/****************************************************************************/

//源程序:

#include "iostream.h"

#include "math.h"

#include "stdio.h"

//页面表结构

struct Cpageform {

       int pagenumber;   //页面号

       int biaozhi;          //标志

       int kuaihao;         //块号

       int xgbz;              //修改标志

       int cpwz;            //磁盘位置

};

 

//操作结构

struct Cwork {              

       char caozuo;          //操作名

       int  pagenumber;   //页号

       int  pageaddress;   //页面地址

 };

//页面表初值

Cpageform  pageform[]={  {0,1,5,0,0x11},

                           {1,1,8,0,0x12},

                           {2,1,9,0,0x13},

                           {3,1,1,0,0x21},

                           {4,0,0,0,0x22},

                           {5,0,0,0,0x23},

                           {6,0,0,0,0x12},

                        };

//操作序列初值共12条操作

Cwork    work[]={    {'+',0,0x70},{'+',1,0x50},

                {'*',2,0x15},{'s',3,0x21},

                {'f',0,0x56},{'-',6,0x40},

                {'m',4,0x53},{'+',5,0x23},

                {'s',1,0x37},{'f',2,0x78},

                {'+',4,0x01},{'s',6,0x84}

             };

//已装入主存的页面数

const int m=4;

//页号队列

int p[]={0,1,2,3};

//声明FIFO页面调度函数

void fifo1(int p[],int,int&,int);

//主函数

void main()

{//输出“start”

  cout<<endl<<"start"<<endl;

  //

  int k=0; //要装入新页面是应调出的页的位置,初值为0

  int l; 

  int j=0;

  int i;

   for( i=0;i<12;i++)  //顺序执行操作队列

    {     //取指令中访问的页号   

              l=work[i].pagenumber;

              cout<<endl<<"beging page"<<endl;

         //查页面表中页号为l的页面

  L1:     j=0;

       while ( l != pageform[j].pagenumber && j<7 )

       {j=j+1;}

       //如果页面的标志不为1,即页面已修改过则产生缺页中断

     if (pageform[j].biaozhi!=1)

       {     //输出中断页号 

               cout<<"interrupt:"<<" * "<<pageform[j].pagenumber<<endl;

               //调用FIFO页面调度函数.

               fifo1( p,l,k,j);

               //重新查询页面表

               goto L1;

       }

       //页面未被修改时进行的操作

       long int address;  // 绝对地址=页面地址+1024×块号

       address=1024*pageform[j].kuaihao;

       address=address+work[i].pageaddress;

       //如果操作是“保存”,则修改页面修改标志

       if (work[i].caozuo=='s')

        {pageform[j].biaozhi=1;}

       输出页号和绝对地址

       cout<<"pagenumber:"<<pageform[j].pagenumber<<" ";

       cout<<"absolute address="<<address<<endl;

    }

 }

//FIFO页面调度函数,int p[] :页面队列,int l:操作页号,int& k:要装入新页面时应调出的页的位置,

//int j:中断页

void fifo1(int p[] ,int l,int& k,int j)

{  int pp;

   //获得应调出的页的页号

   pp=p[k];

   //如果J页已修改,则输出J页

   if (pageform[j].xgbz==1) 

   {cout<<"out:"<<j<<endl;}

   //如果未被修改则调入操作页

   cout<<"in:"<<l<<endl;

   //修改主存中页面指向的页号

   p[k]=l;

   //修改要装入新页面时应调出的页的位置

   k=int(fmod((k+1),m));

   //修改页面表

   pageform[pp].biaozhi=0;

   pageform[l].biaozhi=1;

 

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -