分页式存储的页面置换算法

#include"stdio.h"
#include"stdlib.h"
#include"conio.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){
  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;}
   p=p->next;
   i++;
  }
   return 0;
}
 
void changeOPT(int n,int position)
{
  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;}
     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;
    while(p)
    {
     if(i==order)
     p->address=n;
     i++;
     p=p->next;
    }
   }
   
}
 
void changeLRU(int n)
{
  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 add new to the end.\n");
    delect->address=n;
    rear->next=delect;
    rear=delect;
    rear->next=NULL;
   }
}
 
float 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=lose; 
   percent=1-(losef/N);
   return percent;
}
 
float 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=lose; 
   percent=1-(losef/N);
   return percent;
} 
 
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",percent);}
  else if(choice==2)      /*采用LRU算法置换*/
  {percent=LRU();       /*计算LRU时的缺页率*/
  printf("The percent of OPT is %f",percent);}
  else printf("Your choice is invalid.");
  getch();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beyond_LH

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值