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

📄 存储管理.cpp

📁 一个用C做得存储管理
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>



struct type{
int address;
int mingzhong;
int pagenumber;
}virtualpage[13]={{0},{0},{3728},{11023},{11024},{20055},{7800},{9096},{6800},{13728},{10000},{4234},{4521}};

int table[33]={0};   //页表
int later[33]={0};   
int efficiency,pagesize,pagenumber;
int output[13][33];     

void init();
void OPT();
void LRU();
void action();
void push(int);
void print();

void main()
{init();
action();

}

void init()     //得到用户输入的页面尺寸及页数,并初始化实际应用到的virtualpage的页数
{int i; 
printf("请输入页面尺寸,以k为单位(1--8之间)\n");
scanf("%d",&pagesize);
printf("请输入主存页数(4--32之间)\n");
scanf("%d",&pagenumber);
	for(i=1;i<=12;i++)
virtualpage[i].pagenumber=1+virtualpage[i].address/(pagesize*1024); 
	                              //初始化实际应用到的virtualpage的页数
 }



void action()
{	int i,j,select;
	char c;
	while(1)
{for(i=1;i<=pagenumber;i++)
	{table[i]=0;      //清空页表
	efficiency=0;     //命中率初值=1
	}            
for(i=1;i<=12;i++)
{for(j=1;j<=pagenumber;j++)
	output[i][j]=0;            //清空所要输出的所有页表信息
virtualpage[i].mingzhong=0;    //当前虚页的命中标志=0
}
printf("\n请选择替换算法\n1.OPT算法      2.LRU算法\n");
scanf("%d",&select);
if(select==1)
OPT();      //调用OPT()算法进行页面管理
else
LRU();      //调用LRU()算法进行页面管理

print();   //打印每次页面的信息及每次的命中情况
getchar();
printf("\n\n您想继续吗?(y/n)\n");
	scanf("%c",&c);
	if(c=='n')
	break;}
}



void OPT()
{int current,j,k,m,i,max,pagedelete,h;
	for(current=1;current<=12;current++)
	{for(j=1;j<=pagenumber;j++)
      if(virtualpage[current].pagenumber==table[j])//虚页号已存在于页表中
		{virtualpage[current].mingzhong=1; //命中标志=1
	     efficiency++;    //命中次数+1
	     break;
			}
	  else if(table[j]==0)
	  {table[j]=virtualpage[current].pagenumber;  //如果是0,表明页表中仍有空位
	    break;}

	if(j==pagenumber+1)            //虚页号不在页表中,根据替换算法OPT进行淘汰
	{  for(k=1;k<=pagenumber;k++)
	   { for(m=current+1;m<=12;m++)      //later数组的维数=虚地址流的个数
				if(table[k]==virtualpage[m].pagenumber)
				 {later[k]=m;
				break;}      //若虚页地址流的第m个与当前虚页地址相等,则将m记录在later数组中,以备随后的比较
		   if(m==13)
				later[k]=100;  //表明今后该虚页未在虚地址流中出现过,将无穷大记录在later数组的对应单元中
	   }
	   max=later[1];        
	   pagedelete=1;
	for(h=2;h<=pagenumber;h++)
		if(later[h]>max)
		{	max=later[h];
            pagedelete=h;
		}                       //比较later中的各个单元,将值最大的---即最久才出现或根本未出现的找到
	table[pagedelete]=virtualpage[current].pagenumber;  //找到后,将此虚页替换掉
	}
  for(i=1;i<=pagenumber;i++)
      output[current][i]=table[i];//将每次页表中内容保存以备输出
	}
}

void LRU()
{
	int current,i,j;
	for(current=1;current<=12;current++)
	{for(j=1;j<=pagenumber;j++)
      if(virtualpage[current].pagenumber==table[j])//虚页号已存在于页表中
		{virtualpage[current].mingzhong=1; //标志命中
	     efficiency++;    //命中次数+1
		 push(j);     //命中后,调用push函数,把新的虚页移到链首
	   break;}

	if(j==pagenumber+1) //虚页号不在页表中,根据替换算法LRU进行淘汰链尾
      	{for(i=pagenumber;i>=2;i--)
		  table[i]=table[i-1];         //将table的1,2,...pagenumber-单元依次下移一个单元   
	  table[1]=virtualpage[current].pagenumber;  //将新来的页表放在链首 
	}
	for(i=1;i<=pagenumber;i++)
 output[current][i]=table[i]; //将每次页表中内容保存以备输出
}

	}


void push(int j)
{int temp,i;
if(j!=1)    //命中后,如果命中的页不在链首,才执行下列操作,否则不予执行(没有执行的必要)
{temp=table[j];  //先保存新的虚页
	for(i=j-1;i>=1;i--)
		table[i+1]=table[i];  //将此单元以上内容下移
table[1]=temp; //把新的虚页放到链首
}
}


void print()        //打印一系列输出信息
{int i,j;
printf("\n虚页号:  ");  //输出虚页地址流
for(i=1;i<=12;i++)
	printf("%d    ",virtualpage[i].pagenumber);
printf("\n         ---------------------------------------------------------\n");
printf("页表内容:");     
	for(i=1;i<=pagenumber;i++)
	{for(j=1;j<13;j++)
	printf("%d    ",output[j][i]);   //输出每次页表内容
  printf("\n          ");
	}
printf("--------------------------------------------------------\n命中情况:");
for(i=1;i<=12;i++)
if(virtualpage[i].mingzhong==1)   //输出每次命中情况
printf("H    ");
else
printf("     ");
printf("\n\n");
printf("              ******* 命中率= %d/12 = %f%% *******",efficiency,float(efficiency)/12*100);
                            //输出命中率
}

⌨️ 快捷键说明

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