.

#include"stdio.h"
#include"malloc.h"  /*或#include"alloc.h"*/
#define N 16
#define num 5  /*进程分配物理块数目*/
int A[N]={1,2,3,4,5,6,7,8,5,2,3,2,7,8,1,4};  /*页面号引用串*/
typedef struct page    
{ int address;           /*页面号*/
  struct page *next;      
  }page;
struct page *head,*run,*rear;
void jccreat()   /*给进程分配物理块,初始时内存物理块为空,以后运行时调入*/
{ int i=1;
 page *p,*q;
 head=(page *)malloc(sizeof(page));/*带头结点*/
 p=head;
 for(i=1;i<=num;i++) 
{ q=(page *)malloc(sizeof(page));
  p->next=q;
  q->address=0;
  q->next=NULL;
  p=q; }
  rear=p;}
int search(int n) /*在分配的内存物理块中查找n号页面*/
{
  page *p;
  int i=0;
  p=head;
  while(p->next)
  {
   if(p->next->address==n)
   {
   printf("Get it at the page %d\n",i+1);
   run=p;
   return 1;} /*找到,返回1*/
   p=p->next;
   i++;
  }
return 0; /*未找到,返回0*/
}
 
void changeOPT(int n,int position) /*OPT页面置换算法*/
{
  int i;
  int total=0;
  int flag=1;
  int distance[num];
  int MAX;
  int order=0;
  page *p,*q;
  p=head->next;
  q=head->next;
  for(i=0;i<num;i++)
  distance[i]=100;
  i=0;
  while(p)/*查找空闲的物理块*/
  {
   if(p->address==0)
   {flag=0;
    break;}
   p=p->next;
   i++;
  }
   if(!flag)/*找到了空闲的物理块*/
   {p->address=n;
    printf("Change the page %d\n",i+1);
    }
   else/*没找到空闲的物理块,需要置换*/
   {
    while(q)/*计算内存中每个页面下次被访问的“距离”*/
    {
     for(i=position;i<N;i++)
     {if(q->address==A[i])  
	 {distance[total]=i-position;
	 break;}
	 }
     total++;
     q=q->next;
    }
    MAX=distance[0];
    for(i=0;i<num;i++)/*选择“距离”最远的物理块,记录其序号*/
    {
     if(distance[i]>MAX)
      {
        MAX=distance[i];
        order=i;
       }
    }
    printf("Change the page %d\n",order+1);
    i=0;
	p=head->next;
	while(p)/*找到“距离”最远的物理块,把要访问的页面号存入*/
    {
     if(i==order)  p->address=n;
     i++;
     p=p->next;
    }
   }
   
}
 

void changeLRU(int n) /*LRU页面置换算法*/
{
  int i=0;
  int flag=1;
  page *p,*delect;
 // 查找空闲物理块,若找到,直接调入;
 // 如果内存没有空闲物理块,选择链表的第一个物理块,进行置换。
  p=head->next;
  while(p)
  {
   if(p->address==0)
   {
    flag=0;
	p->address=n;
	printf("Change the page %d\n",i+1);
	break;
   }
   p=p->next;
   i++;

  }
  if(flag)
  {
   delect=head->next;
   head->next=delect->next;
   printf("Delect from the head,and addnew to the end.\n");
   delect->address=n;
   rear->next=delect;
   rear=delect;
   rear->next=NULL;
  }
  
}
 
float OPT() /*求OPT页面置换算法的命中率*/
{
 int i;
 int lose=0;
 float losef;
 float percent;
 for(i=0;i<N;i++)
 {
  if(search(A[i])==0)  
  {
    lose++;
    changeOPT(A[i],i);
   }
 }
 losef=(float)lose; 
 percent=1-(losef/N);
 return percent;
}
 float LRU()  /*求LRU页面置换算法的命中率*/
{
 int i;
 int lose=0;
 float losef;
 float percent;
 page *p;
 for(i=0;i<N;i++)
 {
  if(search(A[i])==0)
  {
    lose++;
    changeLRU(A[i]);
  }
  else 
   {
    p=run->next;
    run->next=p->next;
    rear->next=p;
    rear=p;
    rear->next=NULL;
    printf("Move it to end of queue.\n");
   }
 }
   losef=(float)lose; 
   percent=1-(losef/N);
   return percent;
} 
 
void main()  /*主函数部分*/
{float percent; 
  int choice;
  printf("Select the arithmetic:\n(1)OPT\n(2)LRU\nyour choice is:");
  scanf("%d",&choice);/*选择页面置换算法*/
  jccreat();               /*创建进程*/
  if(choice==1)           /*采用OPT算法置换*/
  {percent=OPT();        /*计算OPT时的命中率*/
  printf("The percent of OPT is %f\n",percent);}
  else if(choice==2)      /*采用LRU算法置换*/
  {percent=LRU();       /*计算LRU时的命中率*/
  printf("The percent of LRU is %f\n",percent);}
  else printf("Your choice is invalid.");
  //getch();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值