| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 732 人关注过本帖
标题:FIFO算法错误在哪
只看楼主 加入收藏
xld252977834
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2015-11-10
结帖率:0
收藏
已结贴  问题点数:20 回复次数:4 
FIFO算法错误在哪
#include <stdio.h>
#include <stdlib.h>
/*全局变量*/
int mSIZE; /*物理块数*/
int pSIZE; /*页面号引用串个数*/
static int memery[10]={0}; /*物理块中的页号*/
static int page[100]={0}; /*页面号引用串*/
static int temp[100][10]={0}; /*辅助数组*/
/*置换算法函数*/
void FIFO();
void LRU();
void OPT();
/*辅助函数*/
void print(unsigned int t);

/*主函数*/
void main()
{
    int i,k,code;

    printf("请输入物理块的个数:");
    scanf("%d",&mSIZE);
    printf("请输入页面号的个数:");
    scanf("%d",&pSIZE);
    puts("请依次输入页面号引用串:");
    for(i=0;i<pSIZE;i++)
        scanf("%d",&page[i]);
    printf("\n");
    printf("┏━━━━━━━━━━━━━━━━━━━━━┓\n");
    printf("┃ 请选择页面置换算法:\t\t\t    ┃\n");
    printf("┣━━━━━━━━━━━━━━━━━━━━━┫\n");
    printf("┃ 1.先进先出(FIFO)   2.最近最久未使用(LRU) ┃\n");
    printf("┃ 3.最佳(OPT)        4.退出                ┃\n");
    printf("┗━━━━━━━━━━━━━━━━━━━━━┛\n");
   

    while(1)
    {
        printf("请选择操作:");
        scanf("%d",&code);
        printf("\n");
        switch(code)
        {
        case 1:
            FIFO();
            break;
        case 2:
            LRU();
            break;
        case 3:
            OPT();
            break;
        case 4:
            exit(0);
        default:
            printf("输入错误!!!\n");
        }
    }
}


void print(unsigned int t)
{
    int i,j,k,l;
    int flag;
    printf(" ");
    for(k=0;k<=(pSIZE-1)/20;k++)
    {
        for(i=20*k;(i<pSIZE)&&(i<20*(k+1));i++)
        {
            if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1)))
                printf("%d\n",page[i]);
            else
                printf("%d   ",page[i]);
        }
        printf("---------------------\n");
        for(j=0;j<mSIZE;j++)
        {
            for(i=20*k;(i<mSIZE+20*k)&&(i<pSIZE);i++)
            {
                if(i>=j)
                    printf(" %d  ",temp[i][j]);
                else
                    printf("    ");
            }
            for(i=mSIZE+20*k;(i<pSIZE)&&(i<20*(k+1));i++)
            {
                for(flag=0,l=0;l<mSIZE;l++)
                    if(temp[i][l]==temp[i-1][l])
                        flag++;
                if(flag==mSIZE)/*页面在物理块中*/
                    printf("    ");
                else
                    printf(" %d  ",temp[i][j]);
            }
            /*每行显示20个*/
            if(i%20==0)
                continue;
            printf("\n");
        }
    }
    printf("---------------------\n");
    printf("缺页次数:%d\n",t+mSIZE);
    printf("命中率:%.2f%%\n",(float)(pSIZE-(t+mSIZE))*100/pSIZE);
    printf("---------------------\n");   
}

/*先进先出页面置换算法*/
void FIFO()
{
    int memery[10]={0};
    int time[10]={0}; /*记录进入物理块的时间*/
    int i,j,k,m;
    int max=0; /*记录换出页*/
    int count=0; /*记录置换次数*/
    /*前mSIZE个数直接放入*/
    for(i=0;i<mSIZE;i++)
    {
        memery[i]=page[i];
        time[i]=i;
        for(j=0;j<mSIZE;j++)
            temp[i][j]=memery[j];
    }
    for(i=mSIZE;i<pSIZE;i++)
    {
        /*判断新页面号是否在物理块中*/
        for(j=0,k=0;j<mSIZE;j++)
        {
            if(memery[j]!=page[i])
                k++;
        }
        if(k==mSIZE) /*如果不在物理块中*/
        {
            count++;
            /*计算换出页*/
            max=time[0]<time[1]?0:1;
            for(m=2;m<mSIZE;m++)
                if(time[m]<time[max])
                    max=m;
            memery[max]=page[i];
            time[max]=i; /*记录该页进入物理块的时间*/
            for(j=0;j<mSIZE;j++)
                temp[i][j]=memery[j];
        }
        else
        {
            for(j=0;j<mSIZE;j++)
                temp[i][j]=memery[j];
        }
    }
    print(count);
}
/*最近最久未使用置换算法*/
void LRU()
{
    int memery[10]={0};
    int flag[10]={0}; /*记录页面的访问时间*/
    int i,j,k,m;
    int max=0; /*记录换出页*/
    int count=0; /*记录置换次数*/
    /*前mSIZE个数直接放入*/
    for(i=0;i<mSIZE;i++)
    {
        memery[i]=page[i];
        flag[i]=i;
        for(j=0;j<mSIZE;j++)
            temp[i][j]=memery[j];
    }
    for(i=mSIZE;i<pSIZE;i++)
    {
        /*判断新页面号是否在物理块中*/
        for(j=0,k=0;j<mSIZE;j++)
        {
            if(memery[j]!=page[i])
                k++;
            else
                flag[j]=i; /*刷新该页的访问时间*/
        }
        if(k==mSIZE) /*如果不在物理块中*/
        {
            count++;
            /*计算换出页*/
            max=flag[0]<flag[1]?0:1;
            for(m=2;m<mSIZE;m++)
                if(flag[m]<flag[max])
                    max=m;
            memery[max]=page[i];
            flag[max]=i; /*记录该页的访问时间*/
            for(j=0;j<mSIZE;j++)
                temp[i][j]=memery[j];
        }
        else
        {
            for(j=0;j<mSIZE;j++)
                temp[i][j]=memery[j];
        }
    }
    print(count);
}
/*最佳置换算法*/
void OPT()
{
    int memery[10]={0};
    int next[10]={0}; /*记录下一次访问时间*/
    int i,j,k,l,m;
    int max; /*记录换出页*/
    int count=0; /*记录置换次数*/
    /*前mSIZE个数直接放入*/
    for(i=0;i<mSIZE;i++)
    {
        memery[i]=page[i];
        for(j=0;j<mSIZE;j++)
            temp[i][j]=memery[j];
    }
    for(i=mSIZE;i<pSIZE;i++)
    {
        /*判断新页面号是否在物理块中*/
        for(j=0,k=0;j<mSIZE;j++)
        {
            if(memery[j]!=page[i])
                k++;
        }
        if(k==mSIZE) /*如果不在物理块中*/
        {
            count++;
            /*得到物理快中各页下一次访问时间*/
            for(m=0;m<mSIZE;m++)
            {
                for(l=i+1;l<pSIZE;l++)
                    if(memery[m]==page[l])
                        break;
                next[m]=l;
            }
            /*计算换出页*/
            max=next[0]>=next[1]?0:1;
            for(m=2;m<mSIZE;m++)
                if(next[m]>next[max])
                    max=m;
            /*下一次访问时间都为pSIZE,则置换物理块中第一个*/
            memery[max]=page[i];
            for(j=0;j<mSIZE;j++)
                temp[i][j]=memery[j];
        }
        else {
            for(j=0;j<mSIZE;j++)
                temp[i][j]=memery[j];
        }
    }
    print(count);
}

当输入的页面走向为2、3、2、1、5、2、4、5、3、2、5、2时会发生错误   即头三个数有重复  要怎么改
搜索更多相关主题的帖子: include 
2015-11-10 09:55
xld252977834
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2015-11-10
收藏
得分:0 
代码本身没有错误  是逻辑有问题   即前三个数不能重复   要怎么改
2015-11-10 09:56
li459461891
Rank: 2
等 级:论坛游民
帖 子:27
专家分:89
注 册:2015-11-5
收藏
得分:20 
物理块多少个?页面号多少个?
页面号引用串是:2、3、2、1、5、2、4、5、3、2、5、2?
2015-11-10 12:59
li459461891
Rank: 2
等 级:论坛游民
帖 子:27
专家分:89
注 册:2015-11-5
收藏
得分:0 
VS2010运行情况如下:
物理块个数:5
页面数:12
页面号:2、3、2、1、5、2、4、5、3、2、5、2
输出结果:5个物理块的情况下,第六个页面调用时产生缺页,第一页2被置换

所以,问题再哪里呢?


[此贴子已经被作者于2015-11-10 13:11编辑过]

2015-11-10 13:09
li459461891
Rank: 2
等 级:论坛游民
帖 子:27
专家分:89
注 册:2015-11-5
收藏
得分:0 
如图
图片附件: 游客没有浏览图片的权限,请 登录注册

2015-11-10 13:14
快速回复:FIFO算法错误在哪
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020503 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved