实验四:虚拟内存

页面置换算法模拟——OPT、FIFO和LRU算法

实验目的

  1. 了解虚拟存储技术的特点。
  2. 掌握请求页式存储管理的页面置换算法,如最佳(Optimal)置换算法、先进先出(Fisrt In First Out)置换算法和最近最久未使用(Least Recently Used)置换算法。

实验内容

设计模拟实现OPT、FIFO和LRU页面置换算法的程序。

OPT算法

需要发生页面置换时,算法总是选择在将来最不可能访问的页面进行置换。

FIFO算法

算法总是选择在队列中等待时间最长的页面进行置换。

LRU算法

如果某一个页面被访问了,它很可能还要被访问;相反,如果它长时间不被访问,那么,在最近未来是不大可能被访问的。

实验代码

//页面置换
#include<iostream>
#include<time.h>
#include<stdlib.h>

using namespace std;

int file[30];//页面走向
int stop[30]={0};//是否发生缺页中断 
int times=0;//缺页中断次数 
int num[4]={0};//物理块
int flag=0;//标号 

void op(int N);
void op1(int i);
void op2(int i);
void op3(int i);
void show(int i);

int main()
{
    int choice;
    srand(time(NULL));
    for(int i=0;i<30;i++)
    {
        file[i]=rand()%10+1;
    }
    cout<<"******************实验四:虚拟存储*****************"<<endl
        <<"选择页面置换算法:"<<endl
        <<"1、最佳置换算法"<<endl
        <<"2、先进先出算法"<<endl
        <<"3、最近最久未使用算法"<<endl; 
    cin>>choice;
    if(choice==1||choice==2||choice==3) op(choice);
    else cout<<"输入错误,结束。"<<endl;
    return 0;
} 

void op(int N)
{
    int i,j;
    cout<<"页面走向"
        <<"物理块1"<<"\t"
        <<"物理块2"<<"\t"
        <<"物理块3"<<"\t"
        <<"物理块4"<<"\t"
        <<"缺页中断与否"<<endl
        <<"_____________________________________________________"<<endl;
    num[0]=file[0];
    times++;
    stop[0]=1;
    show(0);
    for(i=1;i<30;i++)//遍历页面走向 
    {
        for(j=0;j<4;j++)//遍历物理块 
        {
            if(file[i]==num[j])
            {
                show(i);
                break;
            }
            else 
            {
                if(num[j]==0)
                {
                    num[j]=file[i];
                    stop[i]=1;
                    times++;
                    show(i);
                    break;
                }
            }
        }
        if(j>=4)
        {
            if(N==1) op1(i);
            else if(N==2) op2(i);
            else op3(i);
        }
    }
    cout<<"缺页次数为:"<<times<<endl
        <<"缺页率为:"<<(double)times/30*100<<"%%"<<endl;
}

void op1(int i)
{
    int a[4];
    int a1,a2;
    for(a1=0;a1<4;a1++)
    {
        for(a2=i+1;a2<30;a2++)
        {
            if(file[a2]==num[a1]) break;
        }
        a[a1]=a2;
    }
    for(a1=0;a1<4;a1++)
    {
        if(a[flag]<a[a1]) flag=a1;
    }
    num[flag]=file[i];
    times++;
    stop[i]=1;
    show(i);
    flag=0;
}

void op2(int i)
{
    num[flag]=file[i];
    times++;
    stop[i]=1;
    show(i);
    flag=(flag+1)%4;
}

void op3(int i)
{
    int a[4];
    int a1,a2;
    for(a1=0;a1<4;a1++)
    {
        for(a2=i-1;a2>=0;a2--)
        {
            if(file[a2]==num[a1]) break;
        }
        a[a1]=a2;
    }
    for(a1=0;a1<4;a1++)
    {
        if(a[flag]>=a[a1]) flag=a1;
    }
    num[flag]=file[i];
    times++;
    stop[i]=1;
    show(i);
    flag=0;
}

void show(int i)
{
    cout<<file[i]<<"\t "
        <<num[0]<<"\t "
        <<num[1]<<"\t "
        <<num[2]<<"\t "
        <<num[3]<<"\t "
        <<stop[i]<<endl;
}

  • 页面置换算法模拟OPTFIFO和LRU算法
    • 实验目的
    • 实验内容
    • 实验代码

你可能感兴趣的:(C++,操作系统)