页面置换算法(操作系统)

#include <stdio.h>
#include <string.h>

#include <stdlib.h>

//页面置换算法

#define N 100
int max;
int z[N];  //记录需调用页面数
typedef struct
{
  int a[N];
  int b[N]; //记录Optimal算法中最近需求页面数或记录LRU前面相同页面的位置
  int top;  //  物理块内页数
}sq;
int get()
{
    int i,a=0;
    char str[N];
    char *p;
    printf("请输入页面号引用串:");
    getchar();
    gets(str);
    printf("%s\n",str);
    p = strtok(str," ,");
    while(p)
    {
        i=atoi(p)+1;
        z[a]=i;
        a++;
        p=strtok(NULL," ,");
    }
    return 0;
}
int print(sq list)
{
    int i;
    for(i=0;i<list.top;i++)
    {
        printf("  %d   ",list.a[i]-1);
    }
    printf("\n**********\n");
 return 0;
}
int Optimal(sq list)  //最佳置换算法
{
    int i,j,x,y,n,k=0;      //记录Optimal算法中最近需求页面数
    list.top=0;
    for(i=0;z[i]!='\0';i++)
    {
        for(j=0;j<list.top;j++)//查看物理块内是否有该页
            if(list.a[j]==z[i])
                break;
        if(j>=list.top)  //产生缺页
        {
            if(list.top==max)//物理块满页
            {
                for(x=0;x<max;x++)                 //计算已有位置数据
               {
                   for(y=i;z[y]!='\0';y++)
                   {
                       if( list.a[x]==z[y])
                       {
                         list.b[x]=y;
                         break;
                       }
                       else
                        list.b[x]=y;
                   }
               }
               for(n=0;n<max;n++)
                k=0;
               for(n=1;n<max;n++)           //求出替换位置
               {
                   if(list.b[k]<list.b[n])
                   {
                        list.b[k]=list.b[n];
                        k=n;
                   }
               }
            }
            list.a[k++]=z[i];
            if(list.top<max)
                list.top++;
        }
        printf("%d\t\n",z[i]);
        print(list);
    }
    return 0;
}


int FIFO1(sq list)   //FIFO 先进先出算法;
{
    int i,j,k=0;
    list.top=0;//
    for(i=0;z[i]!='\0';i++)
    {
        for(j=0;j<k;j++) //查看物理块内是否有该页
            if(list.a[j]==z[i])
                break;
        if(j>=k)  //产生缺页
        {
            if(k>=max)//物理块满页
            {
               k-=max;
            }
            list.a[k++]=z[i];
            if(list.top<max)
                list.top++;
        }
        printf("%d\t\n",z[i]);
        print(list);
    }
    return 0;
}
int FIFO2(sq list)         //FIFO 先进先出算法;
{


    int i,j,k=0;
    list.top=0;
    for(i=0;z[i]!='\0';i++)
    {
        if(k>=max)
            k=k-max;
        for(j=0;j<max;j++)
            if(list.a[j]==z[i])
                break;
         if(j>k)
         {
             list.a[k++]=z[i];
             if(list.top<max)
             list.top++;
         }
        printf("%d\t\n",z[i]);
        print(list);
    }
    return 0;
}
int LRU(sq list)  //LRU最近最久未使用最少使用
{
    int i,j,x,y,n,k=0;
    list.top=0;
    for(i=0;z[i]!='\0';i++)
    {
        for(j=0;j<list.top;j++)//查看物理块内是否有该页
            if(list.a[j]==z[i])
                break;
        if(j>=list.top)  //产生缺页
        {
             if(list.top==max)
             {
                 for(x=0;x<max;x++)                 //计算已有位置数据
               {
                   for(y=i;y>=0;y--)
                   {
                       if( list.a[x]==z[y])
                       {
                         list.b[x]=y;
                         break;
                       }
                       else
                        list.b[x]=y;
                   }
               }
               for(n=0;n<max;n++)
                k=0;
               for(n=1;n<max;n++)           //求出替换位置
               {
                   if(list.b[k]>list.b[n])
                   {
                        list.b[k]=list.b[n];
                        k=n;
                   }
               }
             }
             list.a[k++]=z[i];
             if(list.top<max)
               list.top++;
         }
        printf("%d\t\n",z[i]);
        print(list);
    }
    return 0;
}
int catalog(sq list)//目录
{
    int i;
    printf("\t**************************\n");
    printf("\t*          目录          *\n");
    printf("\t*                        *\n");
    printf("\t*   1:Optimal算法;       *\n");
    printf("\t*   2:FIFO算法;          *\n");
    printf("\t*   3:LRU算法;           *\n");
    printf("\t*                        *\n");
    printf("\t**************************\n");
    printf("请输入算法序号:");
    scanf("%d",&i);
    switch(i)
    {
    case 1:
        Optimal(list);
        break;
    case 2:
        FIFO2(list);
        break;
    case 3:
        LRU(list);
        break;
    default:
        printf("输入错误");


    }
    return 0;
}
int main()
{
    char again;
do {
            printf("\n请输入一个物理块中页面个数:");
            scanf("%d",&max);
            sq list;
            get();
            catalog(list);
            printf("Continue...(Y/N): ");
do{
again = getch();
}while(again!='Y' && again!='y' && again!='N' && again!='n');
}while(again=='Y' || again=='y');
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值