实验二 存储器管理

news2024/11/19 13:31:16

实验二   存储器管理

实验目的

理解各类置换算法的原理和虚拟存储器管理的方法。

实验内容:

编程实现LRU算法或CLOCK/改进算法等置换算法(二选一),模拟实现虚拟存储器的地址变换过程。

实验步骤:

1.改进型CLOCK算法

(1)改进型ClOCK算法描述:

在将一个页面换出时,如果该页已被修改过,便须将该页重新写回到磁盘上;但如果该页未被修改过,则不必将它拷回磁盘。在改进型CLOCK算法中,除须考虑页面的使用情况外,还须在增加一个因素,即置换代价,这样页面换出时,既要是未使用过的页面,又要是未被修改过的页面。把同时满足这两个条件的页面作为首选淘汰的页面。由访问位A和修改位M可以组合成下面四种类型的页面:

1类(A=0,M=0):表示该页最近既未被访问,又未被修改,是最佳淘汰页。

2类(A=0,M=1):表示该页最近未被访问,但已被修改,并不是很好的淘汰页。

3类(A=1,M=0):表示该页最近已被访问,但未被修改,该页有可能在被访问。

4类(A=1,M=1):表示该页最近已被访问且被修改,该页可能再被访问。

(2)改进型CLOCK页面置换算法的数据结构

1)内存块类和页面类

类名

属性

作用

Block

页面page

修改位modify

访问位access

用于表示一个内存块单元

Page

页号page

修改位modify

用于表示一个页面

注:Page的modify是预设置好的,也就是说页面访问串是预先生成的,生成的内容包括页面号和访问位,也就模拟了系统运行时要访问的页面号和要修改的页面。

(3)简单ClOCK算法流程图

 图1 简单Clock的页面置换算法

(4)改进型Clock页面置换算法流程图。

 

图2 改进型Clock页面置换算法流程图

 

2.改进型Clock算法的代码实现

(1)代码目录结构如图3所示。从上到下依次为内存块类,改进型页面置换算法及其测试代码,页面类。

图3 改进型Clock页面置换算法代码目录结构

 (2)Page页面类的代码如下。

public class Page{
	int page = -1;
	int modify = 0;
public Page(int page,int modify){
    this.page = page;
    this.modify = modify;
}


}

(3)Block页面块的代码如下。

public class Block {
	int page = -1;
	int access = 0;
	int modify = 0;
}

(4)Clock页面置换算法及其测试类的代码如下。测试数据通过三种方式实现,一种是随机生成,一种是自己输入+随机,最后一种是自己输入。

import java.util.Random;
import java.util.Scanner;
//改进型的页面置换算法
public class ClockTest {
		
		public static void main(String[] args) {
		    int size = 3;
		    int pagesize = 10;
		    Scanner in = new Scanner(System.in);
		    System.out.println("**************************************************************");
		    System.out.println("*************************改进型clock算法***************************");
		    System.out.println("*************注:预先生成页面访问序列再去调用页面置换算法,同时设置修改位***************");
		    System.out.println("**************************************");
		    System.out.println("请输入内存块的大小:");
		    size = in.nextInt();
		    Block[] arr = new Block[size];
		    for(int i = 0;i < size;i++){
		        arr[i] = new Block();
		    }
		    System.out.println("请输入访问页面的容量");
		    pagesize = in.nextInt();
		    Page[] pages = new Page[pagesize];

		    System.out.println("请选择操作(输入数字1或2或3):");
		    System.out.println("1、随机生成页面访问序列和修改位");
		    System.out.println("2、动态指定访问序列,随机生成修改位");
		    System.out.println("3、动态指定访问序列和修改位");
		    int action = in.nextInt();

		    Random random = new Random();
		    if(action == 1){
		        for(int i = 0;i < pagesize;i++){
		            pages[i] = new Page(random.nextInt(8),Math.abs(random.nextInt(10)%2));
		        }
		    }else if(action == 2){

		        for(int i = 0;i < pagesize;i++){
		            System.out.println("请输入第" + i + "个页号");
		            pages[i] = new Page(in.nextInt(),Math.abs(random.nextInt(10)%2));
		        }
		    }else if(action ==3){
		        for(int i = 0;i < pagesize;i++){
		            System.out.println("请输入第" + i + "个页号和是否被会被修改(1为修改0为未修改)");
		            pages[i] = new Page(in.nextInt(),in.nextInt());//模拟页号为1的页面不会被修改
		        }
		    }
		    System.out.println("===要访问的页面串如下===");
		    System.out.println("页面号\t是否被修改");
		    for (Page page : pages) {
		        System.out.println(page.page+"\t"+page.modify);
		    }
		    clock(arr,pages);
		}
	
		public static void clock(Block[] block,Page[] page){
		    boolean flag = false; 
		    int count = 0;   //缺页数
		    for(int i = 0;i < page.length;i++){
		    	 System.out.println("页面置换前的内存块的使用情况");
		    	 System.out.println("页面号\t"+"访问位\t"+"修改位\t");
		        for (int m = 0;m < block.length;m++) {
		        	
		            System.out.println( block[m].page +"\t" + block[m].access + "\t"+block[m].modify);
		        }
		        System.out.println("将要访问的页面---"+page[i].page);
		        if(contain(block,page[i])){
		            System.out.println("命中!");
		            System.out.println("页面号\t"+"访问位\t"+"修改位\t");
			        for (int m = 0;m < block.length;m++) {
			        	
			            System.out.println( block[m].page +"\t" + block[m].access + "\t"+block[m].modify);
			        }
		            System.out.println("*****************************************");
		            continue;
		        }else{
		            System.out.println("缺页...");
		            count++;
		            flag = false;
		        }

		    
		        while(!flag){
		        	
		            for(int j = 0;j < block.length;j++){
		                if(block[j].access == 0 && block[j].modify == 0){
		                    block[j].page = page[i].page;
		                    block[j].access = 1;
		                    block[j].modify=page[i].modify;
		                    flag = true;
		                    break;
		                }
		            }
		           
		            if(flag){
		                break;
		            }

		            for(int j = 0;j < block.length;j++){

		                if(block[j].access == 0 && block[j].modify == 1){
		                    block[j].page = page[i].page;
		                    block[j].access = 1;
		                    flag = true;
		                    break;
		                }else{
		                    block[j].access = 0;
		                }
		            }
		        }
		        System.out.println("页面号\t"+"访问位\t"+"修改位\t");
		        for (int m = 0;m < block.length;m++) {
		        	
		            System.out.println( block[m].page +"\t" + block[m].access + "\t"+block[m].modify);
		        }		        System.out.println("*****************************************");
		    }

		    System.out.println("缺页次数:" + count);
		    System.out.println("缺页率:" + (count*1.0)/page.length);
		}

		public static boolean contain(Block[] block,Page page){
		    for(int i = 0;i < block.length;i++){
		        if(block[i].page == page.page){
		            block[i].page = page.page;
		            block[i].access = 1;
		            block[i].modify = page.modify;
		            return true;
		        }
		    }
		    return false;
		}
		}	

(5)改进型Clcok页面置换算法的测试。

1)针对3个内存块,8个页面访问序列的情况的测试效果如图4-图6所示,图4采用的是随机生成的数据,图5页面置换的过程,图6显示的是缺页次数和缺页率。注:-1代表内存块未使用。

 测试:输入内存块3,页面大小8,采用1随机的方式

暂无,详见文字描述

图4 页面数据初始化

 

图5 页面置换过程

图6 缺页次数和缺页率

 2)针对个5内存块,8个页面访问序列的情况的测试效果如图7-图9所示,图7采用的是随机生成的数据,图8页面置换的过程,图9显示的是缺页次数和缺页率。注:-1代表内存块未使用。

测试:输入内存块5,页面大小8,采用1随机的方式

暂无,详见文字描述

图7 页面数据初始化

图8 页面置换过程

图9 缺页次数和缺页率

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

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

相关文章

C++之虚函数原理

对象数据和函数的存储方式 注意说的是对象。 C中的对象存储方式是 每个对象占用的存储空间只是该对象的数据部分&#xff08;虚函数指针和虚基类指针也属于数据部分&#xff09;&#xff0c;函数属于公共部分。 虚函数表 虚函数是通过虚函数表实现的。 C实现虚函数的方法是…

open3d io操作

目录 1. read_image, write_image 2. read_point_cloud, write_point_cloud 3. 深度相机IO操作 4. Mesh文件读取 1. read_image, write_image 读取jpg. png. bmp等文件 image_io.py import open3d as o3dif __name__ "__main__":img_data o3d.data.JuneauIma…

Redis持久化---RDBAOF

目录 一、什么是持久化&#xff0c;为什么要持久化&#xff1f; 二、RDB 2.1 配置文件 2.2 自动触发 2.3 手动触发 2.4 RDB优缺点 2.5 如何修复dump.rdb文件 2.6 哪些情况会触发快照 && 如何禁用RDB&#xff1f; 三、AOF 3.1 什么是AOF&#xff1f; 3.2 AO…

(四)Kubernetes - 手动部署(二进制方式安装)

Kubernetes - 手动部署 [ 3 ] 1 部署work node1.1 创建工作目录并拷贝二进制文件1.2 部署kubelet1.2.1 创建配置文件1.2.2 配置文件1.2.3 生成kubelet初次加入集群引导kubeconfig文件1.2.4 systemd管理kubelet1.2.5 启动并设置开机启动1.2.6 允许kubelet证书申请并加入集群 1.3…

猫狗训练集训练报错:Failed to find data adapter that can handle input

这里写自定义目录标题 Jupyter Notebook6.5.4 tensorflow 2.12.0 pillow 9.5.0 numpy 1.23.5 keras 2.12.0 报错详细内容&#xff1a; ValueError: Failed to find data adapter that can handle input: (<class ‘tuple’> containing values of types {“<class ‘k…

Midjourney关键词分享!附输出AI绘画参考图

Midjourney 关键词是指用于 Midjourney 这个 AI 绘画工具的文本提示&#xff0c;可以影响生成图像的风格、内容、细节等。Midjourney 关键词有一些基本的语法规则和套用公式&#xff0c;也有一些常用的风格词汇和描述词汇&#xff0c;这里我以10张不同风格和类型的美女图为例&a…

windows 下Node.js 版本管理工具

目录 1、概述&#xff1a; 2、下载安装 3、nvm命令 4、如何安装不在可用列表里面的版本 1、概述&#xff1a; 不同项目使用的nodejs版本和依赖等不同&#xff0c;需要进行nodejs的版本切换&#xff0c;使用nvm可以方便的切换当前的nodejs版本 windows可以使用 nvm-window…

AP360X 可充电多功能LED手电筒与移动照明控制ic和应用方案

产品展示 线路图如下&#xff1a; ​ AP360X芯片应用原理图和扩容1.8A应用&#xff1a; ​​ 1&#xff0c;产品介绍 AP360X 系列产品是一款多种模式可选 的单芯片 LED 手电筒控制芯片&#xff0c;集成了锂电 池充电管理模块、手电筒功能控制模块和保 护模块&#xff0c;关机…

剑指 Offer 34. 二叉树中和为某一值的路径 / LeetCode 113. 路径总和 II(深度优先搜索)

题目&#xff1a; 链接&#xff1a;剑指 Offer 34. 二叉树中和为某一值的路径&#xff1b;LeetCode 113. 路径总和 II 难度&#xff1a;中等 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 …

身为程序员,你有哪些提高写代码效率的黑科技?

目录 1、Google/Stackoverflow——搜索解决方案的能力 2、低代码平台——提供可复用的轮子 3、人工智能——帮你写代码 4、学会话术——消除烦恼 5、 按时上下班&#xff0c;一周工作 5 天&#xff0c;养足精神以更高效地写代码。 首先&#xff0c;每个程序员都是会利用工…

GPU理解

什么是GPU GPU(Graphics Processing Unit)代表图形处理单元。该术语通常与图形卡或视频卡等术语互换使用。从技术上讲&#xff0c;GPU 是第三方显卡或主板上的主要图形处理芯片。 GPU 与 CPU不同。CPU 是中央处理器&#xff0c;它是计算机的主要大脑。GPU 专用于执行在计算机…

操作系统内存管理笔记

计算机的硬件设备 计算机的硬件设备中&#xff0c;有三个部件最为关键&#xff0c;它们分别是中央处理器CPU、内存和I/O控制芯片。 系统软件 系统软件可以分成两块&#xff0c;一块是平台性的&#xff0c;比如操作系统内核、驱动程序、运行库和数以千计的系统工具&#xff1…

文献阅读(51)—— Transformer 用于中国空气质量检测

文献阅读&#xff08;51&#xff09;—— Transformer 用于中国空气质量检测 文章目录 文献阅读&#xff08;51&#xff09;—— Transformer 用于中国空气质量检测先验知识/知识拓展文章结构背景文章方法1. Dartboard Spatial MSA(DS-MSA)2. CT-MSA3. 自上而下的随机阶段 文章…

Tapdata 的 ∞ 实践:中小企业如何轻量、高效地搭建起一个灵活易用的数字化平台

数字化浪潮的裹挟下&#xff0c;企业的转型之路正在变得愈加清晰。 然而在数字化转型这条企业生存和发展的必由之路上&#xff0c;更易受到市场变化冲击、所处环境竞争压力更大的中小企业无疑在面临更多的困难和挑战。一方面&#xff0c;中小企业为了顺应时代潮流、适应市场需…

jQuery移动端日期组件,H5移动端日期组件,MUI移动端日期组件,移动端简单的日期组件

前言 比较简单 H5移动端日期组件&#xff0c;使用的是MUI官方JS组件&#xff0c;因为不想自己写一个所以直接拿来改动一下用了 效果图 实现 准备工作 到官网下载css和js&#xff1a;https://dev.dcloud.net.cn/mui/ 到官网查看API&#xff1a;https://dev.dcloud.net.cn/mu…

中国社科院与美国杜兰大学金融管理硕士项目——迎接立夏,切莫忘记自我成长

五月的风吹走了春季&#xff0c;今天我们迎来立夏。作为夏季的第一个节气&#xff0c;立夏常被人们当做万物蓄满能量&#xff0c;即将加速生长的标志。而在职的我们&#xff0c;也应该跟这世间万物一样&#xff0c;在季节交替之时沉淀自己、努力向上成长。在社科院与杜兰大学金…

推荐6个我经常逛的“小网站”,嘿嘿嘿!!!

如今&#xff0c;全球互联网上已经有超过 17 亿个网站。除了全球那些主流网站被大家所熟知外&#xff0c;其实还有很多很多网站&#xff0c;被淹没在了互联网世界中。 每次发现优质的内容都会第一时间给大家分享出来&#xff0c;不管是软件&#xff0c;插件&#xff0c;脚本还…

vscode 实现代码编译

vscode 实现代码编译 之前一直纠结用vascode的编译按钮实现编译&#xff0c;这样就需要额外配置json文件&#xff0c;会非常麻烦&#xff0c;其实vscode也支持用编译命令&#xff0c;具体步骤如下&#xff1a; 新建makefile文件&#xff0c;文件内容如下&#xff1a; target: g…

Activity四种启动模式分析

一、前言 在初学Android的时候&#xff0c;几乎所有的学习资料都会提到Activity有四种启动模式&#xff1a; standardsingleTopsingTasksingleInstance 而提到这四种启动方式的差异&#xff0c;必然要提到一个重要的概念Activity的Task任务栈&#xff0c;我们需要明确的一点是…

vue3之vite创建H5项目之4 ( 自动导入api、按需引入van)

vue3之vite创建H5项目之4 1:自动导入vue3相关api之ref等 &#xff08;unplugin-auto-import&#xff09; pnpm i unplugin-auto-import -D 1-1 自动导入vue3相关api之ref 1-1 vite.config.ts 配置 import AutoImport from "unplugin-auto-import/vite"export de…