页面置换算法

实验目的

1.通过模拟实现几种基本页面置换的算法,了解虚拟存储技术的特点。
2.通过置换算法的模拟和比较,进一步了解它们的优缺点。
3.锻炼知识的运用能力和实践能力

实验要求

编写程序实现:先进先出页面置换算法(FIFO)和最近最久未使用页面置换算法(LRU)
说明:(1)关于页面走向的页地址流可利用随机数产生一个序列,模拟该页地址流,
也可以手工键盘输入的方式或读取文件中的页地址流。(2)初始时,假定所有页面均
不在内存。(3)计算并输出以上两种算法在分配不同内存物理块数时(讨论内存物理
块数分配为3,4,5)的缺页率。(4)至少验证两组数据,即页地址流。

实验内容概述

首先,了解页面算法的功能。页面的算法的功能是当出现缺页异常且调入新页面而内存已满时,置换算法选择被置换的物理页面进行置换。因此对于如何科学地选取被置换的物理页面根据不同的页面置换算法不同而不同。

其次,页面置换算法的设计目标是为了减少页面的调入调出次数,把未来不再访问或者短期内不访问的页面调出。常见的页面置换调度算法有先进先出页面置换算法(FIFO)、最近最久未使用页面置换算法(LRU)、最佳置换调度算法(OPT)、CLOCK置换算法等。

本次实验针对FIFO和LRU两种算法进行详细分析和模拟实验,深刻理解页面调度算法原理。

算法流程图

总体流程:
FIFO流程:
LRU流程图:

程序代码

#include <stdio.h>
#define phy 100
#define page 100//页面最大数
#define phyBlock 100//物理块最大数
//物理块的数量
int phyBlockNum;
//页面数量
int pageNum;
//保存页面号引用串
int pageNumStrList[page];
//初始化队列
void initializeList(int list[], int number)
{for (int i = 0; i < number; i++){list[i] = -1;}
}
//展示队列状态
void showList(int list[], int number)
{for (int i = 0; i < number; i++){printf("%2d", list[i]);}printf("\n");
}//展示当前内存状态
void showMemoryList(int list[], int phyBlockNum)
{for (int i = 0; i < phyBlockNum; i++){if (list[i] == -1){break;}printf(" |%d|", list[i]);}printf("\n");
}void informationCount(int missingCount, int replaceCount, int pageNum)
{printf("***********结果展示***********\n");printf("缺页次数:%d\n", missingCount);printf("缺页率:%d/%d\n", missingCount, pageNum);double result = (double)(pageNum - missingCount) / (double)pageNum;printf("置换次数:%d\n", replaceCount);printf("******************************\n");
}//找到该页面下次要访问的位置
int getNextPosition(int currentPage, int currentPosition, int strList[], int pageNum)
{for (int i = currentPosition + 1; i < pageNum; i++){if (strList[i] == currentPage){return i;}}return 100;
}
//先进先出置换算法
void replacePageByFIFO(int memoryList[], int phyNum, int strList[], int pageNum) {//置换次数int replaceCount = 0;//缺页次数int missingCount = 0;//记录当前最早进入内存的下标int pointer = 0;//记录当前页面的访问情况: 0 未访问int isVisited = 0;for (int i = 0; i < pageNum; i++) {isVisited = 0;//判断是否需要置换->内存已满且需要访问的页面不在内存中for (int j = 0; j < phyNum; j++) {if (memoryList[j] == strList[i]) {//该页面已经存在内存中//修改访问情况isVisited = 1;//修改访问时间//展示printf("%d\n", strList[i]);break;}if (memoryList[j] == -1) {//页面不在内存中且内存未满->直接存入memoryList[j] = strList[i];//修改访问情况isVisited = 1;missingCount++;//展示printf("%d\n", strList[i]);showMemoryList(memoryList, phyNum);break;}}if (!isVisited) {//当前页面还未被访问过->需要进行页面置换//直接把这个页面存到所记录的下标中memoryList[pointer] = strList[i];//下标指向下一个pointer++;//如果到了最后一个,将下标归零if (pointer > phyNum - 1) {pointer = 0;}missingCount++;replaceCount++;//展示printf("%d\n", strList[i]);showMemoryList(memoryList, phyNum);}}informationCount(missingCount, replaceCount, pageNum);
}//最近最久未使用置换算法
void replacePageByLRU(int memoryList[], int phyNum, int strList[], int pageNum) {//置换次数int replaceCount = 0;//缺页次数int missingCount = 0;//记录内存中最近一次访问至今的时间int timeRecord[phy];//初始化initializeList(timeRecord, phyNum);//记录当前页面的访问情况: 0 未访问int isVisited = 0;//记录已经在内存中的页面数量int pageCount = 0;for (int i = 0; i < pageNum; i++) {isVisited = 0;//时间加一for (int p = 0; p < pageCount; p++) {if (memoryList[p] != -1) {timeRecord[p] ++;}}//是否需要置换for (int j = 0; j < phyNum; j++) {if (memoryList[j] != -1) {timeRecord[j] ++;}if (memoryList[j] == strList[i]) {//该页面已经存在内存中//修改访问情况isVisited = 1;//重置访问时间timeRecord[j] = -1;//展示printf("%d\n", strList[i]);break;}if (memoryList[j] == -1) {//页面不在内存中且内存未满->直接存入memoryList[j] = strList[i];pageCount++;//修改访问情况isVisited = 1;//修改访问时间timeRecord[j] ++;missingCount++;//展示printf("%d\n", strList[i]);showMemoryList(memoryList, phyNum);break;}}if (!isVisited) {//需要置换//1.遍历时间记录表,寻找最久未访问的页面所在的内存下标int max = 0;for (int k = 0; k < phyNum; k++) {if (timeRecord[max] < timeRecord[k]) {max = k;}}//2.将该位置的页面换出memoryList[max] = strList[i];timeRecord[max] = -1;missingCount++;replaceCount++;//展示printf("%d\n", strList[i]);showMemoryList(memoryList, phyNum);}}informationCount(missingCount, replaceCount, pageNum);
}int main(int argc, const char* argv[])
{printf("***********************************\n");printf("*            页面调度算法         *\n");printf("***********************************\n");printf("请输入物理块数量:\n");scanf("%d", &phyBlockNum);//生成内存队列int memoryList[phyBlock];//初始化内存状态initializeList(memoryList, phyBlockNum);//showMemoryList(memoryList,phyBlockNum);printf("请输入要访问的页面总数:\n");scanf("%d", &pageNum);printf("请输入要访问的页面号:\n");for (int i = 0; i < pageNum; i++) {scanf("%d", &pageNumStrList[i]);}printf("*******************************\n");showList(pageNumStrList, pageNum);printf("*******************************\n");int chose;while (1){printf("请选择所需的置换算法(1.FIFO 2.LRU 3.退出):\n");scanf("%d", &chose);printf("*******************************\n");switch (chose){case 1:showList(pageNumStrList, pageNum);printf("*******************************\n");replacePageByFIFO(memoryList, phyBlockNum, pageNumStrList, pageNum);//重新初始化内存initializeList(memoryList, phyBlockNum);break;case 2:showList(pageNumStrList, pageNum);printf("*******************************\n");replacePageByLRU(memoryList, phyBlockNum, pageNumStrList, pageNum);//重新初始化内存initializeList(memoryList, phyBlockNum);break;default:return 0;break;}}return 0;
}

实验结果截图

  • 测试数据1:物理内存块分别为{3,4,5},页面长度为20,页面地址流为{7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1}

数据输入截图:物理内存块为3

FIFO结果:

LRU结果:
后面结果读者就自己去实验啦。

实验分析

本次实验通过对两种页面置换算法即先进先出置换算法(FIFO)以及最近最久未使用算法(LRU)进行了实验模拟,为了保证程序能够正常运行,系统必须从内存中调出一页内存放在磁盘上,以便将所需要的页调入内存,该过程称为页面调度,通过对以上两种算法的模拟,从中我深刻理解了两种算法的深层原理。本次实验要求基本达到,实验结果达到预期效果,下面是本次实验的收获以及心得:

物理内存块数量的增大可能使缺页率不降反增,这与该算法不考虑程序的动态特征有关;

影响缺页率的因素不是单一的,主存页框数,页面大小,页面替换算法、程序特征均会影响缺页率;

每种算法各有各的优缺点,例如FIFO算法简单,但通常缺页率较高,而LRU通常缺页率较FIFO低,但算法比较复杂,选择时各有取舍。

页面置换算法(FIFOLRU)相关推荐

  1. 三十七、页面置换算法

    一.知识总览 请求分页存储管理与基本分页存储管理的主要区别: 在程序执行的过程中,当所访问的信息不再内存中时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序. 若内存空间不够,由操作系统负责 ...

  2. 页面置换算法简单对比----《operating system concepts》《操作系统原理》

    置换策略 当请求调页程序要调进一个页面,但是该作业分配所得的主内存块已经全部用完,则必须淘汰改作业在贮存中的一个页面.置换算法就是决定选择哪一个页面进行淘汰的规则. 如置换算法不够好,就会导致刚淘汰的 ...

  3. 【操作系统】考研の页面置换算法例子(看不懂你来打我~!)

    文章目录 1 缺页率 2 页面置换算法 1 缺页率 缺页率=缺页次数/缺页次数+访问成功次数 2 页面置换算法 根据页面走向,使用先进先出页面淘汰算法时,页面置换情况见下表. 物理块数为3时: 走向 ...

  4. linux页面置换的存储,3.4.4 第二次机会页面置换算法

    3.4.4   第二次机会页面置换算法 FIFO算法可能会把经常使用的页面置换出去,为了避免这一问题,对该算法做一个简单的修改:检查最老页面的R位.如果R位是0,那么这个页面既老又没有被使用,可以立刻 ...

  5. linux存储--页面置换算法(十一)

    选择调出页面的算法就称为页面置换算法.好的页面置换算法应有较低的页面更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页面先调出. 常见的置换算法有以下四种 1. 最佳置换算法(OP ...

  6. 页面置换算法 - FIFO、LFU、LRU

    缓存算法(页面置换算法)-FIFO. LFU. LRU 在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO. LFU ...

  7. 页面置换算法(FIFO , LRU, OPT)(C++实现模拟)

    简述 先输入一个N表示的是,页表大小(最多能存的帧数). 之后的序列是最大为9,最小为0的一个申请序列. 之后的输入一个数字T,表示输入的测试命令的数目. 之后的命令. 第一个数表示使用什么页面置换算 ...

  8. 操作系统:几种页面置换算法

    1)最优置换算法(OPT)(理想置换算法) 最佳置换法(OPT):选择将来不再使用或在最远的将来才被访问的页调换出去(不便于实现) 这是一种理想情况下的页面置换算法,但实际上是不可能实现的.该算法的基 ...

  9. 2020-11-22(操作系统——页面置换算法)

    当内存中的页面满了之后,需要的数据又在磁盘虚拟内存中,可以使用页面置换算法将需要的页置换到物理内存中.下面先介绍几种局部页面置换算法,其针对一个进程而言的页面置换. 一.局部页面置换算法 1.最优页面 ...

  10. 操作系统:基于页面置换算法的缓存原理详解(下)

    概述: 在上一篇<操作系统:基于页面置换算法的缓存原理详解(上)>中,我们主要阐述了FIFO.LRU和Clock页面置换算法.接着上一篇说到的,本文也有三个核心算法要讲解.分别是LFU(L ...

最新文章

  1. php自动加载和实现方法,php 自动加载方法
  2. DeepMind推出「控制套件」:为「强化学习智能体」提供性能基准
  3. oracle asm clsecho,ASM磁盘组一点管理
  4. js中的事件循环和宏任务和微任务的理解
  5. alpha值计算 qcolor_量化交易与机器学习(四):如何研究alpha因子
  6. 怎么把打开方式改回计算机程序,电脑打开方式改变了,怎么还原
  7. ext教程_exe_作者blackant
  8. vs 编译器的堆空间不足_原创|面试官:Java对象一定分配在堆上吗?
  9. 电磁场中场点和源点及▽(R)▽(1/R)▽.▽(1/R)
  10. LeetCode-1.两数之和(哈希表)
  11. 隐马尔可夫模型HMM(一)
  12. matlab画圆(及其他常用图形)
  13. OpenDDS系列(1) —— OpenDDS 简介
  14. 2020下半年软考 软件设计师通过感言
  15. 阿里巴巴-码出高效+阿里巴巴Java开发手册(华山版)PDF下载
  16. 数据采集笔记(八爪鱼)-task1
  17. 怎么可以修改pr基本图形中的文字_视频剪辑 | pr的简单教学
  18. Principle for Mac(交互式UI原型设计神器)
  19. 不懂PS怎么修改图片尺寸?
  20. iPad连蓝牙鼠标鼠标滚动与屏幕相反的解决方法

热门文章

  1. 视频、音频格式转换全集
  2. kindeditor编辑器一键保存远程图片
  3. Scriptcase Crack,PHP Web 开发工具
  4. 计算机设备没有音频,电脑没有音频设备怎么办
  5. 手机平板如何查看IDEA中运行的Tomcat的web项目
  6. java 游戏源码_源码下载 - Java源码 - 游戏娱乐
  7. 函数调用中的堆栈平衡
  8. 汇编堆栈平衡的几种方式
  9. Ubuntu中触摸板如何开启,关闭
  10. mysqli_fetch_all() 函数