页面置换算法;最佳置换算法、先进先出置换算法、最近最久未使用置换算法

一、  实验目的和要求

1.  了解虚拟存储技术的特点。

2.  掌握请求页式存储管理的页面置换算法,如最佳(Optimal)置换算法、先进先出(Fisrt In First Out)置换算法和最近最久未使用(LeastRecently Used)置换算法。

二、    实验内容

设计模拟实现OPT、FIFO和LRU页面置换算法的C语言程序。

1.  OPT算法:需要发生页面置换时,算法总是选择在将来最不可能访问的页面进行置换。

2.  FIFO算法:算法总是选择在队列中等待时间最长的页面进行置换。

3.  LRU算法:如果某一个页面被访问了,它很可能还要被访问;相反,如果它长时间不被访问,那么,在最近未来是不大可能被访问的。

 

三、  实验步骤

1.  使用C++语言编译程序。

2.  完成算法代码。

3.  运行程序,算出结果。

四、     实验源程序

代码:

//’*’代表缺页

#include

#include

#include

#include

#include

#include

#include

#include

#define MAX 1111

int mark[MAX];

using namespace std;

typedef structpage_replacement_algorithm

{

   char page;

   char interrupt;

}PRA;

char ans[MAX][MAX];

void FIFO()

{

   memset(ans,'0',sizeof(ans));

   queue q;

   PRA pra[MAX];

   int n,m;

   printf("请输入页面走向(字符表示)和物理块数(整型):\n");

   scanf("%d %d",&n,&m);

   getchar();

   printf("请输入n个字符(不要有空格):\n");

   for(int i=0; i

       scanf("%c",&pra[i].page);

       q.push(pra[i].page);

   }

   queue qq;

   int cnt = 0,tot = 0;

   for(int i=0; i

       qq = q;

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

            ans[j][i] = qq.front();

            qq.pop();

       }

       pra[i].interrupt = '*';

   }

   q = qq;

   for(int j=m,i=0; j

       bool flag = true;

       while(i < m){

            ans[i][j] = ans[i][j-1];

            if(ans[i][j] == q.front()&& flag){

                q.pop();

                flag = false;

            }

            i++;

       }

       if(flag){

            pra[j].interrupt = '*';

            for(int r=0; r

                ans[r][j] = ans[r+1][j];

           ans[m-1][j] = q.front();

            q.pop();

       }

       else{

            pra[j].interrupt = ' ';

       }

   }

   printf("\n先进先出置换算法:\n");

   printf("%8s:","页面走向");

   for(int r=0; r

   printf("\n");

   for(int i=0; i

       printf("%6s%2d:","物理块",i+1);

       for(int j=0; j

   printf("\n");

   }

   printf("%8s:","缺页中断");

   for(int r=0; r

   printf("\n");

}

 

void LRU()

{

   memset(ans,'0',sizeof(ans));

   PRA pra[MAX];

   int n,m;

   printf("请输入页面走向(字符表示)和物理块数(整型):\n");

   scanf("%d %d",&n,&m);

   getchar();

   printf("请输入n个字符(不要有空格):\n");

   for(int i=0; i

   for(int i=0; i

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

            ans[j][i] = pra[j].page;

       }

       pra[i].interrupt = '*';

   }

   for(int i=m; i

       bool flag = true;

       for(int j=0; j

            ans[j][i] = ans[j][i-1];

            if(ans[j][i] == pra[i].page){

                pra[i].interrupt = ' ';

                flag = false;

            }

       }

       if(flag){

            pra[i].interrupt = '*';

           for(int j=0; j

                if(ans[j][i] == pra[i-m].page){

                    ans[j][i] = pra[i].page;

                    break;

                }

            }

       }

   }

   printf("最近最久未使用置换算法:\n");

   printf("%8s:","页面走向");

   for(int r=0; r

   printf("\n");

   for(int i=0; i

       printf("%6s%2d:","物理块",i+1);

       for(int j=0; j

   printf("\n");

   }

   printf("%8s:","缺页中断");

   for(int r=0; r

   printf("\n");

}

 

void OPT()

{

   memset(ans,'0',sizeof(ans));

   memset(mark,0,sizeof(mark));

   PRA pra[MAX];

   int n,m;

   printf("请输入页面走向(字符表示)和物理块数(整型):\n");

   scanf("%d %d",&n,&m);

   getchar();

   printf("请输入n个字符(不要有空格):\n");

   for(int i=0; i

   for(int i=0; i

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

            ans[j][i] = pra[j].page;

       }

       pra[i].interrupt = '*';

   }

   for(int i=m; i

       bool flag = true;

       for(int j=0; j

            ans[j][i] = ans[j][i-1];

            if(ans[j][i] == pra[i].page){

                pra[i].interrupt = ' ';

                flag = false;

            }

       }

       int im;

       bool Goto = true;

       int tot = 0;

       if(flag){

            pra[i].interrupt = '*';

           for(int t=i; t

                for(int j=0; j

                    if(ans[j][i] == pra[t].page&& !mark[pra[i].page]){

                        mark[pra[i].page] = 1;

                        tot++;

                        if(tot == 3){

                            ans[j][i] =pra[i].page;

                            Goto = false;

                            break;

                        }

                    }

                    else if(ans[j][i] !=pra[t].page) im = j;

                }

                if(!Goto) break;

            }

            if(tot<3) ans[im][i] =pra[i].page;

       }

   }

   printf("\n最佳置换算法:\n");

   printf("%8s:","页面走向");

   for(int r=0; r

   printf("\n");

   for(int i=0; i

       printf("%6s%2d:","物理块",i+1);

       for(int j=0; j

   printf("\n");

   }

   printf("%8s:","缺页中断");

   for(int r=0; r

   printf("\n");

}

int main()

{

   printf("*********************************************************************欢迎您!*********************************************************************\n");

   int ca = 0;

   do{

       printf("\n请选择置换算法或结束程序:\n");

       printf("0、结束程序\n1、最佳置换\n2、先进先出\n3、最近最久未使用\n");

       scanf("%d",&ca);

       if(ca == 1) OPT();

       if(ca == 2) FIFO();

       if(ca == 3) LRU();

   }while(ca);

   return 0;

}

五、  实验结果

最佳置换算法:

页面置换算法;最佳置换算法、先进先出置换算法、最近最久未使用置换算法_第1张图片

先进先出置换算法:

 页面置换算法;最佳置换算法、先进先出置换算法、最近最久未使用置换算法_第2张图片

最近未使用置换算法:

页面置换算法;最佳置换算法、先进先出置换算法、最近最久未使用置换算法_第3张图片


你可能感兴趣的:(算法,C++,操作系统,操作系统,页面置换算法)