页面置换算法模拟 最近最久未使用(LRU)算法

news/2024/12/12 0:29:39/

最近最久未使用(LRU算法是一种基于页面访问历史的页面置换算法。它选择最久未使用的页面进行置换。当需要访问一个不在内存中的页面时,如果内存已满,则选择最久未使用的页面进行置换。LRU算法通过记录页面的访问时间戳来判断页面的使用频率。

最优(OPT)算法是一种理论上的最优页面置换算法,但在实际系统中难以实现。它基于未来的页面访问序列来选择最佳的置换页面。OPT算法假设系统能够预知未来的页面访问情况,从而选择在未来最长时间内不会被访问的页面进行置换。由于OPT算法需要预知未来的信息,因此在实际系统中无法应用。

缺页率是指在处理页面访问过程中进行页面置换的频率。在本实验中,我们可以通过统计每次页面访问时是否发生缺页来计算缺页率。具体地,当需要访问一个不在内存中的页面时,如果内存已满,则需要进行页面置换,此时发生一次缺页;如果内存未满,则直接将页面加载到内存中,不发生缺页。通过统计每次页面访问时的缺页次数,我们可以计算出不同页面置换算法在不同内存容量下的缺页率,并据此评估其性能表现。

LRU页面置换算法的流程可以简单描述如下:

1、随机生成页面引用:首先随机生成一系列的页面引用,这些页面引用代表了进程请求访问的页面序号。在本例中,我们生成了10个0到7之间的随机页面序号。

    2、用户输入物理块个数:接下来,系统提示用户输入进程被分配的物理块个数,即内存中可以同时容纳的页面数量。用户输入的数值应当是一个合理的值,通常不超过系统定义的最大页面总数。

    3、初始化物理块状态数组:根据用户输入的物理块个数,我们初始化一个物理内存块数组,用于模拟内存中的物理块。每个帧都包含一个页面号和一个时间值,分别表示当前帧中存储的页面序号和该页面最近一次被放入内存中的时间。

    4、页面置换:对于每个页面引用,我们检查它是否已经在内存中(即帧数组中是否有匹配的页面号)。如果在,则继续处理下一个页面引用;如果不在,则发生页面错误(缺页),我们需要从内存中选择一个页面进行置换。LRU算法选择最近最少使用的页面进行置换,即找到最长时间未被访问的页面,并将其从内存中移除,然后将新的页面引用加载到空闲的帧中。

     缺页率计算:在整个页面引用序列处理完毕后,我们统计页面错误的次数,并计算缺页率。缺页率是页面错误次数与总页面引用次数的比值,它反映了内存管理策略的效率。缺页率越低,表示内存管理策略越有效。

代码实现部分:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>


#define MAX_PAGES 8    //假设页面总数为8
#define MAX_REFERENCES 10   //假设随机生成10个页面引用
int pageFaultsNum = 0;//页面错误 (缺页)计数
int pageReplaceNum = 0;//页面置换次数

//也框结构体,用于存储页面号和调入内存的时间
typedef struct
{
    int pageNumber;
    int time;
} Frame;

//初始化页框数组
void initializeFrames(Frame frames[],int maxFrames)
{
    for(int i = 0;i < maxFrames; i++)
    {
        frames[i].pageNumber = -1;//初始时页面号为-1,表示空闲
        frames[i].time = -1;//最近依次被放入物理块的时间
    }
}

//生成0~9之间的随机页面序号
int genRandomPage()
{
    return rand() % MAX_PAGES;
}

//LEU页面置换算法,并计算缺页率
double lruPageReplacement(Frame frames[], int maxFrames, int referenceString[],int length)
{
    int frameFull = 0;//物理块已被装入个数
    pageFaultsNum = 0;//页面错误(缺页)计数清零
    pageReplaceNum = 0;//页面置换次数清零
    for(int i = 0;i < length; i++)
    {
        bool found = false;//标记页面是否在内存中
        int j = 0;
        for(j = 0;j< maxFrames;j++)
        {
            if (frames[j].pageNumber == referenceString[i])
            {
                found = true;//如果找到,则标记为已经找到,跳出循环
                break;
            }
        }
        //如果页面不在内存中,则发生页面错误(缺页),需要调入内存
        if(!found)
        {
            pageFaultsNum++;//把缺页次数+1
            if(frameFull<maxFrames)//物理块未满,可直接将页面装入
            {
                frames[frameFull].pageNumber = referenceString[i];
                frames[frameFull].time = i;
                frameFull++;
            }
            else//物理块已装满,需要置换一页出去
            {
                int smallTime = MAX_REFERENCES;
                int lruFrame = -i;
                for(int j = 0;j < maxFrames;j++)//遍历锁业物理块,选出时间最早的哪那个页面
                {
                    if(frames[j].time < smallTime)
                        {
                            smallTime = frames[j].time;
                            lruFrame = j;
                        }
                }
                //替换最近最久未使用的帧,新页号直接写入内存块中,并更新时间
                frames[lruFrame].pageNumber = referenceString[i];
                frames[lruFrame].time = i;
                pageReplaceNum++;//置换次数加1
            }
        }
        else
        {//该页已在内存,只需要更新一下使用时间
            frames[j].time = i;
        }
    }
    //计算缺页率
    printf("\n页面缺页次数为:%d\n",pageFaultsNum);
    printf("页面置换次数为:%d\n",pageReplaceNum);
    double pageFaultRate = (double)pageFaultsNum / length;

    return pageFaultRate;
}

int main()
{
    while(1)
    {
        srand(time(NULL));//初始化随机数生成器
        int referenceString[MAX_REFERENCES];//存储随机生成的页面引用
        for(int i = 0;i< MAX_REFERENCES;i++)
            referenceString[i] = genRandomPage();//生成随机页面序号

        int maxFrames;//进程被分配的物理块个数
        printf("请输入进程被分配的物理块个数(不超过%d):",MAX_PAGES);
        scanf("%d",&maxFrames);

        printf("随机生成的页面引用序列为:");
        for(int i = 0;i <MAX_REFERENCES;i++)
            printf("%d ",referenceString[i]);

        if(maxFrames <= 0|| maxFrames > MAX_PAGES)
        {
            printf("输入的物理块的个数无效,请输入1到%d之间的整数。\n",MAX_PAGES);
            return 1;
        }
        Frame frames[maxFrames];//初始化页框数组
        initializeFrames(frames,maxFrames);

        //调用LRU页面置换算法并计算缺页率
        double pageFaultRate = lruPageReplacement(frames,maxFrames,referenceString,MAX_REFERENCES);
        //输出结果
        printf("缺页率为:%.2f%%\n\n",pageFaultRate * 100);
    }
    return 0;
}
 

运行结果:

在原设置(页面总数8,页面引用序列10)的基础上,将物理块数设为3。

手动推导缺页和置换的过程:

7

2

5

5

5

5

1

6

5

0

1

7

7

7

7

7

7

1

1

1

0

2

2

2

2

2

2

2

6

6

6

3

5

5

5

5

5

5

5

5

是否缺页

缺页率: 6  / 10 = 60%

​​​​​​​在原设置(页面总数8,页面引用序列10)的基础上,将物理块数设为5。

手动推导缺页置换的过程,验证缺页率结果是否正确:

7

0

0

1

1

0

2

4

7

7

1

7

7

7

7

7

7

7

7

7

7

2

0

0

0

0

0

0

0

0

0

3

1

1

1

1

1

1

1

4

2

2

2

2

5

4

4

4

是否缺页

缺页率:5 / 10 = 50%

​​​​​​​修改代码,使得页面总数为10,页面序列为20,设定物理块数为3。

手动推导缺页置换的过程,验证缺页率结果是否正确:

9

4

8

9

3

6

2

0

1

8

8

0

0

2

2

8

8

8

2

9

1

9

9

9

9

9

9

2

2

2

8

8

8

8

8

8

8

8

8

8

8

2

4

4

4

3

3

3

0

0

0

0

0

0

0

0

0

0

0

0

9

3

8

8

8

6

6

6

1

1

1

1

1

2

2

2

2

2

2

2

是否缺页

缺页率:11 / 20 = 55%

 


http://www.ppmy.cn/news/1554352.html

相关文章

wlanapi.dll丢失怎么办?有没有什么靠谱的修复wlanapi.dll方法

在遇到各种系统文件错误当中&#xff0c;其中之一就是“wlanapi.dll文件丢失”的问题。这种问题通常发生在Windows操作系统上&#xff0c;特别是当系统试图执行与无线网络相关的任务时。wlanapi.dll是一个重要的系统文件&#xff0c;它负责处理Windows无线网络服务的许多功能。…

前端-使用vue-cli脚手架创建项目

1.下载node&#xff1a;2.下载完检查是否安装成功 在cmd中输入&#xff1a;node --version或node -v 再在cmd中输入: npm -v npm默认的仓库地址是在国外&#xff0c;速度慢&#xff0c;所以设置淘宝镜像&#xff0c;速度就提升了&#xff0c;不设淘宝镜像也可以。 3.设置…

Hadoop生态圈框架部署(九-2)- Hive HA(高可用)部署

文章目录 前言一、Hive部署&#xff08;手动部署&#xff09;下载Hive1. 上传安装包2. 解压Hive安装包2.1 解压2.2 重命名2.3 解决冲突2.3.1 解决guava冲突2.3.2 解决SLF4J冲突 3. 配置Hive3.1 配置Hive环境变量3.2 修改 hive-site.xml 配置文件3.3 配置MySQL驱动包3.3.1 下在M…

opencvocr识别手机摄像头拍摄的指定区域文字,文字符合规则就语音报警

安装python&#xff0c;pycharm&#xff0c;自行安装。 Python下安装OpenCv 2.1 打开cmd,先安装opencv-python pip install opencv-python --user -i https://pypi.tuna.tsinghua.edu.cn/simple2.2 再安装opencv-contrib-python pip install opencv-contrib-python --user …

CSS Flexbox 与 Grid 布局详解

CSS Flexbox 与 Grid 布局详解 在现代网页设计中&#xff0c;布局的灵活性和响应性是至关重要的。CSS 提供了两种强大的布局工具&#xff1a;Flexbox 和 Grid。这两种布局方式各有优势&#xff0c;能够帮助开发者创建复杂的、响应式的网页布局。本文将深入探讨 CSS Flexbox 和…

C#怎么判断电脑是否联网

在 C# 中&#xff0c;可以通过几种方法检测计算机是否联网。以下是几种常用的方式&#xff1a; 1. 使用 System.Net.NetworkInformation.Ping 类 通过发送一个 Ping 请求到公共 DNS 服务器&#xff08;如 Google 的 DNS 8.8.8.8&#xff09;来检测是否联网。这是最常见的一种…

矩阵的加减

加法和减法都符合MATLAB的五种兼容模式&#xff0c;以加法为例: 1. A A A为一个矩阵&#xff0c; B B B为一个值 A B AB AB表示将矩阵 A A A中的每一个元素都加上 B B B 2. A A A为一个矩阵&#xff0c; B B B为一个矩阵且 A A A和 B B B同型矩阵 A B AB AB表示将矩阵 A …

Lumoz的ZK算力网络,加速以太坊3.0的到来

1.Lumoz 模块化计算层 Lumoz 协议是一个全球分布式模块化计算协议&#xff0c;致力于提供先进的零知识证明&#xff08;ZKP&#xff09;服务&#xff0c;支持ZK技术的发展&#xff0c;为ZK、AI等前沿技术提供强大的算力支撑。面对当前零知识计算领域计算成本的挑战&#xff0c…