(操作系统)模拟操作系统的页面置换

来源:互联网 发布:软件开发项目风险管理 编辑:程序博客网 时间:2024/05/22 14:34

一、   需求分析

设计程序模拟先进先出(FIFO)置换算法,最佳(OPT)置换算法和最近最少用(LRU)置换算法的工作过程。假设内存中分配给每个进程的最小物理块数为m,在进程运行过程中要访问的页面个数为n,页面访问序列为P1, … ,Pn,分别利用不同的页面置换算法调度进程的页面访问序列,给出页面访问序列的置换过程,计算每种算法缺页次数和缺页率。

程序的设计主要是测试先进先出FIFO,最佳置换OPT和最近最少用LRU页面置换算法的效率以及过程,对于程序员设计有很多帮助,不同的场合用不同的算法可以提高程序的效率。

二、详细设计

1、数据结构

   int a[320];//存放320条指令

   int p;//存放页大小

   int page[320];//存放合并后要使用的页号

   int PageNumber;//存放页号数量

   int piece;//存放块数

2、算法流程图

a.先进先出(FIFO)置换算法:


b.最近最少用(LRU)置换算法:


c.最佳(OPT)置换算法:


三、 软件测试              

1、如图一所示,通过随机数产生一个指令序列,共320条指令。指令的地址按下述原则生成:

A:50%的指令是顺序执行的

B:25%的指令是均匀分布在前地址部分

C:25%的指令是均匀分布在后地址部分

具体的实施方法是:

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

B:顺序执行一条指令,即执行地址为m+1 的指令

C:在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m'

D:顺序执行一条指令,其地址为m'+1

E:在后地址[m'+2,319]中随机选取一条指令并执行 F:重复步骤A-E,直到320 次指令


图1.指令地址

2、如图2所示,页面大小的取值范围为1K,2K,4K,8K,16K。按照页面大小将指令地址转化化为页号。对于相邻相同的页号,合并为一个。


图2.合并后的页地址流

3.选择不同的块数和不同的页面置换算法会得出不同的缺页率,为了方便观察比较,下面选取相同的块数(4块)和不同的页面置换算法,求出缺页率。如图3-a,3-b,3-c所示:


图3-a.最佳置换算法(节选)

三、 总结

本次实验主要用DOS界面实现模拟操作系统的页面置换功能。在本次实验中,没有用到MFC界面,使得实验数据冗长,不过也更能直观反应是否缺页,便于统计。实现先进先出、最近最少用和最佳置换算法时候,一开始的思路都有初始化进入内存块数的页数的函数,后来再次看的时候发现太冗长而且没有这个必要。

附:源程序

//PageReplacement.cpp

#include<iostream>

#include<time.h>

#include<iomanip>

#include"FIFO.h"

#include"LRU.h"

#include"OPT.h"

using namespace std;

void Random(int a[],int n);

int Translate(int a[],int Page[],intn,int p);

int main()

{

    inta[320];//存放320条指令

    inti=1;

    intp;//存放页大小

    intpage[320];//存放合并后要使用的页号

    intPageNumber;//存放页号数量

    intpiece;//存放块数

    boolflag=true;

    while(flag)

    {

    switch(i)

    {

    case1:

    Random(a,320);

    case2:

    cout<<"请输入页大小(1K、2K、4K、8K、16K、):";

    cin>>p;

    PageNumber=Translate(a,page,320,p);

    cout<<"将相邻相同的页号合并为一个后要使用到的页号数为"<<PageNumber<<"个"<<endl;

    case3:

    cout<<"请输入块数(1~"<<32/p<<"):";

    cin>>piece;

    case4:

    cout<<"请选择页面置换算法(1~3)"<<endl;

    cout<<"1.最佳置换算法(OPT)"<<endl;

    cout<<"2.先进先出置换算法(FIFO)"<<endl;

    cout<<"3.最近最少用置换算法(LRU)"<<endl;

    cin>>i;

    switch(i)

    {

    case1:OPT(page,PageNumber,piece,32/p);break;

    case2:FIFO(page,PageNumber,piece,32/p);break;

   case 3:LRU(page,PageNumber,piece,32/p);break;

    default:cout<<"输入有误"<<endl;break;

    }

    cout<<"*****************************"<<endl;

    cout<<"*****1.重新开始"<<endl;

    cout<<"*****2.返回重新输入页大小"<<endl;

    cout<<"*****3.返回重新输入块数"<<endl;

    cout<<"*****4.返回重新选择页面置换算法"<<endl;

    cout<<"*****5.结束程序"<<endl;

    cin>>i;break;

    default:flag=false;

    }

    }

    return0;

}

void Random(int a[],int n)

{

    cout<<"指令如下:"<<endl;

    intm,i=0;

    srand(unsignedint(time(NULL)));

    while(i<n)

    {

       a[i++]=rand()%n;

       m=a[i]=a[i-1]+1;

       a[++i]=rand()%(m+1);

       i++;

       m=a[i]=a[i-1]+1;

       a[++i]=rand()%(n-m+1)+m+1;

       i++;

    }

    for(i=0;i<n;i++)

    {

       cout<<a[i]<<setw(4);

       if((i+1)%10==0)

           cout<<endl;

    }

    cout<<endl;

}

int Translate(int a[],int Page[],intn,int p)

{

    cout<<"页面调度序列如下:"<<endl;

    inti,j=0;

    inttemp=-1,result;

    for(i=0;i<n;i++)

    {

       result=a[i]/(p*10);

       if(result!=temp)

           temp=Page[j++]=result;

    }

    for(i=0;i<j;i++)

    {

       cout<<Page[i]<<setw(4);

       if((i+1)%10==0)

           cout<<endl;

    }

    cout<<endl;

    returnj;

}

 

.\FIFO.H

//先进先出置换算法

#include<iostream>

#include<iomanip>

using namespace std;

//输出函数

void Output1(int *p,int n)

{

    for(inti=0;i<n;i++)

       cout<<p[i]<<setw(4);

}

void FIFO(int Page[],int n,intpiece,int total)

{

    inti,number=0,j,position=0;

    intrate=0;

    int*p=new int [piece];

    for(i=0;i<piece;i++)

       p[i]=-1;//内存块数赋初值

       for(i=0;i<n;i++)

       {

           cout<<i+1<<"";

           cout<<Page[i]<<":"<<setw(4);

           for(j=0;j<piece&&p[j]!=Page[i];j++)//查找是否缺页

              ;

           if(p[j]==Page[i])

           {

              Output1(p,piece);

              cout<<"不缺页"<<endl;

           }

           else

           {

              rate++;

              for(j=0;j<piece-1;j++)//缺页处理

                  p[j]=p[j+1];

              p[j]=Page[i];

              Output1(p,piece);

              cout<<"缺页"<<endl;

           }

       }

       cout<<"缺页次数:"<<rate<<""<<"总数"<<n<<endl;

    cout<<"先进先出置换算法(FIFO)缺页率为"<<(double)rate/n*100<<"%"<<endl;

    delete[]p;

}

.\LRU.H

//最近最少用置换算法

#include<iostream>

#include<iomanip>

using namespace std;

void LRU(int Page[],int n,int piece,inttotal)

{

    inti,number=0,j,position=0;

    intrate=0;

    inttemp;

    int*p=new int [piece];

    for(i=0;i<piece;i++)

       p[i]=-1;//内存块数赋初值

       for(i=0;i<n;i++)

           {

               cout<<i+1<<" ";

              cout<<Page[i]<<":"<<setw(4);

              for(j=0;j<piece&&p[j]!=Page[i];j++)//查找是否缺页

              ;

               if(p[j]==Page[i])//不缺页处理

              {

                  temp=p[j];

                  while(j<piece-1)

                  {

                     p[j]=p[j+1];

                     j++;

                  }

                  p[j]=temp;

              Output1(p,piece);

              cout<<"不缺页"<<endl;

              }

              else//缺页处理

              {

              rate++;

              for(j=0;j<piece-1;j++)

                  p[j]=p[j+1];

              p[j]=Page[i];

              Output1(p,piece);

              cout<<"缺页"<<endl;

              }

       }

    cout<<"缺页次数:"<<rate<<""<<"总数"<<n<<endl;

    cout<<"最近最少用置换算法(LRU)缺页率为"<<(double)rate/n*100<<"%"<<endl;

    delete[]p;

}

 

.\OPT.H

//最佳置换算法

#include<iostream>

#include<iomanip>

using namespace std;

void OPT(int Page[],int n,int piece,inttotal)

{

    inti,number=0,j,position=0,temp;

    intrate=0;

    int*p=new int [piece];

    int*flag=new int[total];

    //标记页数在内存的情况,0:不在内存块,1:在内存块,2:以后会再次访问并且已经在内存块的

    for(i=0;i<piece;i++)

       p[i]=-1;//内存块数赋初值

    for(i=0;i<total;i++)

       flag[i]=0;

    for(i=0;i<n;i++)//缺页处理

    {

       cout<<i+1<<"";

       if(flag[Page[i]]!=1)

       {

           rate++;

           j=i+1;

           temp=piece;

           while(temp!=1&&j<n)

           {

              if(flag[Page[j]]==1)

              {

                  flag[Page[j]]=2;

                  temp--;

              }

              j++;

           }

           for(j=0;j<piece;j++)

              if(flag[p[j]]==1)

                  temp=j;

              elseflag[p[j]]=1;

           flag[p[temp]]=0;

           flag[Page[i]]=1;

           p[temp]=Page[i];

       cout<<Page[i]<<":"<<setw(4);

       Output1(p,piece);

       cout<<"缺页"<<endl;

       }  

       else

       {

           cout<<Page[i]<<":"<<setw(4);

           Output1(p,piece);

           cout<<"不缺页"<<endl;

       }

    }

    cout<<"缺页次数:"<<rate<<""<<"总数"<<n<<endl;

    cout<<"最佳置换算法(OPT)缺页率为"<<(double)rate/n*100<<"%"<<endl;

    delete[]p;

    delete[]flag;

}



0 0
原创粉丝点击