计算机操作系统实验:页面置换算法的实现

news2024/11/19 0:45:54

目录

  • 前言
  • 实验目的
  • 实验内容
  • 实验过程
    • 最佳置换算法
      • 代码实现
      • 算法流程
      • 流程图
      • 设计思路
      • 运行结果
    • 先进先出算法
      • 代码实现
      • 算法流程
      • 流程图
      • 设计思路
      • 运行结果
    • 最近最久未使用算法
      • 代码实现
      • 算法流程
      • 流程图
      • 设计思路
      • 运行结果
  • 总结

前言

本实验的目的是通过编程模拟不同的页面置换算法,比较它们的缺页率和命中率,加深对操作系统内存管理的理解。本实验采用C语言编写,实现了最佳置换算法(OPT)、先进先出置换算法(FIFO)和最近最久未使用算法(LRU)。实验中,页面号引用串从文本文件中读取,输出每次访问页面时内存中的页面情况,以及最终的缺页次数、缺页率和命中率。本文档将介绍实验的设计思路、流程图、代码和运行结果。

实验目的

(1)理解虚拟存储器的内存分页管理策略,掌握请求调度与置换的工作过程。
(2)掌握常用页面置换算法的思想,编制程序,将调试结果显示在计算机屏幕上,并检测机算和笔算的一致性。
(3)了解页面大小和内存实际容量对命中率的影响。

实验内容

(1)编程实现最佳置换算法(OPT)算法
(2)编程实现先进先出(FIFO)算法
(3)编程实现最近最久未使用(LRU)算法
基本要求:
(1)任选以上两种算法进行实现。
(2)能够根据给定的引用串及物理块数,在屏幕上输出该算法对应的置换图,及其缺页次数和缺页率。

实验过程

最佳置换算法

最佳置换算法(Optimal Page Replacement Algorithm)是一种理论上的页面置换算法,它通过选择以后不再使用或者在最长时间内不再被访问的页面进行置换,从而达到最低的缺页率。
最佳置换算法根据本人的理解是一种理想中的算法,它通过预测未来将会访问的页面进行页面置换,无疑,这将会最大程度的利用好资源,毕竟我们都已经知道未来会发生的事情,那自然可以做出 最好的选择,可惜世界又怎么会事事如意呢,因此,至少在目前,仍然只是一种理想中的算法罢了。

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int findOptimal(int pages[], int n, int index, int frame[], int f) {
    int res = -1;
    int farthest = index;
    for (int i = 0; i < f; i++) {
        int j;
        for (j = index; j < n; j++) {
            if (frame[i] == pages[j]) {
                if (j > farthest) {
                    farthest = j;
                    res = i;
                }
                break;
            }
        }
        if (j == n)
            return i;
    }
    return (res == -1) ? 0 : res;
}

void optimalPage(int pages[], int n, int f) {
    int frame[f];
    for (int i = 0; i < f; i++)
        frame[i] = -1;

    int hit = 0;
    for (int i = 0; i < n; i++) {
        int j;
        for (j = 0; j < f; j++)
            if (frame[j] == pages[i]) {
                hit++;
                break;
            }

        if (j == f) {
            int l = findOptimal(pages, n, i + 1, frame, f);
            frame[l] = pages[i];
        }

        printf("\n");
        for (int k = 0; k < f; k++)
            printf("%d ", frame[k]);
    }
    printf("\n\n缺页次数: %d", n - hit);
    printf("\n缺页率: %f\n", (n - hit) / (double)n);
}

int main() {
    int pages[] = {7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3};
    int n = sizeof(pages) / sizeof(pages[0]);
    int f = 4;

    optimalPage(pages, n, f);

    return 0;
}

算法流程

  1. 初始化一个大小为物理块数的帧数组,用于存储当前在内存中的页面。
  2. 遍历给定的引用串中的每个页面。
  3. 对于每个页面,检查它是否已经在帧数组中。如果是,则跳过该页面并继续遍历下一个页面。
  4. 如果该页面不在帧数组中,则需要进行页面置换。找到帧数组中以后不再使用或者在最长时间内不再被访问的页面,并用当前页面替换它。
  5. 重复步骤3和4,直到遍历完引用串中的所有页面。
  6. 计算缺页次数和缺页率。

流程图

在这里插入图片描述

设计思路

思路是通过选择以后不再使用或者在最长时间内不再被访问的页面进行置换,从而达到最低的缺页率,最佳置换算法是一种理论上的算法,因为它需要预先知道引用串中每个页面将来会被访问的时间,这在实际应用中是不可能做到的。但是,它可以作为其他页面置换算法的性能评估标准。

运行结果

在这里插入图片描述
上面的输出显示了最佳置换算法在每个时刻的帧数组状态,以及最终的缺页次数和缺页率。使用了一个引用串 {7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3} 和物理块数 4 来演示最佳置换算法。

先进先出算法

先进先出算法是一种简单的页面置换算法,它通过选择最早进入内存的页面进行置换,从而达到页面置换的目的。
一种比较朴素的思想

代码实现

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

void fifoPage(int pages[], int n, int f) {
    int frame[f];
    for (int i = 0; i < f; i++)
        frame[i] = -1;

    int hit = 0;
    int pointer = 0;
    for (int i = 0; i < n; i++) {
        bool allocated = false;
        for (int j = 0; j < f; j++)
            if (frame[j] == pages[i]) {
                hit++;
                allocated = true;
                break;
            }

        if (!allocated) {
            frame[pointer] = pages[i];
            pointer = (pointer + 1) % f;
        }

        printf("\n");
        for (int k = 0; k < f; k++)
            printf("%d ", frame[k]);
    }
    printf("\n\n缺页次数: %d", n - hit);
    printf("\n缺页率: %f\n", (n - hit) / (double)n);
}

int main() {
    int pages[] = {7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3};
    int n = sizeof(pages) / sizeof(pages[0]);
    int f = 4;

    fifoPage(pages, n, f);

    return 0;
}

算法流程

  1. 初始化一个大小为物理块数的帧数组,用于存储当前在内存中的页面。
  2. 遍历给定的引用串中的每个页面。
  3. 对于每个页面,检查它是否已经在帧数组中。如果是,则跳过该页面并继续遍历下一个页面。
  4. 如果该页面不在帧数组中,则需要进行页面置换。选择最早进入内存的页面进行置换,并用当前页面替换它。
  5. 重复步骤3和4,直到遍历完引用串中的所有页面。
  6. 计算缺页次数和缺页率。

流程图

流程图相同,但是页面置换有区别,在置换时选择最早进入内存的页面进行置换。

设计思路

思路是通过选择最早进入内存的页面进行置换,从而达到页面置换的目的,先进先出算法是一种简单且容易实现的页面置换算法,但它并不能保证获得最低的缺页率。在某些情况下,它甚至会导致比其他算法更高的缺页率。

运行结果

在这里插入图片描述
上面的输出显示了先进先出算法在每个时刻的帧数组状态,以及最终的缺页次数和缺页率。,它使用了一个引用串 {7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3} 和物理块数 4 来演示先进先出(FIFO)算法。

最近最久未使用算法

最近最久未使用算法是一种常用的页面置换算法,它通过选择最近最久未被访问的页面进行置换,从而达到页面置换的目的。

代码实现

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

int findLRU(int time[], int f) {
    int min = time[0];
    int res = 0;
    for (int i = 1; i < f; i++) {
        if (time[i] < min) {
            min = time[i];
            res = i;
        }
    }
    return res;
}

void lruPage(int pages[], int n, int f) {
    int frame[f];
    for (int i = 0; i < f; i++)
        frame[i] = -1;

    int time[f];
    for (int i = 0; i < f; i++)
        time[i] = 0;

    int hit = 0;
    for (int i = 0; i < n; i++) {
        bool allocated = false;
        for (int j = 0; j < f; j++)
            if (frame[j] == pages[i]) {
                hit++;
                time[j] = i + 1;
                allocated = true;
                break;
            }

        if (!allocated) {
            int lru = findLRU(time, f);
            frame[lru] = pages[i];
            time[lru] = i + 1;
        }

        printf("\n");
        for (int k = 0; k < f; k++)
            printf("%d ", frame[k]);
    }
    printf("\n\n缺页次数: %d", n - hit);
    printf("\n缺页率: %f\n", (n - hit) / (double)n);
}

int main() {
    int pages[] = {7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3};
    int n = sizeof(pages) / sizeof(pages[0]);
    int f = 4;

    lruPage(pages, n, f);

    return 0;
}

算法流程

  1. 初始化一个大小为物理块数的帧数组,用于存储当前在内存中的页面。
  2. 初始化一个大小为物理块数的时间数组,用于记录每个页面最近被访问的时间。
  3. 遍历给定的引用串中的每个页面。
  4. 对于每个页面,检查它是否已经在帧数组中。如果是,则更新该页面在时间数组中对应的值,并跳过该页面继续遍历下一个页面。
  5. 如果该页面不在帧数组中,则需要进行页面置换。选择时间数组中值最小的页面进行置换,并用当前页面替换它,同时更新该页面在时间数组中对应的值。
  6. 重复步骤4和5,直到遍历完引用串中的所有页面。
  7. 计算缺页次数和缺页率。

流程图

多初始化一个时间数组,用于记录每个页面最近被访问的时间,在置换时选择时间数组中值最小的页面进行置换,同时更新该页面在时间数组中对应的值。

设计思路

设计思路是通过选择最近最久未被访问的页面进行置换,从而达到页面置换的目的。最近最久未使用算法是一种常用且有效的页面置换算法,它能够在很多情况下获得较低的缺页率。但是,它需要额外的空间来存储每个页面最近被访问的时间,并且在每次访问时都需要更新时间数组,这会增加算法的时间复杂度。

运行结果

在这里插入图片描述
上面的输出显示了最近最久未使用算法在每个时刻的帧数组状态,以及最终的缺页次数和缺页率,它使用了一个引用串 {7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3} 和物理块数 4 来演示最近最久未使用(LRU)算法。

总结

本文总结了计算机操作系统实验中的三种页面置换算法:最佳置换算法(OPT)、先进先出置换算法(FIFO)和最近最久未使用置换算法(LRU)。页面置换算法是在内存已满且需要访问的页面不在内存中时,选择一个内存中的页面换出的方法。不同的算法有不同的选择标准和效率。最佳置换算法是选择在未来最长时间内不再被访问的页面换出,它可以保证最低的缺页率和置换率,但是它是无法实现的,因为我们无法预知未来的页面访问情况。先进先出置换算法是选择最先进入内存的页面换出,它实现简单,但是效率不高,可能会导致经常被访问的页面被频繁地换出。最近最久未使用置换算法是选择最久没有被访问的页面换出,它是根据过去的页面访问情况来预测未来的访问情况,但是这种预测并不一定准确,因此它的效率也不是很高。本文通过C语言编写程序,实现了这三种算法,并对它们进行了比较和分析。

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

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

相关文章

基于思科模拟器的路由与交换实训报告(单臂路由、三层交换机实现vlan通信、ospf、rip、dhcp、acl、nat技术总结)

本博客是路由与交换实训报告&#xff0c;基于思科模拟器分别做了单臂路由、三层交换机实现vlan间通信、ospf、rip、dhcp、nat的实验&#xff0c;最后的nat综合实验是本次实训的大拓扑&#xff0c;综合了上述的几个技术。 大家可以当作一些思科小实验的总结&#xff0c;供网络工…

数据库管理-第七十二期 复盘(20230505)

数据库管理 2023-05-05 第七十二期 复盘1 再测试2 对照分析&#xff1a; 3 如何解决总结 第七十二期 复盘 上一期的内容&#xff0c;我承认主要是在放假&#xff0c;分析过程还是水了一点&#xff0c;SR转回国内之后&#xff0c;处理效率还是提升了一大截。 1 再测试 在客户…

Linux - 第11节 - 网络基础(一)

1.计算机网络背景 1.1.网络发展 独立模式&#xff1a;计算机之间相互独立 在早期的时候&#xff0c;计算机之间是相互独立的&#xff0c;此时如果多个计算机要协同完成某种业务&#xff0c;那么就只能等一台计算机处理完后再将数据传递给下一台计算机&#xff0c;然后下一台计…

Python进阶——实现人脸识别

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 今天我们来实现一下人脸识别~ 先问大家一个问题 什么是百度Aip模块&#xff1f; 百度AI平台提供了很多的API接口供开发者快速的调用运用在项目中 本文写的是使用百度AI的在线接口SDK模块&#xff08;baidu-aip&#…

单链表——单链表的定义及基本操作(初始化、头插法尾插法建表、查找、插入、删除、判空等)

单链表的定义 由于顺序表存在以下缺陷&#xff0c;所以衍生出了链表&#xff0c;而链表种类有很多种&#xff0c;今天我们讲的是单链表。 顺序表存在的问题如下 1.中间/头部的插入删除&#xff0c;时间复杂度为O(N) 2. 增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释…

CPU 架构(x86/ARM)简介

CPU 架构通过指令集的方式一般可分为 复杂指令集&#xff08;CISC&#xff09; 和 精简指令集&#xff08;RISC&#xff09; 两类&#xff0c;CISC 主要是 x86 架构&#xff0c;RISC 主要是 ARM 架构&#xff0c;还有 MIPS、RISC-V、PowerPC 等架构。 本文重点介绍 x86 和 ARM…

idea中maven的几个操作按钮:clean、validate、compile...

idea中Maven生命周期指令 clean命令 清除由项目编译创建的target validate命令 验证项目是否正确&#xff0c;并且所有必要的信息均可用 compile命令 编译项目的源代码 test命令 使用合适的单元测试框架来测试编译的源代码。 这些测试不应要求将代码打包或部署 verify命令 …

智安网络|一文看懂内核平台和系统服务的联系

内核平台和系统服务是操作系统中两个非常重要的组成部分。内核平台是系统底层的核心&#xff0c;负责管理和控制计算机硬件和资源的访问。而系统服务则是在内核之上运行的程序集合&#xff0c;为操作系统提供各种功能和服务。 内核平台和系统服务的关联非常密切。系统服务必须…

Emqx的简单使用

Emqx 是一个mqtt 的服务器产品。之前activemq可以作为mqtt协议的服务器&#xff0c;但是功能相对来说比较单一。Emqx作为跟Mqtt协议相关的新一代产品&#xff0c;功能实际上更为强大。 它的功能也主要体现在可视化/认证/规则/httpApi 上面。 1.Emqx 的安装 这里采用了docker…

JMeter 计算上一个接口取值到本次接口进行四则运算赋值

项目场景&#xff1a; 公司项目需要接口关联计算进行赋值&#xff1a; 项目场景&#xff1a;A接口提取的返回值&#xff0c;在传到B接口使用时&#xff0c;需要先进行四则运算后&#xff0c;再赋值使用。 A接口提取的值 B接口需要使用计算后的值 问题描述 使用beanshell预…

必须掌握的ArrayList,LinkedList,HashMap,HashTable,Collection,Colections

人的自由并不在于可以做他想做的事&#xff0c;而在于可以不做他不想做的事。 ArrayList和linkedList的区别 Array数组是基于索引&#xff08;index&#xff09;的数据结构&#xff0c;它使用索引在数组中搜索和读取数据是很快的 Array获取数据的时间复杂度是o(1)&#xff…

南卡OE系列再添新成员,造型犀利有型,性能强劲动听!

科技的快速发展让消费者对智能互联、操作体验、设计审美、安全健康等需求越发高涨&#xff0c;蓝牙耳机也正在由功能性向舒适性方向发展。如何提高蓝牙耳机的舒适度、拥有更舒适的听歌体验&#xff0c;成为蓝牙耳机品牌和消费者共同努力的方向。 Nank南卡&#xff1a;更专业的骨…

【Linux】单机版QQ之管道中的命名管道

还记得上一篇的匿名管道吗&#xff1f; 文章目录 前言一、命名管道总结 前言 命名管道是什么呢&#xff1f; 管道应用的一个限制就是只能在具有共同祖先&#xff08;具有亲缘关系&#xff09;的进程间通信。 如果我们想在不相关的进程之间交换数据&#xff0c;可以使用FIFO文…

一百零七、MySQL数据库的数据备份与数据恢复

MySQL数据库的数据备份与恢复主要有3种方法&#xff0c;前两种都是MySQL dump命令&#xff0c;第三种则是用Navicat工具直接备份。相比而言&#xff0c;第三种方法更加简单&#xff01; 1 方法一&#xff08;MySQL dump命令&#xff09; 1.1 登录MySQL [roothurys22 ~]# mysq…

Maya云渲染如何使用,Maya云渲染流程实操!

Maya 是一款专业的 3D 软件&#xff0c;用于创建逼真的角色和大片的效果&#xff0c;Maya可以加速工作流程&#xff0c;帮助您专注于创造力并按时完成任务。也可以为角色和场景添加精美的细节&#xff0c;并提供让客户满意的优质作品。更有无数业内顶级艺术家依靠 Maya来创作更…

【Halcon】新建程序 读取图片 路径设置

文章目录 1 新建程序2 读取一张图片3 图片路径4 图片格式读取报错5 快速添加 绝对路径 1 新建程序 点击新程序图标&#xff0c;即可新建&#xff1b; 程序另存为&#xff0c;会弹出保存路径 2 读取一张图片 read_image(Image,fabrik)此时工程路径下并没有图片&#xff1b; …

SpringBoot2 集成 ELK 实现日志收集

目录 一 简介 二 ELK 各组件作用 三 ELK 各组件安装 四 Spring Boot2 集成 logstash 一 简介 ELK 即 Elasticsearch、Logstash、Kibana 组合起来可以搭建线上日志系统&#xff0c;本文主要讲解使用ELK 来收集 SpringBoot2 应用产生的日志。 二 ELK 各组件作用 Elasticsea…

基于FPGA和Matlab实现的FFT功能验证

一 、FFT设计验证思路 1、基于Matlab与FPGA的混频sin信号的FFT验证&#xff0c;分别在Matlab和FPGA开发环境上实现相同的FFT功能设计。 2、Matlab平台开发&#xff0c;使用自带的fft函数与相关操作函数&#xff0c;绘制出混频sin信号&#xff0c;经过fft功能处理后的频谱图。 3…

2022 ios APP最新开发测试教程

转载&#xff1a;2022 ios APP最新开发测试教程1.本文详细介绍最新的在windows上进行ios app开发编译打包安装到手机测试的完整流程。介绍ios开发经常遇到的问题和解决方法&#xff0c;包括ios开发证书&#xff0c;ios开发描述文件等。http://kxdang.com/topic/appuploader/ios…

IP报文结构

文章目录 IP报文结构分片 IP报文结构 4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4. 4位头部长度(header length): 类似于TCP4位首部长度&#xff0c;通常填的是0101&#xff08;十进制5&#xff09; 16位总长度(total length): IP数据报整体占多少个字节.这用…