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

📄 1.cpp

📁 很好的存储器演示算法,欢迎大家下载使用。谢谢合作
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	for(int w=0;w<ding;w++)  
		printf("%d  ",p[w]);	
		
}
void search_page(int i,int x,int lx)//求c值 求得物理块中与页中相同的值的距离
{
	int j;//acc
	
	
	 for(j=lx;j<n;j++)
	 {
		c[i]++;
		if(p[i]==y[j])
		{ 
			break;
		}
	 }
	
	lx++;
}
void compare(int x)//求调出哪个物理块
{
	int max=c[0],i,q=0;
	for(i=1;i<m;i++)
	{
		
		if(max<c[i])
		{
			max=c[i];
			q=i;                //q是第几个块的值
			printf("\n调出的物理块:%d",q+1);
		}
		
	}	
	p[q]=y[x];
	printf("\n访问后物理块的内容\n");
	for(i=0;i<m;i++)
	    printf("%d   ",p[i]);
}

int opt()                        //算法执行主体
{
	int i,j,t,z,l,sign;
	l=m;
	
    initial_phy();                //填满物理块
	t=n-n2;
	z=n2;

	if(n2==n)
		return 0;
	for(j=0;j<t;j++)                        //判断是否命中
	
	{  sign=0;
		for(i=0;i<m;i++)
		{

			if(p[i]==y[z])
			{
				sign=1;
				break;

			}
		}
	 if(sign)
  {
   
   printf("\n访问后物理块的内容\n");
	for(i=0;i<m;i++)
	printf("%d   ",p[i]);
	printf("命中\n");
	hit++;
	l++;
	
  }
	else
	{
	for(i=0;i<m;i++)
	 {
	search_page(i,z,l);	        //求得物理块中与页中相同的值的距离c
	  }
	l++;
	compare(z);                //比较物理块中c的值
	for(i=0;i<m;i++)          //比较完一次,c的值归零
		c[i]=0;
    }
   z++;
	}
	return 1;
}
void hit_rate()               //求命中率
{
	float rate;
	rate=float(hit)/float(n);
	printf("\n命中率:%f\n",rate);
}
//页面置换算法之最佳置换算法
//--------------------------------------------------------------   
//------------页面置换算法之先进先出置换算法---------------------
int m0,n0,n1,hit0=0;
int ding0=0;
int Y[D],Q[B];
int H;

void init0()                        //输入物理块,页的信息
{
	int i;
	printf("1.请输入物理块数:");
	scanf("%d",&m0);
	printf("2.请输入页数:");
	scanf("%d",&n0);
	printf("输入页号:\n");
	for(i=0;i<n0;i++)
		scanf("%d",&Y[i]);
}
int  initial_phy0()                          //物理块的初始化,先将物理块装满
{
	int i,q=0,sign0;
	Q[0]=Y[0];
	ding0++;
	sign0=0;
	n1=1;
	for(i=1;i<m0;i++)
	{
		for(int t=0;t<i;t++)          //判断将要装入的物理块是否与物理块中的内容相同
		{
			if(Q[t]==Y[n1])
			{
				sign0=1;
				break;
			}
		}
	    printf("\n物理块内容:\n");
		for(int j=0;j<i;j++)   //显示当前物理块内容
		{
			
		    printf("%d  ",Q[j]);
		}

		if(sign0)                   
		{
			printf("\n页");
			printf("%d",i+1);
			printf("命中\n");
			hit0++;
			i--;
			n1++;
			H=1;
		}
		else                     //判断与已存在物理块内容不同,进行装入
		{
			Q[i]=Y[n1];
			ding0++;
			n1++;
		}
		sign0=0; 
	}
	printf("\n物理块内容:\n");
	for(int w=0;w<ding0;w++)  
		printf("%d ",Q[w]);	
	printf("\n");
	return sign0;
		
}
//---------主体部分---------
void Fifo()
{
	int i,l;
	l=m0;
	
    int sign=initial_phy0();    //填满物理块
	i=m0;
    if(H==1)
	{
		sign=0;
		i=i+1;
	}
	for(i;i<n0;i++)
	{
	   for(int j=0;j<l;j++)
	   {
		 if(Y[i]==Q[j])
		 {
			printf("页");
			printf("%d ",i+1);
			printf("命中\n");
			hit0++;
            sign=1;
		 }
	   }
	  if(sign==0)
	  {
	    Q[0]=Y[i];
		printf("页");
		printf("%d",i+1);
		printf("没有命中,替换后的结果为:\n");
		for(int k=0;k<m0;k++)
		{
			printf("%d ",Q[k]);
		}
		printf("\n");
		int a=Q[0];
		for(int q=1;q<m0;q++)
		{
			Q[q-1]=Q[q];
		}
		Q[m0-1]=a;
	  }
	  sign=0;

	}
}
//--------------命中率计算------------------
void hit_rate0()
{
    float rate;
	rate=float(hit0)/float(n0);
	printf("命中率:%f\n",rate);
}
////////////////////////////////////////////////////////////////// 
//------------------页面置换算法之最近最少使用算法-----------------
const int m1=3; 
const int P1=12;
int n3,hit1=0;
int process[P1];   

void init1()                        //输入物理块,页的信息
{
	int i;
	printf("1.请输入物理块数:");
	printf("%d",m1);
	printf("\n2.请输入页数:\n");
	scanf("%d",&n3);
	printf("输入页号:\n");
	for(i=0;i<n3;i++)
		scanf("%d",&process[i]);
}
typedef struct
{
	int data[m1];
	int top;
}stack;
stack *init2()
{
	stack *s;
	s=new stack;
	if(!s) 
	{
		printf("空间不足!\n");
		return NULL;
	}
	else 
	{
		s->top=-1;
		return s;
	}
}

void push(stack *s,int x)
{
	s->top++;
	s->data[s->top]=x;
}
void pop(stack *s,int y)
{
	y=s->data[0];
	for(int i=1;i<=s->top;i++)
		s->data[i-1]=s->data[i];
	s->top--;
}
//栈操作
void lru(stack *s)
{
	int n=0;
	int i,j;
	int a,b=0;
	for(i=0;i<n3;i++)
	{
		if(s->top==-1)
		{
			push(s,process[i]);
			n++;
		}
		else
		{
		for(j=0;j<=s->top;j++)
		{ 
			if(process[i]==s->data[j])
			{   
				a=s->data[j];
				for(int i=j+1;i<=s->top;i++)
				{	
				   s->data[j]=s->data[j+1];
				    j++;
				}
				s->data[s->top]=a;
				break;
			}
		}
		if(j>s->top)
		{
		if(s->top<m1-1)
			{ 
			    push(s,process[i]);
			    n++;
			}
		else
		{
			pop(s,b);
			push(s,process[i]);
			n++;
		}
		}
		}
		for(int b=0;b<=s->top;b++)
			printf("%d ",s->data[b]);
		printf("\n");
	}
	printf("LRU的缺页次数是");
	printf("%d",n);
	printf("\nLRU的缺页中断率是");
	float rate;
	rate=float(n)/float(n3);
	printf("%f\n",rate);
}

///////////////////////////////////////////////////////////////////////
void main()   
{   
    int i;   
    int choice,choice1;   
   
	printf("\n");
    printf("-----------------------存储器分区分配演示算法-----------------\n");   
    printf("-----------------------05网络一班--杨青--毕业设计---------------\n"); 
	printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
    InitBlock();            //初始化空闲块    
   
    for(i = 0;;i++)   
    {   
        printf("\n请选择操作:\n"); 
		printf("\t1.可变分区管理方式          ");
		printf("2.页面置换算法          "); 
        printf("0.退出\n");
        scanf("%d",&choice1);
		if(choice1==1)
		{
			 printf("--------------------------------------\n"); 
             printf("\t1.\t首次适应算法分配内存\n");   
             printf("\t2.\t最佳适应算法分配内存\n");   
             printf("\t3.\t回收存储区\n");
			 scanf("%d",&choice);
             
			 if(choice == 1)  FirstAdapt();   
             else if(choice == 2)  BestAdapt();   
             else if(choice == 3)     Callback();
		}
		else if(choice1==2)
		{
			printf("--------------------------------------\n");  
			printf("\t1.\t最佳页面置换算法(OPT)\n"); 
	    	printf("\t2.\t先进先出页面置换算法(FIFO)\n"); 
            printf("\t3.\t最近最久未使用算法(LRU)\n");
			scanf("%d",&choice); 
			 if(choice ==1)     
			{
			printf("******************************最佳置换算法*************************************\n");
	        init();//初始化
	        opt();
	        hit_rate(); 
			}
		    else if(choice ==2)
			{
             printf("******************************首先置换算法*************************************\n");
	         init0();//初始化
              Fifo();
	          hit_rate0();
			}
		   else if(choice ==3)
		   {
			init1();
	        stack *s;
	        s=init2();
	        printf("页面走向:\n");
	       for(int i=0;i<n1;i++)
		   printf("%d ",process[i]);
	       printf("\n");
	       printf("LRU置换过程如下:\n");
	       lru(s);

		   }
		}
 //       printf("--------------------------------------\n");   
   /*     printf("\t1.\t首次适应算法分配内存\n");   
        printf("\t2.\t最佳适应算法分配内存\n");   
        printf("\t3.\t回收存储区\n");  
		*/
 /*       printf("+++++++++++++++++++++++++++++++++++++++\n");   
		printf("\n页面置换算法||\n    请选择操作:\n");
		printf("--------------------------------------\n");
		printf("\t4.\t页面置换算法(OPT)\n"); 
		printf("\t5.\t页面置换算法(FIFO)\n"); 
        printf("\t6.\t页面置换算法(LRU)\n");
		printf("+++++++++++++++++++++++++++++++++++++++\n");
        printf("\t0.\t退出\n"); 
		printf("---------------------------------------\n");
               
        scanf("%d",&choice);   
        if(choice == 1)  FirstAdapt();   
        else if(choice == 2)  BestAdapt();   
        else if(choice == 3)     Callback();  
		else if(choice ==4)     
		{
			printf("******************************最佳置换算法*************************************\n");
	        init();//初始化
	        opt();
	        hit_rate(); 
		}
		else if(choice ==5)
		{
           printf("******************************首先置换算法*************************************\n");
	       init0();//初始化
           Fifo();
	       hit_rate0();
		}
		else if(choice ==6)
		{
			init1();
	        stack *s;
	 s=init2();
	printf("页面走向:\n");
	for(int i=0;i<n1;i++)
		printf("%d ",process[i]);
	printf("\n");
	printf("LRU置换过程如下:\n");
	lru(s);

		}
		*/
        else if(choice1 == 0)    
		{printf("系统尚有许多不足,请老师批评指正\n");break;}   
        else {printf("A wrong choice!\n");getchar();}   
    }   
}   

⌨️ 快捷键说明

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