FIFO,LRU,OPT置换算法

#include<iostream>
#include <cstdlib>
#include <ctime>
#define L 20    //页面长度最大为20
using namespace std;
int M; //内存块
struct Pro//定义一个结构体
{
    int num,time;
};
Input(int m,Pro p[L])//打印页面走向状态
{
    cout<<"请输入页面长度(10~20):";
    do
    {
        cin>>m;
        if(m>20||m<10)
        {
            cout<<endl;
            cout<<"页面长度必须在10~20之间"<<endl<<endl;
            cout<<"请重新输入L:";
        }
        else break;
    }while(1);
    int i,j;
    j=time(NULL);//取时钟时间
    srand(j);//以时钟时间j为种子,初始化随机数发生器
    cout<<endl;
    cout<<"输出随机数: "<<endl;
    cout<<endl;
    for(i=0;i<m;i++)
    {
        p[i].num=rand( )%10;//产生0到9之间的随机数放到数组p中
        p[i].time=0;
        cout<<p[i].num<<" ";
    }
    cout<<endl<<endl;
    return m;
}
void print(Pro *page1)//打印当前的页面
{
    Pro *page=new Pro[M];
    page=page1;
    for(int i=0;i<M;i++)
    cout<<page[i].num<<" ";
    cout<<endl;
}
int Search(int e,Pro *page1 )//寻找内存块中与e相同的块号
{
    Pro *page=new Pro[M];
    page=page1;
    for(int i=0;i<M;i++)
    if(e==page[i].num)
    return i;//返回i值  return -1;
}
int Max(Pro *page1)//寻找最近最长未使用的页面
{
    Pro *page=new Pro[M];
    page=page1;
    int e=page[0].time,i=0;
    while(i<M) //找出离现在时间最长的页面
    {
        if(e<page[i].time)
        e=page[i].time;
        i++;
    }
    for( i=0;i<M;i++)
    if(e==page[i].time)
    return i;//找到离现在时间最长的页面返回其块号
    return -1;
}
int Count(Pro *page1,int i,int t,Pro p[L])//记录当前内存块中页面离下次使用间隔长度
{
    Pro *page=new Pro[M];
    page=page1;
    int count=0;
    for(int j=i;j<L;j++)
    {
        if(page[t].num==p[j].num )
        break;//当前页面再次被访问时循环结束
        else count++;//否则count+1
    }
    return count;//返回count的值
}
int main()
{
    int c;
    int m=0,t=0;
    float n=0;
    Pro p[L];
    m=Input(m,p);//调用input函数,返回m值
    cout<<"请输入分配的物理块m(2~6): ";
    cout<<endl<<endl;
    do
    {
        cin>>M;
        if(M>6||M<2)
        {
            cout<<endl;
            cout<<"物理块m必须在2~6之间"<<endl<<endl;
            cout<<"请重新输入m: ";
        }
        else break;
    }while(1);
    Pro *page=new Pro[M];
    do
    {
        for(int i=0;i<M;i++)//初始化页面基本情况
        {
            page[i].num=0;
            page[i].time=m-1-i;
        }
        i=0;
        cout<<endl;
        cout<<"1:FIFO页面置换"<<endl<<endl;
        cout<<"2:LRU页面置换"<<endl<<endl;
        cout<<"3:OPT页面置换"<<endl<<endl;
        cout<<"请选择页面置换算法:"<<endl<<endl;
        cin>>c;
        system("cls");
        if(c==1)//FIFO页面置换
        {
            n=0;
            cout<<" FIFO算法页面置换情况如下: "<<endl;
            cout<<endl;
            while(i<m)
            {
                if(Search(p[i].num,page)>=0) //当前页面在内存中
                {
                    cout<<p[i].num<<" "; //输出当前页p[i].num
                    cout<<"不缺页"<<endl;
                    i++; //i加1
                }
                else //当前页不在内存中
                {
                    if(t==M)t=0;
                    else
                    {
                        n++; //缺页次数加1
                        page[t].num=p[i].num; //把当前页面放入内存中
                        cout<<p[i].num<<" ";
                        print(page); //打印当前页面

                        t++; //下一个内存块
                        i++; //指向下一个页面
                     }
                }
            }
            cout<<endl;
            cout<<"缺页次数:"<<n<<" 缺页率:"<<n/m<<endl<<endl;
            }
            if(c==2)//LRU页面置换
            {
                n=0;
                cout<<" LRU算法页面置换情况如下: "<<endl;
                cout<<endl;
                while(i<m)
                {
                    int a;
                    t=Search(p[i].num,page);
                    if(t>=0)//如果已在内存块中
                    {
                        page[t].time=0;//把与它相同的内存块的时间置0
                        for(a=0;a<M;a++)
                        if(a!=t)page[a].time++;//其它的时间加1
                        cout<<p[i].num<<" ";
                        cout<<"不缺页"<<endl;
                    }
                    else //如果不在内存块中
                    {
                        n++; //缺页次数加1
                        t=Max(page); //返回最近最久未使用的块号赋值给t
                        page[t].num=p[i].num; //进行替换
                        page[t].time=0; //替换后时间置为0
                        cout<<p[i].num<<" ";
                        print(page);
                        for(a=0;a<M;a++)
                        if(a!=t)
                        page[a].time++; //其它的时间加1
                    }
                    i++;
                }
                cout<<endl;
                cout<<"缺页次数:"<<n<<" 缺页率:"<<n/m<<endl<<endl;
                }
                if(c==3)//OPT页面置换
                {
                    n=0;
                    cout<<" OPT算法置换情况如下:"<<endl;
                    cout<<endl;
                    while(i<m)
                    {
                        if(Search(p[i].num,page)>=0)//如果已在内存块中
                        {
                            cout<<p[i].num<<" ";
                            cout<<"不缺页"<<endl;
                            i++;
                        }
                        else//如果不在内存块中
                        {
                            int a=0;
                            for(t=0;t<M;t++)
                            if(page[t].num==0)a++;//记录空的内存块数
                            if(a!=0) //有空内存
                            {
                                int q=M;
                                for(t=0;t<M;t++)
                                if(page[t].num==0&&q>t)q=t;//把空内存块中块号最小的找出来
                                page[q].num=p[i].num;
                                n++;
                                cout<<p[i].num<<" ";
                                print(page);
                                i++;
                            }
                            else
                            {
                                int temp=0,s;
                                for(t=0;t<M;t++)//寻找内存块中下次使用离现在最久的页面
                                if(temp<Count(page,i,t,p))
                                {
                                    temp=Count(page,i,t,p);
                                    s=t; }//把找到的块号赋给s
                                    page[s].num=p[i].num;
                                    n++;
                                    cout<<p[i].num<<" ";
                                    print(page);
                                    i++;
                            }
                            }
                        }
                        cout<<endl;
                        cout<<"缺页次数:"<<n<<" 缺页率:"<<n/m<<endl<<endl;
                    }
        }while(c==1||c==2||c==3);
        return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值