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

📄 存储管理源程序.cpp

📁 一个用c语言编写的存储管理模拟程序
💻 CPP
字号:
//#include <iostream.h>
#include <stdio.h>
#include<math.h>
#define maxsize 32
##include <stdlib.h>
define vpf 200
void FIFO(int a[]);
void LRU(int a[]);
void OPT(int a[]);
void LFU(int a[]);
int count[maxsize];
//int b[pf];
int a[vpf];



void main()
{
for(int i=0;i<200;i++)
  a[i]=rand()%32;

 FIFO(a);
LFU(a);
 OPT(a);	
LRU(a);	
}
void LFU(int a[])
{
	for(int n=4;n<33;n++)
		{
 int num=0;
 int same=0;
 int min;
 int minpage=0;
 int dis=0;
 int i=0;
 int k=0;
 int sum=n;
 int num2=2;
 int b[maxsize];
 
 
 for (k=0;k<n;k++)
    { b[k]=0;
     count[k]=0;}
 for (i=0;i<vpf;i++)
 {num=0;
  for (k=0;k<n;k++)
  {
   if(a[i]==b[k])
   { same=k;
   num++; }
  }
  if(num!=0)
     count[same]++;
  else
  {
    dis++;
    
    if(sum==0)
    {  min=201;
       for(k=0;k<n;k++)
       {
	  if(min>count[k])
	  {
	   min=count[k];
	   minpage=k;
	  }
}
    b[minpage]=a[i];
    if(num2==0)
		for(k=0;k<n;k++)
		{count[k]=0;
		num2=3;}
		count[minpage]=1;
		num2--;
	//count[minpage]=0;
  }
    
  else {
	  {b[n-sum]=a[i];
	if(num2==0)
		for(k=0;k<n;k++)
		{count[k]=0;
		num2=3;}
		num2--;
	  count[n-sum]=1;
	sum--;}
	  //for(k=0;k<4;k++)
	  //count[k]=0;
  }
  }
  //else
     //  for (k=0;k<4;k++)
       //	   count[k]++;
//printf("  a:%3d",a[i]);
 //printf("  b:%3d%3d%3d%3d",b[0],b[1],b[2],b[3]);
  }
 printf("%d",n);
 printf("  page frames LFU:%3d",dis);
 printf("  LFU:%6.4f\n",1-(float)dis/32);
 }
}
void OPT(int a[])

{   
		for(int n=4;n<33;n++)
		{
	int num1=0,num2=0,num3=0,num4=0;
  
  int d;
  int dis=0;
  int b[maxsize];
  int sum=n;
  int max;
  

 int maxpage;

  
  int dist[vpf];
  for(int i=0;i<vpf;i++)
{     num1=0;
      
   for(int j=0;j<n;j++)
     if(a[i]==b[j])
       num1++;

     if(num1==0)
	 {  dis++;
         
  if (sum!=0)
  { b[n-sum]=a[i];
	sum--;
	  

            }
		 //for(int j=0;j<4;j++)
      // if(b[j]==0)
      // {b[j]=a[i];
        
        //}


     else
	 {  for(int k=0;k<vpf;k++)
	     dist[a[k]]=0;
		 for (k=0;k<vpf;k++)
		 {	 num2=0;
		     for(j=0;j<n;j++)
		      
				  if(b[j]==a[k])
                     num2++;
				  if(num2!=0)
					  dist[a[k]]=201;
				  else dist[a[k]]=0;
		 }
         d=1;
        for( k=i+1;k<vpf;k++)
        {  num3=0;
           for(int j=0;j<n;j++)
           if (a[k]==b[j])
			   num3++;
		   if (num3!=0)
		    
		   { num4=0;

           for(int l=i+1;l<k;l++)
		   if (a[k]==a[l])
            num4++;

           
		   if(num4==0)
           dist[a[k]]=d;

           d++;
		  
		} 
		}
        max=-1;
		 maxpage=0;

       for(int c=0;c<vpf;c++)
          if(max<dist[a[c]])
          {max=dist[a[c]];
          maxpage=a[c];
          }

          for(j=0;j<n;j++)
           if(b[j]==maxpage)
           b[j]=a[i];
     }
  }

//printf("  a:%3d",a[i]);
 //printf("  b:%3d%3d%3d%3d",b[0],b[1],b[2],b[3]);
        
         
           }
  printf("%d",n);
  printf("  page frames OPT:%d ",dis);
  printf("  OPT:%6.4f\n",1-(float)dis/32);
		}

}

void FIFO(int a[])

{
		for(int n=4;n<33;n++)
		{
 int num;
 int max;
 int maxpage=0;
 int dis=0;
 int i=0;
 int k=0;
 int sum=n;
 int b[maxsize];
 
 
 
 for (k=0;k<n;k++)
    { b[k]=-1;
     count[k]=0;}
 for (i=0;i<vpf;i++)
 {    num=0;
  for (k=0;k<n;k++)
  {
	
   if(a[i]==b[k])
   num++;
  }
  if(num==0)
  {
    dis++;
    for(k=0;k<n;k++)
    count[k]++;
    if(sum==0)
    {  max=0;
       for(k=0;k<n;k++)
       {
	  if(max<count[k])
	  {
	   max=count[k];
	   maxpage=k;
	  }
}
    b[maxpage]=a[i];
    count[maxpage]=0;
    }
  else {
	b[n-sum]=a[i];
	count[n-sum]=0;
	sum--;
  }
  }
  //else
     //  for (k=0;k<4;k++)
       //	   count[k]++;
 //printf("  a:%3d",a[i]);
//printf("  b:%3d%3d%3d%3d",b[0],b[1],b[2],b[3]);
  }
 printf("%d",n);
 printf("  page frames FIFO:%3d",dis);
 printf("  FIFO:%6.4f\n",1-(float)dis/32);

}
}

void LRU(int a[])

{
	for(int n=4;n<33;n++)
	{
 int num=0;
 int same=0;
 int max;
 int maxpage=0;
 int dis=0;
 int i=0;
 int k=0;
 int sum=n;
 int b[maxsize];
 
 for (k=0;k<n;k++)
    { b[k]=-1;
     count[k]=0;}
 for (i=0;i<vpf;i++)
 {num=0;
  for (k=0;k<n;k++)
  {
   if(a[i]==b[k])
   { same=k;
   num++; }
  }
  for(k=0;k<n;k++)
    count[k]++;
  if(num!=0)
     count[same]=0;
  else
  {
    dis++;
    
    if(sum==0)
    {  max=0;
       for(k=0;k<n;k++)
       {
	  if(max<count[k])
	  {
	   max=count[k];
	   maxpage=k;
	  }
}
    b[maxpage]=a[i];
    count[maxpage]=0;
    }
  else {
	b[n-sum]=a[i];
	count[n-sum]=0;
	sum--;
  }
  }
  //else
     //  for (k=0;k<4;k++)
       //	   count[k]++;
//printf("  a:%3d",a[i]);
 //printf("  b:%3d%3d%3d%3d",b[0],b[1],b[2],b[3]);
  }
 printf("%d",n);
 printf("  page frames LRU:%3d",dis);
 printf("  LRU:%6.4f\n",1-(float)dis/32);

}
}

⌨️ 快捷键说明

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