页面置换算法(OPT,FIFO,LRU)

#include <stdio.h>
#include <stdlib.h>
#define N 100

int s[N]; //页面访问序列:
int t; // 内存块个数
int h; // 总个数
int f = 0;
char c;

int cmp(const void* a, const void* b)
{
return *(int*)a - *(int*)b;
}

void OPT() // 永久不使用 , 最长时间不使用
{   
	printf("输入页面访问序列:");
    while (c != '\n')
    {
    	scanf("%d%c", &s[f++],&c);
		   h++;
    }
    printf("进程分配的内存块数:");
    scanf("%d", &t);
  int a[N];
  int k = 0,l = t;
  int g;
  int x=0;
  int count = 0;
  int hx[N];
  for(int i = 0 ; i < t ; i++)
    {
		a[i] = s[i];
    }
  for(int i = 0 ; i < t ; i++)
    {
	  printf("%d ",a[i]);
    }
    printf("\n");
  while(l<h)
  {
  	

  	g = s[l];   // 保存要插入的值 
  	k = 0 ;
  	for(int i = 0 ;i < N ; i++)
  	   hx[i] = 0 ;
  	for(int i = 0 ; i < t ; i++ )  //查找要插入的值 是否重复 
  	{
	   if(a[i] == s[l])
	    {
	    	k = 1;
			break;
	    }
	}
	if(k)
	{
		printf("%d为相同元素转到下一个元素\n",g);
		l++;
	}
	else{
		int sum = 0;  // 求和记录
		printf("%d是新元素置换开始\n",g);
		count++;
		int u = l+1;
		int j=u;
	   for(int i = 0 ; i < t ,j < h; i++)
	   {
	   	if(a[i] == s[j] && hx[a[i]]==0)
	   	{
	   		hx[a[i]] = 1;
	   		sum+=1;
	   		j++;
	   		i = -1;
		}
	    else if(i+1 == t)  // 新元素跳过 
		{
			 i = -1;
			 j++;
		}
		else if(sum == t-1)  //结束查找 
		      break;
	   } 
  
	  	for(int i = 0 ;i < t ; i++)
	     if( hx[a[i]] == 0)
	        {
	        	a[i] = g;
	        }
	  l++; 
	}
	if(x < count)
	 {
	printf("第%d次置换后的结果:\n",count);
	for(int i = 0 ; i < t ; i++)
	  printf("%d ",a[i]);
	  printf("\n");
	  x++;
    }
  }
      double r = count*0.1/(h-1);
	  printf("%0.2f",r); 
}

void FIFO()
{
	printf("输入页面访问序列:");
    while (c != '\n')
    {
    	scanf("%d%c", &s[f++],&c);
		   h++;
    }
    printf("进程分配的内存块数:");
    scanf("%d", &t);
  int a[N];
  int l = t;
  int k = 0;
  int g;
  int count=0;
  int p = 0;
  int x = 0; 
  for(int i = 0 ; i < t ; i++)
  {
  	a[i] = s[i];
  }
  while(l < h)
  {
  	k=0;
    g = s[l];
  	for(int i = 0; i < t; i++ )
  	{
	  	if(a[i] == s[l])
	  	{
	  		k = 1;
		  	break;
		}
	}
	if(k)
	{
		printf("%d为相同元素转到下一个元素\n",g);
		l++;
	}
	else{
	    printf("%d是新元素置换开始\n",g);
		count++;
		a[p++] = s[l++];
	    if(p == 3)
	    p = 0;
	}
	if(x < count)
	 {
	printf("第%d次置换后的结果:\n",count);
	for(int i = 0 ; i < t ; i++)
	  printf("%d ",a[i]);
	  printf("\n");
	  x++;
    }	
  }
    double r = count*0.1/h;
  	printf("\n%0.2f",r); 
}

void LRU()
{
	printf("输入页面访问序列:");
    while (c != '\n')
    {
    	scanf("%d%c", &s[f++],&c);
		   h++;
    }
    printf("进程分配的内存块数:");
    scanf("%d", &t);
   int a[N];
   int l = t;
   int k = 0;
   int x = 0;
   int hx[t];   //记录要插入的的位置 
   int count  = 0 ;
   int g;
   int b[N];
   int z[N];
   int u=0;
   int m =0;
   for(int i = 0; i < h ; i++)
     b[i] = s[i];
    for(int i = 0 ;i < h ;i++)  //数组去重复 
    {
    	 u=0;
	  for(int j = 0 ; j < m ; j++)
     {
 	  if(b[i] == z[j])
 	    {
 		 u=1;
 		 break;
	    }
	    
      }
      if(!u){
      	z[m++] = b[i];
	  }
    } 
   for(int i = 0; i < t ; i++)
    {
	a[i] = z[i];
	hx[a[i]] = i+1;
    }
   while(l<h)
   {
   	 k=0;
     g = s[l];
     for(int  i = 0 ; i < t ; i++)
     if(a[i] == s[l])
     {
     	for(int j  = 0 ; j < t ; j++)
     	 if(hx[a[j]]!=1)
		  hx[a[j]] = hx[a[j]] - 1;
		hx[a[i]] = t;
     	k = 1;
     	break;
	 }
   	 if(k)
   	{
   	 	printf("%d为相同元素转到下一个元素\n",g);
		l++;
	}
	else
	{

		printf("%d是新元素置换开始\n",g);
		count++;
		for(int i = 0 ; i < t ; i++)
		{
		  if(hx[a[i]] == 1)
		  {
		  for(int j  = 0 ; j < t ; j++)
		   	hx[a[j]] = hx[a[j]] - 1;
		    a[i] = g ;
		    hx[a[i]] = t;
		    break;
		  }
	    }
	    l++;
	}
	if(x < count)
	{
	printf("第%d次置换后的结果:\n",count);
	for(int i = 0 ; i < t ; i++)
	  printf("%d ",a[i]);
	  printf("\n");
	  x++;
    }	
   }
    double r = count*0.1/h;
  	printf("\n%0.2f",r); 

}

int main()
{
int n;
printf("请选择要执行的操作:\n1:最佳置换算法\n2:先进先出算法\n3:最近最久未使用算法\n");
scanf("%d", &n);
switch(n)
{
case 1: OPT();  break;
case 2: FIFO(); break;
case 3: LRU();  break;
}
return 0;
}

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值