Linux实验——页面置换算法模拟

news2024/11/24 16:25:14

页面置换算法模拟

【实验目的】

(1)理解虚拟内存管理的原理和技术。

(2)掌握请求分页存储管理的思想。

(3)理解常用页面置换算法的思想。

【实验原理/实验基础知识】

存储器是计算机系统的重要资源之一。任何程序、数据以及用于实现控制的数据结构都必须占用一定的存储空间,因此存储管理直接影响系统性能。

  • 虚拟内存

在计算机存储体系结构中,内存空间有限,能装入内存并发执行的进程数目受到限制,同时,对于一些较大的进程来说,如果其需求的内存空间容量超过系统实际能够提供的内存容量时,进程将无法执行。

存在该问题的原因是常规存储器管理过程中存在一次性及驻留性这样的特征。常规存储管理在作业执行前,要求一次性全部装入内存,且在作业装入内存后,整个作业一直驻留在内存中,直至作业运行结束。实际上,在一个作业执行过程中,其大部分程序和数据并不经常被访问,这些不经常被访问的程序、数据占据了大量存储空间,需要运行的作业又无法装入内存。

系统借助虚拟存储技术解决了上述问题。虚拟存储技术的基本思想是,作业在运行前无需一次性全部装入内存,仅将当前要运行的页面或段装入,其余部分暂存在外存上。程序运行过程中,如果其要访问的页面或段不在内存,则向系统发出缺页中断请求,将该页面或段调入内存后继续执行。调入时若内存全满,则通过页面置换将内存中暂时不用的页面或段调至外存,然后执行待访问页面的调入操作。

操作系统采用虚拟技术,在不改变物理内存实际大小的情况下提供的逻辑上被扩充了的内存。这种物理上不具备而逻辑上具备的内存就是虚拟内存。

  • 请求分页存储管理

分页存储管理通过一个页面分配一个内存块,内存块在物理位置上可连续,也可不连续,这样能够提高存储空间的利用效率。但是,作业需要一次性全部装入内存空间。在分页存储管理的基础上结合虚拟存储技术进行空间分配,可进一步提升存储空间使用效率。

请求分页存储管理的基本思想是,进程开始执行前,只需部分装入即将运行的页面,然后根据需要载入其他页面,分配空间可连续,也可不连续。

  • 页面置换算法

  1. 置换时机

当要将辅存中的一页面并送入到全满的内存中时,必须把已在内存中的某一页淘汰掉。用来选择淘汰哪一页的规则叫做置换算法,也称为淘汰算法。

  1. 常用置换算法
    1. 先进先出算法FIFO:淘汰先调入内存的页。
    2. 最久未使用淘汰算法LRU:淘汰未被访问的页中时间最长的页。
    3. 最近未使用淘汰算法NUR:淘汰第1个最近未被访问的页(淘汰页表中第一个访问位为0的页)。
    4. 最少使用页面淘汰算法LFU:页表中增加一个访问记数器,淘汰那些到当前时间为止访问次数最少的页。
  2. 页面淘汰算法优劣的衡量标准

页面淘汰算法通过缺页率衡量置换算法的优劣,缺页率越小,说明算法适合该访问序列,系统效率高。

缺页率f’=f/a (a是总的页面访问次数,f是缺页次数)

【实验环境】VMware Workstation、RedHat

【实验步骤】

设计一个虚拟存储区和一个内存工作区,并使用下述常用页面置换算法计算缺页率。

先进先出(first in first out,FIFO)算法

要求如下:

  1. 由用户输入作业页面个数、总的页面访问次数及待访问页面序列。

  1. 由用户输入两个可选驻留集数值,需检查驻留集数值是否小于作业页面个数,不满足要求则重新输入。
  2. 提供选择页面置换算法的界面。
  3. 计算并输出不同页面置换算法在不同驻留集情况下的缺页率。
  • 页面置换算法代码

#include <stdio.h>
#include <stdlib.h>
// FIFO页面置换算法
double FIFO(int jobSize, int accessSize, int *accessSequence, int residentSetSize) {
    int pageFaults = 0;
    int *memoryQueue = (int *)malloc(residentSetSize * sizeof(int));
    int *isInMemory = (int *)calloc(jobSize, sizeof(int));
    for (int i = 0; i < accessSize; i++) {
        int page = accessSequence[i];
        if (!isInMemory[page]) {
            pageFaults++;
            if (i >= residentSetSize) {
                int oldestPage = memoryQueue[0];
                for (int j = 0; j < residentSetSize-1; j++) {
                    memoryQueue[j] = memoryQueue[j+1];
                }
                isInMemory[oldestPage] = 0;
            }
            memoryQueue[i % residentSetSize] = page;
            isInMemory[page] = 1;
        }
    }
    free(memoryQueue);
    free(isInMemory);
    return (double)pageFaults / accessSize * 100;
}
int main() {
    int jobSize, accessSize;
    printf("Enter the number of job pages: ");
    scanf("%d", &jobSize);
    printf("Enter the total number of page accesses: ");
    scanf("%d", &accessSize);
    int *accessSequence = (int *)malloc(accessSize * sizeof(int));
    printf("Enter the page access sequence: ");
    for (int i = 0; i < accessSize; i++) {
        scanf("%d", &accessSequence[i]);
    }
    int residentSetA, residentSetB;
    do {
        printf("Enter resident set A size: ");
        scanf("%d", &residentSetA);
        printf("Enter resident set B size: ");
        scanf("%d", &residentSetB);  
        if (residentSetA >= jobSize || residentSetB >= jobSize) {
            printf("Resident set sizes should be less than the number of job pages.\n");
        }
    } while (residentSetA >= jobSize || residentSetB >= jobSize);
    printf("FIFO page replacement algorithm:\n");
    printf("Resident set A: %.2lf%%\n", FIFO(jobSize, accessSize, accessSequence, residentSetA));
    printf("Resident set B: %.2lf%%\n", FIFO(jobSize, accessSize, accessSequence, residentSetB));
    free(accessSequence);
    return 0;
}

【实验报告】  

填写《上机实验报告》。

【思考题】

  1. 缺页率和驻留集之间的关系是什么?

答:缺页率与驻留集之间的关系是相互影响的。

驻留集是进程在运行过程中所需的物理页面数目,而缺页率是指进程在执行过程中,发生缺页中断的次数与总页面访问次数的比值。

如果驻留集太小,也就是进程所需物理页面数目过少,可能会导致频繁的缺页中断。这是因为当进程需要访问的页面不在内存中时,就会发生缺页中断,导致系统需要花费额外的时间来处理缺页,从而降低了系统的效率。这种情况下,缺页率会很高。

反之,如果驻留集太大,也就是进程所需物理页面数目过多,可能会导致多道程序并发度下降,资源利用率降低。这是因为当内存中驻留的页面数目过多时,可能会导致内存资源的浪费,同时也会增加系统管理的开销,从而降低了系统的效率。这种情况下,缺页率可能不会明显下降,因为即使增加物理页面数目,也可能会因为其他因素(如页面置换算法)导致缺页中断仍然频繁发生。

  1. 为什么驻留集数值需要小于页面个数?

答:驻留集数值要小于页面个数,主要是因为在实际的计算机系统中,内存是有限的。当一个进程在运行时,它需要访问的页面可能很多,如果全部放入内存,可能会占用过多的内存资源,导致其他进程无法获得足够的内存资源,从而影响系统的整体性能。

此外,如果驻留集大小等于页面个数,那么一旦发生缺页中断,就需要从硬盘中读取相应的页面来替换内存中的页面,这样会导致IO操作频繁发生,也会影响系统的性能。

因此,将驻留集大小设置小于页面个数,可以避免过度占用内存资源,同时也可以减少IO操作次数,提高系统的整体性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1366460.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

腾讯面试总结

腾讯 一面 mysql索引结构&#xff1f;redis持久化策略&#xff1f;zookeeper节点类型说一下&#xff1b;zookeeper选举机制&#xff1f;zookeeper主节点故障&#xff0c;如何重新选举&#xff1f;syn机制&#xff1f;线程池的核心参数&#xff1b;threadlocal的实现&#xff…

揭开JavaScript数据类型的神秘面纱

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ ​ ✨ 前言 JavaScript作为一门动态类型语言,其数据类型一直是开发者们关注的话题。本文将深入探讨Jav…

C语言算法(二分查找、文件读写)

二分查找 前提条件&#xff1a;数据有序&#xff0c;随机访问 #include <stdio.h>int binary_search(int arr[],int n,int key);int main(void) {}int search(int arr[],int left,int right,int key) {//边界条件if(left > right) return -1;//int mid (left righ…

MidTool的AIGC与NFT的结合-艺术创作和版权保护的革新

在数字艺术和区块链技术的交汇点上&#xff0c;NFT&#xff08;非同质化代币&#xff09;正以其独特的方式重塑艺术品的收藏与交易。将MidTool&#xff08;https://www.aimidtool.com/&#xff09;的AIGC&#xff08;人工智能生成内容&#xff09;创作的图片转为NFT&#xff0c…

数据库基础知识1

目录 数据库的使用 登录mysql 命令语法 常用命令 ​编辑 navicat建立连接 mysql授权管理命令 ​编辑mysql权限 数据导入导出 实例 数据导出 未登录 已经登录 导出导入的代码对比 ​编辑 导入导出的一个坑 python的导入导出 数据库基础知识 特点 需要掌握的程…

嵌入式——循环队列

循环队列 (Circular Queue) 是一种数据结构(或称环形队列、圆形队列)。它类似于普通队列,但是在循环队列中,当队列尾部到达数组的末尾时,它会从数组的开头重新开始。这种数据结构通常用于需要固定大小的队列,例如计算机内存中的缓冲区。循环队列可以通过数组或链表实现,…

使用Docker-compose快速构建Nacos服务

在微服务架构中&#xff0c;服务的注册与发现扮演着至关重要的角色。Nacos&#xff08;Naming and Configuration Service&#xff09;是阿里巴巴开源的服务注册与发现组件&#xff0c;致力于支持动态配置管理和服务发现。最近&#xff0c;一位朋友表达了对搭建一套Nacos开发环…

速卖通店铺销量飙升:掌握自养号测评(补单),轻松提升销售量

很多卖家在经营速卖通店铺时&#xff0c;都希望能提高自己店铺的曝光率。但对于一些新手卖家来说&#xff0c;可能不太清楚曝光率的具体含义以及如何提升。那么&#xff0c;让我们一起来探讨一下这个问题。 曝光率&#xff0c;简而言之&#xff0c;是指您的店铺和产品展示给顾…

springboot git配置文件自动刷新失败问题排查

http://{ip}:{port}/refresh 说明&#xff1a;springBoot版本是1.5.9&#xff0c;接口路径与2.x&#xff0c;不同 路径区别&#xff1a;/refresh VS /actuator/refresh 用postman调用refresh接口刷新git配置&#xff0c;报错如下&#xff0c;没有权限 在服务本地启动&#…

【Java】2023年业务实践中遇到的所有OOM情况及实战总结

OOM分析&实战 引言&#xff1a;一、JVM内存结构二、JVM OOM错误情况三、实践案例一案例二案例三 四、总结五、分析工具推荐六、参考文献 引言&#xff1a; 在Java开发中&#xff0c;随着应用程序变得越来越复杂&#xff0c;内存管理问题也变得愈加重要。而在JVM中的"O…

笔试案例2

文章目录 1、笔试案例22、思维导图 1、笔试案例2 09&#xff09;查询学过「张三」老师授课的同学的信息 selects.*,c.cname,t.tname,sc.score from t_mysql_teacher t, t_mysql_course c, t_mysql_student s, t_mysql_score sc where t.tidc.cid and c.cidsc.cid and sc.sids…

数据结构-测试6

一、判断题 1.若一个栈的输入序列为{1, 2, 3, 4, 5}&#xff0c;则不可能得到{3, 4, 1, 2, 5}这样的出栈序列。&#xff08;T&#xff09; 3比4先进&#xff0c;所以3比4后出&#xff0c;所以不可能得到 2. 在二叉排序树中&#xff0c;每个结点的关键字都比左孩子关键字大&…

【Qt开发】PyQt6--标签控件

标签控件 Qlabel设置标签文本文本的对齐方式为标签设置超链接为标签设置图片获取标签文本 Qlabel QLabel标签控件&#xff0c;用于显示用户不能编辑的文本&#xff0c;主要起提示的作用 设置标签文本 文本的对齐方式 通过这可以设置文本对齐方式 为标签设置超链接 勾选以上…

NGS基因测序(panel)报告解读数据库汇总

今天我们来梳理一下肿瘤基因报告解读常见的数据库&#xff0c;大家有机会可以自己查询并且解读&#xff0c;涉及到的数据库有dbSNP数据库 、gnomAD数据库、ExAC数据库、1000 Genomes、HGMD 数据库、OMIM数据库、ClinVar数据库、InterVar数据库 、ClinGen数据库、GeneReviews数据…

大创项目推荐 深度学习图像风格迁移

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习图像风格迁移 - opencv python 该项目较为新颖&#xff0c;适合作为竞赛课题…

自学编程资源收集

Java&#xff0c;Python&#xff0c;C&#xff0c;JavaScript,SpringBoot&#xff0c;Vue,MySql等各种编程资料收集 mksz712-系统玩转OpenGLAI&#xff0c;实现各种酷炫视频特效mksz709-从0到1训练私有大模型 &#xff0c;企业急迫需求&#xff0c;抢占市场先机~8mksz702-Chat…

布偶猫必囤主食冻干有哪些?三款K9、sc、希喂主食冻干深度测评!

喂养布偶猫的小诀窍&#xff1a;既要满足其食肉习性&#xff0c;又需关注其敏感肠胃。主食冻干是理想选择&#xff0c;它既符合猫咪天然的饮食结构&#xff0c;又采用新鲜生肉为原料。搭配其他营养元素&#xff0c;既美味又营养&#xff0c;还能增强抵抗力。我们将为您测评市场…

IPv6路由协议---IPv6动态路由(RIPng)

IPv6动态路由协议 动态路由协议有自己的路由算法,能够自动适应网络拓扑的变化,适用于具有一定数量三层设备的网络。缺点是配置对用户要求比较高,对系统的要求高于静态路由,并将占用一定的网络资源和系统资源。 路由表和FIB表 路由器转发数据包的关键是路由表和FIB表,每…

如何写一篇专利?格式与要求

如何写一篇专利&#xff1f;格式与要求 知识产权专利类型发明实用新型外观设计 专利的审查专利授权的标准新颖性创造性实用性 不授予专利的情形 专利的挖掘专利五书权力要求书说明书技术领域背景技术发明内容附图说明具体实施方式 说明书附图说明书摘要摘要附图 知识产权 市场…

流量控制在计算机网络中的应用

计算机网络是我们现代社会中必不可少的一部分&#xff0c;其在信息传输和分享方面起到了至关重要的作用。然而&#xff0c;面对大量的数据流量和用户请求&#xff0c;网络必须进行流量控制&#xff0c;以保证网络的稳定性和性能。本文将探讨流量控制在计算机网络中的应用。 流…