操作系统实验四 页式虚拟存储管理页面置换算法

  • 设计目的

 

通过请求页式存储管理中页面置换算法模拟程序,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。

 

  • 设计内容

 

阅读教材《计算机操作系统》第四章,掌握存储器管理相关概念和原理。

模拟实现页式虚拟存储管理的三种页面置换算法(OPT、FIFO和LRU),并通过比较性能得出结论。

前提:

(1)页面分配采用固定分配局部置换。

(2)作业的页面走向和分得的物理块数预先指定。可以从键盘输入也可以从文件读入。

(3)置换算法的置换过程输出可以在显示器上也可以存放在文件中,但必须清晰可读,便于检验。

 

  • 基本原理和解决方案

 

存储管理是操作系统进行资源管理的一个重要功能。现代操作系统广泛采用虚拟存储的技术对内存进行扩充。实现虚拟存储的一个主要技术手段就是将辅存和主存统一管理,在二者之间进行对换,从而形成物理上两级而逻辑上一级的存储管理系统。一个置换算法的好坏对这个逻辑上的单级虚存的性能起着极其重要的作用,而且会影响处理机的调度性能。

对于本任务规定的前提:页面分配采用固定分配局部置换,则置换发生的时机是作业已经将操作系统分配的固定数目的物理块全部用完且发生缺页的时候。此时必须要将已经装入内存的部分逻辑页面换出以便将所缺的页面调入内存。置换算法就是一个决定将内存中“哪一个”页面换出的算法。

 

 

  • 实验内容

 

1.通过随机数产生一个指令序列,共320条指令,指令的地址按下述原则生产:

 50%的指令是顺序执行的;

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

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

2.将指令序列变换成为页地址流

       设页面大小为1K;用户内存容量为4页到32页;用户虚存容量为32K。

 在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:第0条至第9条指令为第0页;第10条至19条指令为第1页;…第310条至319条指令为第31页。

3.计算并输出下述各种算法在不同内存容量下的命中率。

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

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

     (3) 最佳使用算(OPT)

       命中率=1-页面失效次数/页地址流长度

本实验中,页地址流长度为320,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。

代码:

#include 
#include
#include
#include
#define Myprintf printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n") /*表格控制*/ 
#define bsize 4     //物理块大小
#define psize 16     //进程大小
typedef struct page 
{ 
       int num;  /*记录页面号*/ 
       int time;  /*记录调入内存时间*/ 
}Page;                   /* 页面逻辑结构,结构为方便算法实现设计*/ 
Page b[bsize];            /*内存单元数*/ 
int c[bsize][psize];   /*暂保存内存当前的状态:缓冲区*/ 
int queue[100];      /*记录调入队列*/ 
int K;             /*调入队列计数变量*/ 
int phb[bsize]={0};   //物理块标号
int pro[psize]={0};   //进程序列号
int flag[bsize] = {0};  //进程等待次数(存放最久未被使用的进程标志)
int i = 0, j = 0,k = 0;   //i表示进程序列号,j表示物理块号
int m = -1, n = -1;       //物理块空闲和进程是否相同判断标志
int max = -1,maxflag = 0; //标记替换物理块进程下标
int count = 0;            //统计页面缺页次数


//随机产生序列号函数

int* build()
{
	printf("随机产生一个进程序列号为:\n");
	int i = 0;
    for(i=0; imaxflag)
             {
                 maxflag = flag[j];
                 max = j;
             }
        }   
        if(n == -1)               //不存在相同进程
		{
           if(m != -1)            //存在空闲物理块
           {
			   phb[m] = pro[i];   //进程号填入该空闲物理块
			   count++;
               flag[m] = 0;
               for(j = 0;j <= m; j++)
               {
                  flag[j]++;
               }
               m = -1;
           }
           else                //不存在空闲物理块
           {
              phb[max] = pro[i];
              flag[max] = 0;
              for(j = 0;j < bsize; j++)
              {
                 flag[j]++;
              }
              max = -1;
              maxflag = 0;
              count++;
           }
       }
       else                    //存在相同的进程
       {
		   phb[n] = pro[i];
           for(j = 0;j < bsize; j++)
           {
			   flag[j]++;
           }
           n = -1;
       }
       for(j = 0 ;j < bsize; j++)
       {
		   printf("%d  ",phb[j]);
       }
       printf("\n");
    }
    printf("缺页次数为:%d\n",count);
	printf("\n");

}

/*初始化内存单元、缓冲区*/ 

void Init(Page *b,int c[bsize][psize]) 
{ 
       int i,j; 
       for(i=0;imax) 
              { 
                     max=b[i].time; 
                     tag=i; 
              } 
       } 
       return tag; 
}

/*判断页面是否已在内存中*/ 

int   Equation(int fold,Page *b) 
{ 
       int i; 
       for(i=0;i=0) 
       { 
              b[val].time=0; 
              for(i=0;i");
    	scanf("%d",&sel);
    	switch(sel)
		{
    	  case0:printf("\t\t\t再见 \t\t\t\n");system("pause");break;
		  case 1:build();break;
          case 2:printf("最久未使用算法\n");LRU();empty();printf("\n");break;
		  case 3:printf("先进先出算\n");FIFO();empty();printf("\n");break;
	      case 4:printf("先进先出算法\n");FIFO();empty();
					printf("最久未使用算法\n");LRU();empty();break;
          default: printf("请输入正确的选项号");printf("\n\n");break;
		}
	}while(sel!=0);
}

运行结果:

操作系统实验四 页式虚拟存储管理页面置换算法_第1张图片

你可能感兴趣的:(操作系统,操作系统,实验报告)