用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

c++ 虚拟存储管理器的页面调度(FIFO LRU LFU OPT)

2013-03-09 作者: 小蜜锋举报

[c++]代码库

#include<stdio.h>
#include<string.h>
#include<iostream.h>
 
/************************************************************
页面调度算法主要有:FIFO,最近最少使用调度算法(LRU),最近最不常用调度算法(LFU),最佳算法(OPT)
此程序包括 :FIFO ,最近最少使用调度算法( LRU ),最近最不常用调度算法( LFU ) 第二次机会算法
************************************************************/
 
const int MAXSIZE=1000;//定义最大页面数
const int MAXQUEUE=3;//定义页框数
 
typedef struct node
{
    int loaded;
    int hit;
} page;
 
page pages[MAXQUEUE]; //定义页框表
int queue[MAXSIZE];
int quantity;
 
//初始化结构函数
void initial()
{
    int i;
 
    for ( i=0; i<MAXQUEUE; i++ )
    {
        pages[i].loaded=-1;
        pages[i].hit=0;
    }
    for ( i=0; i<MAXSIZE; i++ )
    {
        queue[i]=-1;
    }
 
    quantity=0;
}
 
//初始化页框函数
void init()
{
    int i;
 
    for ( i=0; i<MAXQUEUE; i++ )
    {
        pages[i].loaded=-1;
        pages[i].hit=0;
    }
}
 
//读入页面流
void readData()
{
    FILE *fp;
    char fname[20];
 
    int i;
 
    cout<<"请输入页面流文件名:";
    cin>>fname;
 
    if ( ( fp=fopen ( fname,"r" ) ) ==NULL )
    {
        cout<<"错误,文件打不开,请检查文件名";
    }
    else
    {
        while ( !feof ( fp ) )
        {
            fscanf ( fp,"%d ",&queue[quantity] );
            quantity++;
        }
    }
 
    cout<<"读入的页面流:";
    for ( i=0; i<quantity; i++ )
    {
        cout<<queue[i]<<" ";
    }
}
 
//FIFO调度算法
 
void FIFO()
{
    int i,j,p,flag;
    int absence=0;
 
    p=0;
 
    cout<<endl<<"----------------------------------------------------"<<endl;
    cout<<"FIFO调度算法页面调出流:";
    for ( i=0; i<quantity; i++ )
    {
        flag=0;
        for ( j=0; j<MAXQUEUE; j++ )
        {
            if ( pages[j].loaded==queue[i] )
            {
                flag=1;
            }
        }
        if ( flag==0 )
        {
            if ( absence>=MAXQUEUE )
            {
                cout<<pages[p].loaded<<" ";
            }
            pages[p].loaded=queue[i];
            p= ( p+1 ) %MAXQUEUE;
            absence++;
        }
    }
    absence-=MAXQUEUE;
    cout<<endl<<"总缺页数:"<<absence<<endl;
 
}
 
 
//最近最少使用调度算法(LRU)
void LRU()
{
    int absence=0;
    int i,j;
    int flag;
 
 
    for ( i=0; i<MAXQUEUE; i++ )
    {
        pages[i].loaded=queue[i];
    }
 
    cout<<endl<<"----------------------------------------------------"<<endl;
    cout<<"最近最少使用调度算法(LRU)页面流:";
 
    for ( i=MAXQUEUE; i<quantity; i++ )
    {
        flag=-1;
        for ( j=0; j<MAXQUEUE; j++ )
        {
            if ( queue[i]==pages[j].loaded )
            {
                flag=j;
            }
        }
//CAUTION pages[0]是队列头
        if ( flag==-1 )
        {
//缺页处理
            cout<<pages[0].loaded<<" ";
            for ( j=0; j<MAXQUEUE-1; j++ )
            {
                pages[j]=pages[j+1];
            }
            pages[MAXQUEUE-1].loaded=queue[i];
            absence++;
        }
        else
        {
//页面已载入
            pages[quantity]=pages[flag];
            for ( j=flag; j<MAXQUEUE-1; j++ )
            {
                pages[j]=pages[j+1];
            }
            pages[MAXQUEUE-1]=pages[quantity];
        }
 
 
    }
 
    cout<<endl<<"总缺页数:"<<absence<<endl;
}
 
 
//最近最不常用调度算法(LFU)
void LFU()
{
    int i,j,p;
    int absence=0;
    int flag;
 
    for ( i=0; i<MAXQUEUE; i++ )
    {
        pages[i].loaded=queue[i];
    }
 
    cout<<endl<<"----------------------------------------------------"<<endl;
    cout<<"最近最不常用调度算法(LFU)页面流:";
 
    for ( i=MAXQUEUE; i<quantity; i++ )
    {
        flag=-1;
        for ( j=0; j<MAXQUEUE; j++ )
        {
            if ( pages[j].loaded==queue[i] )
            {
                flag=1;
                pages[j].hit++;
            }
        }
        if ( flag==-1 )
        {
//缺页中断
            p=0;
            for ( j=0; j<MAXQUEUE; j++ )
            {
                if ( pages[j].hit<pages[p].hit )
                {
                    p=j;
                }
            }
            cout<<pages[p].loaded<<" ";
            pages[p].loaded=queue[i];
            for ( j=0; j<MAXQUEUE; j++ )
            {
                pages[j].hit=0;
            }
            absence++;
        }
    }
    cout<<endl<<"总缺页数:"<<absence<<endl;
}
 
//第二次机会算法
void second()
{
    int i,j,t;
    int absence=0;
    int flag,temp;
 
    for ( i=0; i<MAXQUEUE; i++ )
    {
        pages[i].loaded=queue[i];
    }
 
    cout<<endl<<"----------------------------------------------------"<<endl;
    cout<<"第二次机会算法页面流:";
 
    for ( i=MAXQUEUE; i<quantity; i++ )
    {
        flag=-1;
        for ( j=0; j<MAXQUEUE; j++ )
        {
            if ( pages[j].loaded==queue[i] )
            {
                flag=1;
                pages[j].hit=1;
            }
        }
        if ( flag==-1 )
        {
//缺页处理
            t=0;
            while ( t==0 )
            {
                if ( pages[0].hit==0 )
                {
                    cout<<pages[0].loaded<<" ";
                    for ( j=0; j<MAXQUEUE-1; j++ )
                    {
                        pages[j]=pages[j+1];
                    }
                    pages[MAXQUEUE-1].loaded=queue[i];
                    pages[MAXQUEUE-1].hit=0;
 
 
                    t=1;
                }
                else
                {
                    temp=pages[0].loaded;
                    for ( j=0; j<MAXQUEUE-1; j++ )
                    {
                        pages[j]=pages[j+1];
                    }
                    pages[MAXQUEUE-1].loaded=temp;
                    pages[MAXQUEUE-1].hit=0;
                }
            }
            absence++;
        }
    }
    cout<<endl<<"总缺页数:"<<absence<<endl;
}
 
//显示版权信息函数
void version()
{
    cout<<endl<<endl;
 
    cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;
    cout<<" ┃     虚拟存储管理器的页面调度       ┃"<<endl;
    cout<<" ┠───────────────────────┨"<<endl;
    cout<<" ┃   (c)All Right Reserved Neo       ┃"<<endl;
    cout<<" ┃      sony006@163.com          ┃"<<endl;
    cout<<" ┃     version 2004 build 1122      ┃"<<endl;
    cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;
 
    cout<<endl<<endl;
}
 
void main()
{
    version();
    initial();
 
    readData();
 
    FIFO();
    init();
 
    LRU();
    init();
 
    LFU();
    init();
 
    second();
 
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...