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

这篇具有很好参考价值的文章主要介绍了计算机操作系统实验:页面置换算法的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本实验的目的是通过编程模拟不同的页面置换算法,比较它们的缺页率和命中率,加深对操作系统内存管理的理解。本实验采用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语言编写程序,实现了这三种算法,并对它们进行了比较和分析。文章来源地址https://www.toymoban.com/news/detail-434441.html

到了这里,关于计算机操作系统实验:页面置换算法的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 实现时间片轮转算法(模拟)计算机操作系统实验5:进程调度算法模拟-RR

    实验内容: 实现时间片轮转算法(模拟),要求如下: 1、用到的数据结构 /* PCB / struct PCB { pid_t pid;//进程 PID int state; //状态信息,1 表示正在运行,0 表示暂停,-1 表示结束 unsigned long runned_time;//已运行时间 unsigned long need_running_time;//剩余运行时间 }; / PCB集合 */ struct PCB pcb[TOT

    2024年02月04日
    浏览(55)
  • 《操作系统》——计算机系统概述

    前言: 在之前的【Linux】学习中,我们已经对常见指令已经开发工具等进行了详细的了解。紧接着,我们将要学习的便是关于【Linux进程】的基本知识。但是为了帮助大家更好的理解相关的知识概念,我先带领大家来学习关于《操作系统》这门课的基本知识!!! 目录 (一)

    2024年02月03日
    浏览(92)
  • 操作系统 --- 计算机系统引论

            操作系统 ( Operating System , OS )是指控制和 管理 整个计算机系统的 硬件和软件 资源,并合理地组织调度计算机的工作和资源的分配;以 提供给用户和其他软件方便的接口和环境 ;它是计算机系统中最基本的 系统软件。              ———— 王道       

    2024年02月09日
    浏览(56)
  • 【操作系统】 1、计算机系统概述

    从操作系统的角度上来划分计算机体系结构: 这里注意一点: 编译器属于应用程序。 操作系统 :是指 控制 和 管理 计算机系统的 硬件 和 软件 资源 ,合理的组织、调度计算机的工作与资源分配,进而为用户和其他软件提供 方便接口与环境的程序集合。 操作系统是计算机

    2024年02月08日
    浏览(68)
  • 计算机操作系统安全

    操作系统安全是计算机系统安全的重要组成部分,目的是保护操作系统的机密性、完整性和可用性。在当前的网络环境下,操作系统面临着许多威胁,如病毒、木马、蠕虫、黑客攻击等等。为了保护操作系统的安全,需要采取各种措施来防范这些威胁。本文将介绍一些常见的

    2024年02月02日
    浏览(49)
  • 计算机基础——操作系统

    作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。   座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录  前言 一.操作系统 1.操作系统简介  2.操作系统的主要功能 (1)资源管理 (2)人机交互  (3)程序控制 (4)进程管理

    2024年01月23日
    浏览(58)
  • 计算机操作系统-笔记

    第一章 引论 1. 操作系统定义 操作系统是运行在内核态的软件,它执行两个基本上独立的任务。 隐藏计算机底层硬件的实现,为用户及应用程序提供一个资源集的清晰抽象。 管理计算机硬件资源。 任何操作系统的核心是它可处理的系统调用集。这些系统调用集真实地说明了

    2024年02月20日
    浏览(57)
  • 计算机基础--->操作系统(4)【文件系统】

    文件系统主要负责管理和组织计算机存储设备上的文件和目录,其功能包括以下几个方面: 存储管理 :将文件数据存储到物理存储介质中,并且管理空间分配,以确保每个文件都有足够的空间存储,并避免文件之间发生冲突。 文件管理 :文件的创建、删除、移动、重命名、

    2024年02月08日
    浏览(76)
  • 计算机操作系统和进程

    ✨个人主页:bit me👇 ✨当前专栏:Java EE初阶👇 ✨每日一语:心平能愈三千疾,心静可通万事理。 操作系统是一组做计算机资源管理的软件的统称 目前常见的操作系统有:Windows系列、Unix系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等 防止硬件被时空的应用程序滥用

    2024年01月23日
    浏览(61)
  • 计算机操作系统原理期末总复习

    1、现代操作系统的四个特征是什么?(4分) 并发、共享、虚拟、异步 并发 :两个或多个事件在 同一时间间隔内 发生。 共享 :内存中多个并发执行的进程共同使用系统中的资源。 2、操作系统内核的四个主要功能是什么?(4分) 内存管理、进程管理、设备管理、文件管理

    2024年02月10日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包