zl程序教程

您现在的位置是:首页 >  其他

当前栏目

实验四、LRU算法模拟

模拟算法 实验 LRU
2023-09-11 14:21:07 时间

实验原理:

其基本原理为:如果某一个页面被访问了,它很可能还要被访问;相反,如果它长时间不被访问,再最近未来是不大可能被访问的。

 

程序源代码:

#define MAXSIZE    20
#include <iostream.h>

void main()
{
    int input=0;                                   //用于输入作业号
    int worknum=0;                                 //输入的作业个数
    int storesize=0;                               //系统分配的存储区块数
    int interrupt=0;                               //缺页中断次数
    int stack[MAXSIZE];                            //栈,LRU算法的主要数据结构
    int workstep[MAXSIZE];                         //记录作业走向
    /*初始化*/
    for(int i=0;i<MAXSIZE;i++)
    {
        stack[i]=0;
        workstep[i]=0;
    }
    cout<<"请输入存储区块数:";
    cin>>storesize;
    cout<<"请输入作业的页面走向(输入0结束):\n";
    for(int j=0;j<MAXSIZE;j++)
    {
        cout<<"页面号 "<<j+1;
        cin>>input;        
        workstep[j]=input;
        if(input==0)
        {
            cout<<"输入结束!\n";
            break;
        }
        worknum++;
    }
    if(workstep[0]==0)
    {
        cout<<"未输入任何作业,系统将退出!\n";
        return;
    }
    cout<<"置换情况如下:\n";
    for(int k=0;k<worknum;k++)
    {
        /*在栈中找相等的页号或空位置*/
        for(int l=0;l<storesize;l++)
        {
            /*是否有相等的页号*/
            if(stack[l]==workstep[k])
            {
                cout<<"内存中有"<<workstep[k]<<"号页面,无须中断!\n"; 
                goto step1;
            }
            /*找栈中是否有空位置*/
            if(stack[l]==0)
            {
                stack[l]=workstep[k];
                cout<<"发生中断,但内存中有空闲区,"<<workstep[k]<<"号页面直接调入!\n";
                interrupt++;
                goto step1;
            }
        }
        /*上述情况都不成立则调出栈顶,将调入页面插入栈顶*/
        cout<<"发生中断,将"<<stack[0]<<"号页面调出,"<<workstep[k]<<"号装入!\n";
        interrupt++;
        /*新掉入的页面放栈顶*/
step1:    for(int m=0;m<storesize;m++)
        {
            stack[m]=stack[m+1];
        }
        stack[storesize-1]=workstep[k];

    }
    cout<<"作业"<<worknum<<"个,"<<"中断"<<interrupt<<"次,"<<"缺页率:"<<float(interrupt)/float(worknum)*100<<"%\n";
}

 

程序调试:

 

调试一:

 

请输入存储区块数:3

请输入作业走向(输入0结束):

页面号1:4

页面号2:3

页面号3:2

页面号4:1

页面号5:4

页面号6:3

页面号7:5

页面号8:4

页面号9:3

页面号10:2

页面号11:1

页面号12:5

页面号13:0

输入结束!

置换情况如下:

发生中断,但内存中有空闲区,4号页面直接调入!

发生中断,但内存中有空闲区,3号页面直接调入!

发生中断,但内存中有空闲区,2号页面直接调入!

发生中断,将4号页面调出,1号装入!

发生中断,将3号页面调出,4号装入!

发生中断,将2号页面调出,3号装入!

发生中断,将1号页面调出,5号装入!

内存中有4号页面,无须中断!

内存中有3号页面,无须中断!

发生中断,将5号页面调出,2号装入!

发生中断,将4号页面调出,1号装入!

发生中断,将3号页面调出,5号装入!

作业12个,中断10次,缺页率:83.3333%

Press any key to continue

 

 

调试二:

 

请输入存储区块数:4

请输入作业走向(输入0结束):

页面号1:4

页面号2:3

页面号3:2

页面号4:1

页面号5:4

页面号6:3

页面号7:5

页面号8:4

页面号9:3

页面号10:2

页面号11:1

页面号12:5

页面号13:0

输入结束!

置换情况如下:

发生中断,但内存中有空闲区,4号页面直接调入!

发生中断,但内存中有空闲区,3号页面直接调入!

发生中断,但内存中有空闲区,2号页面直接调入!

发生中断,但内存中有空闲区,1号页面直接调入!

内存中有4号页面,无须中断!

内存中有3号页面,无须中断!

发生中断,将2号页面调出,5号装入!

内存中有4号页面,无须中断!

内存中有3号页面,无须中断!

发生中断,将3号页面调出,2号装入!

发生中断,将5号页面调出,1号装入!

发生中断,将4号页面调出,5号装入!

作业12个,中断8次,缺页率:66.6667%