虚拟存储管理仿真

article/2025/9/23 14:35:49

实验内容

模拟请求分页虚拟存储管理技术中的硬件地址变换、缺页中断及页式淘汰算法处理缺页中断

实验目的

为了使大的作业(其地址空间超过内存可用空间)或多个作业的地址空间之和超过实际主存空间时,仍能运行,引入了”虚拟存储器”的概念.使作业的一部分地址空间在主存,另一部分在辅存,由操作系统实现多级存储的自动管理,实现主存间的自动覆盖.要求通过本实验,对请求分页管理有一个清楚的概念.

实验题目

第一部分:模拟请求分页虚拟存储管理技术中的硬件地址变换和缺页中断的过程
提示:
1、 请求分页虚拟存储管理技术是把作业地址空间的全部信息存放在磁盘上,当作业被选中运行时,先把作业的开始几页装入主存并启动运行.为此,在为作业建立页表时,应说明哪些页已在内存,哪些页不在内存.
页表的格式如下:
在这里插入图片描述
2、 作业在执行时,指令中的逻辑地址指出参加运算操作数(或指令)地址中的页号和页内偏移量.硬件地址转换机构按页号查页表.
若该页的标志为”1”,则表示该页已在主存,从而找到该页对应的内存块号,根据关系式:
绝对地址=块号*块的长度+页内偏移量
计算出欲访问的内存地址.由于页长为2的整次幂,所以只要将块号与页内偏移量相拼接,放入地址寄存器即可按照该地址取指令或取操作数,完成指定的操作.
若对应的页不在内存(即标志为0),则硬件产生缺页中断,转操作系统处理系统.根据页表中的”外存地址”,找到该页.再查内存分块表,找一个空闲块装入该页,修改页表和内存分块表,继续执行被中断的指令.
3、 设计一个”地址变换”程序,模拟硬件地址变换过程:
当访问的页在内存时,则形成绝对地址后,不去模拟指令的执行,而是输出被转换的地址;当访问的页不在内存时,则输出”*该页(页号)不在内存”,以表示产生了一次缺页中断;若地址非法,显示”地址非法”,并终止程序的运行
在这里插入图片描述假定内存的每块长度为128字节,现有一个只有七页的作业,其中第0页至第3页已经装入内存.该作业的页表如下:
在这里插入图片描述作业执行的指令序列如下表:
在这里插入图片描述运行你设计的地址变换程序,显示或打印运行结果.因为只是模拟地址变换,并不模拟指令的执行,故不考虑上述指令的操作结果.
第二部分:采用先进先出(或LRU)算法,实现分页管理的缺页调度.
提示:
1、 在分页虚拟存储系统中,当硬件发出缺页中断时,若内存中已无空闲块,当采用FIFO算法时,则淘汰最先进入内存的页,若该页修改过,还要存入磁盘,然后,再把当前要访问的页装入该块,并修改表中的对应标志.
2、 当采用LRU算法时,则淘汰最近很少访问的页.
两算法均可采用一个数组或链表记录内存中页号的排序,每次将链首页淘汰.数组或链表中只包含页的虚页号─项信息,其它信息通过查页表得到.
在这里插入图片描述

在这里插入图片描述

实验报告:

	(1)、程序中使用数据结构和符号说明.(2)、给出程序流程.(3)、打印初始页表、调入/出的页、每执行完一条指令页表的状态及得到的内存地址(4)、编程语言不限。

采用LRU算法解决

  • 首先创建page类模拟页,生成geeter setter 有参 无参方法 我引入的lombox插件自动生成,手动生成也可以
package com.xu.demo.ytu.lru;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Page {private  int pageNum;private int flag;private  int cacheNum;private String outAddress;private int changeNum;@Overridepublic String toString() {return"\t"+pageNum +"                 \t" + flag +"                   \t" + cacheNum +"                   \t" + outAddress +"                   \t" + changeNum ;}
}
  • 创建work类模拟工作表,生成geeter setter 有参 无参方法 我引入的lombox插件自动生成,手动生成也可以
package com.xu.demo.ytu.lru;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Work {private String operation;private int pageNum;private String unitNum;
}
  • LRU算法核心
package com.xu.demo.ytu.lru;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class LRU {Node head, tail;int size;//容量int capacity;Map<Integer, Node> cache;public LRU(int capacity) {this.capacity = capacity;//初始化链表initDoubleLinkList();size = 0;cache = new HashMap<>(capacity + 2);}public static class Node {public Node pre;public Node next;public int key;public Page page;public Node(int key, Page page) {this.key = key;this.page = page;}//空参public Node() {}}private void initDoubleLinkList() {//头结点head = new Node();//尾结点tail = new Node();//头指向尾head.next = tail;//尾指向头tail.pre = head;}//删除结点private void deleteNode(Node node) {node.pre.next = node.next;node.next.pre = node.pre;}//添加结点private void addNode(Node node) {head.next.pre = node;node.next = head.next;node.pre = head;head.next = node;}private void moveToHead(Node node) {//删除原来的结点关系deleteNode(node);//添加结点到头部addNode(node);}public Page get(int key) {Node node = cache.get(key);if (node == null) {return null;}moveToHead(node);return node.page;}public void put(int key, Page page) {//hashmap中直接查出时间复杂度为O(1)Node node = cache.get(key);//如果链表中存在继续添加就是把它添加到首位if (node != null) {node.page = page;moveToHead(node);return;}//如果不存在,先加进去,再移除尾结点if (size == capacity) {Node lastNode = tail.pre;deleteNode(lastNode);cache.remove(lastNode.key);size--;}//加入头结点Node newNode = new Node();newNode.key = key;newNode.page = page;addNode(newNode);cache.put(key, newNode);size++;}public static void main(String[] args) {//缓存容量为4LRU cache = new LRU(4);//已经存在与缓存的数据cache.put(3, new Page(3, 1, 1, "021", 0));cache.put(2, new Page(2, 1, 9, "013", 0));cache.put(1, new Page(1, 1, 8, "012", 1));cache.put(0, new Page(0, 1, 5, "011", 1));//初始化页List<Page> pages = new ArrayList<>();pages.add(new Page(0, 1, 5, "011", 1));pages.add(new Page(1, 1, 8, "012", 1));pages.add(new Page(2, 1, 9, "013", 0));pages.add(new Page(3, 1, 1, "021", 0));pages.add(new Page(4, 0, 0, "022", 0));pages.add(new Page(5, 0, 0, "023", 0));pages.add(new Page(6, 0, 0, "123", 0));System.out.println("————————————————————执行 初始化 操作————————————————————");System.out.println("  页号              \t标志            \t内存块号      \t外存地址           \t修改值");for (Page page : pages) {System.out.println(page + "\t");}System.out.println("LRU队列顺序:");System.out.print(cache.head.next.page.getPageNum()+"<--");System.out.print(cache.head.next.next.page.getPageNum()+"<--");System.out.print(cache.tail.pre.pre.page.getPageNum()+"<--");System.out.print(cache.tail.pre.page.getPageNum());System.out.println();//初始化工作表List<Work> works = new ArrayList<>();works.add(new Work("+", 0, "070"));works.add(new Work("+", 1, "050"));works.add(new Work("*", 2, "015"));works.add(new Work("存", 3, "021"));works.add(new Work("取", 0, "057"));works.add(new Work("-", 6, "040"));works.add(new Work("移位", 4, "053"));works.add(new Work("+", 5, "023"));works.add(new Work("存", 1, "037"));works.add(new Work("取", 2, "076"));works.add(new Work("+", 4, "001"));works.add(new Work("取", 6, "074"));//执行操作for (Work work : works) {Page page = cache.get(work.getPageNum());if (page == null) {System.out.println("————————————————————执行 " + work.getOperation() + " 操作————————————————————");System.out.println("操作的页:"+work.getPageNum());System.out.println("缓存不存在该页,发出缺页请求");System.out.println("该页面在于内存中");System.out.println("淘汰的页:"+cache.tail.pre.page.getPageNum());int i = Integer.parseInt(work.getUnitNum(), 8);pages.get(work.getPageNum()).setCacheNum(cache.tail.pre.page.getCacheNum());pages.get(cache.tail.pre.page.getPageNum()).setFlag(0);pages.get(cache.tail.pre.page.getPageNum()).setChangeNum(0);pages.get(cache.tail.pre.page.getPageNum()).setCacheNum(0);cache.put(work.getPageNum(), pages.get(work.getPageNum()));int n = (pages.get(work.getPageNum()).getCacheNum()) * 128 + i;System.out.println("绝对地址:" + Integer.toHexString(n));pages.get(work.getPageNum()).setFlag(1);pages.get(work.getPageNum()).setChangeNum(1);System.out.println("  页号              \t标志            \t内存块号      \t外存地址           \t修改值");for (Page p : pages) {System.out.println(p + "\t");}System.out.println("LRU队列顺序:");System.out.print(cache.head.next.page.getPageNum()+"<--");System.out.print(cache.head.next.next.page.getPageNum()+"<--");System.out.print(cache.tail.pre.pre.page.getPageNum()+"<--");System.out.print(cache.tail.pre.page.getPageNum());System.out.println();} else {System.out.println("————————————————————执行 " + work.getOperation() + " 操作————————————————————");System.out.println("操作的页:"+work.getPageNum());System.out.println("该页存在于缓存中");//将8进制转10进制再转16进制String reallyAddress = Integer.toHexString(page.getCacheNum() * 128 + Integer.parseInt(work.getUnitNum(), 8));System.out.println("绝对地址:" + reallyAddress);pages.get(work.getPageNum()).setFlag(1);pages.get(work.getPageNum()).setChangeNum(1);System.out.println("  页号              \t标志            \t内存块号      \t外存地址           \t修改值");for (Page p : pages) {System.out.println(p + "\t");}System.out.println("LRU队列顺序:");System.out.print(cache.head.next.page.getPageNum()+"<--");System.out.print(cache.head.next.next.page.getPageNum()+"<--");System.out.print(cache.tail.pre.pre.page.getPageNum()+"<--");System.out.print(cache.tail.pre.page.getPageNum());System.out.println();}}}}
  • 算法设计思路请添加图片描述

运行结果

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/0WaWeNkH.shtml

相关文章

虚拟内存空间

每一个进程都会对应一个虚拟地址空间&#xff0c;32位操作系统会为每个进程分配4G&#xff08;2的32次方&#xff09;的虚拟地址空间&#xff0c;而MMU&#xff08;Memory Management Unit&#xff0c;内存管理单元&#xff09;负责把这4G虚拟内存映射到实际的物理内存中。这4G…

虚拟化存储和非虚拟化存储

有文件系统的叫虚拟化存储,没有文件系统的叫非虚拟化存储。. 虚拟化存储:由SAN 或 NAS 提供的存储空间,需要添加一层文件系统来屏蔽底层的差异性,性能较差。支持更多的虚拟化特性。 非虚拟化存储:由分布式存储提供的存储空间,没有添加文件系统,性能好,但无法支持高级特…

内存管理:虚拟存储

内存管理——虚拟存储器 目录 内存管理——虚拟存储器虚拟存储器概述常规存储管理方式的特征和局部性原理虚拟存储的定义和特征虚拟存储器的实现方法1.分页请求系统2.请求分段系统 请求分页存储管理方式请求分页中的硬件支持1.请求页表机制2.缺页中断机构3.地址变换机构 请求分…

存储系统 —— 虚拟存储器

本文主要介绍以下几方面的知识&#xff1a; 页式存储器&#xff08;应用于虚拟存储器&#xff09;虚拟存储器&#xff08;深刻理解&#xff09; 1.页式存储器 注&#xff1a; 虚拟地址或虚拟存储器的理解&#xff0c;请参考下文 虚拟存储器 的介绍 页式存储虚地址 VS 实地址 地…

存储虚拟化概述

存储虚拟化概述 一、基本概念 存储虚拟化(Storage Virtualization)最通俗的理解就是对存储硬件资源进行抽象化表现。典型的虚拟化包括如下一些情况&#xff1a;屏蔽系统的复杂性&#xff0c;增加或集成新的功能&#xff0c;仿真、整合或分解现有的服务功能等。虚拟化是作用在一…

虚拟化存储技术

文章目录 前言一、HCLA存储技术趋势与智能存储组件1、HCLA存储技术趋势&#xff08;1&#xff09;、什么是数据存储&#xff08;2&#xff09;、数据存储系统&#xff08;3&#xff09;、数据分类&#xff08;4&#xff09;、数据存储发展趋势小结 2、智能存储组件控制框硬盘框…

【KALI网络安全】DNS攻击(劫持和欺骗)与网络钓鱼的模拟和预防(1)

1、DNS概述 关于DNS的定义&#xff0c;作用&#xff0c;分类以及工作原理&#xff0c;博主已在【Windows Server 2019】DNS服务器的配置与管理——理论】这篇博客中陈述过。 要预防DNS劫持&#xff0c;必须了解它的攻击原理和过程 声明 本博客不是在向大家展示这些攻击的方法…

DNS 欺骗攻击基于ettercap

开启Apache服务器如下图所示 在/var/www/html文件夹下找到index.html 文件用自己新建的文件替换。此为自己新建主页 查看默认主页 本次实验使用kali (192.168.1.88/24) 以及win7系统虚拟机&#xff08;192.168.1.133/24&#xff09; Win7 IP Kali ip 查看ettercap 使用命…

DNS欺骗攻击、DDoS攻击、XSS攻击和SYN Flooding攻击

DNS欺骗攻击 攻击者冒充域名服务器&#xff0c;向目标主机提供错误的DNS信息&#xff0c;当用户尝试浏览网页&#xff0c;输入域名访问某网页&#xff0c;但实际上访问到的IP地址并不是该网页的IP地址&#xff0c;而是攻击者准备的网页的IP地址&#xff0c;所以用户在网页中提…

『网络协议攻防实验』DNS欺骗攻击与防御

前言 靶机&#xff1a;seedubuntu 12.01&#xff0c;IP&#xff1a;192.168.199.138攻击机&#xff1a;Kali-2020.4&#xff0c;IP&#xff1a;192.168.199.129工具&#xff1a;ettercap 原理 DNS&#xff08;DomainNameSystem&#xff0c;域名系统&#xff09;&#xff0c;…

DNS欺骗攻击

1.DNS域名系统&#xff1a;其主要作用是把主机的域名解析IP地址的系统&#xff0c;即使服务器更换了IP地址&#xff0c;我们依旧可以通过域名访问该服务器。 DNS域名查询可以简单的分为五个步骤&#xff1a; 网络用户客户端提出域名转换IP地址的请求地址解析程序resolve生成查…

局域网下ARP欺骗以及DNS劫持

DNS又称为域名劫持 定义&#xff1a; 域名劫持是互联网攻击的一种方式&#xff0c;通过攻击域名解析服务器&#xff08;DNS&#xff09;&#xff0c;或伪造域名解析服务器&#xff08;DNS&#xff09;的方法&#xff0c;把目标网站域名解析到错误的地址从而实现用户无法访问目标…

Seed lab dns欺骗实验——dns localdns remote

文章目录 1. 实验2. 实验步骤及结果2.1 DNS _Local2.1.1 环境搭建容器部署DNS配置测试部署 2.1.2 The Attack TasksTask 1: Directly Spoofing Response to UserTask 2: DNS Cache Poisoning Attack – Spoofing AnswersTask 3: Spoofing NS RecordsTask 4: Spoofing NS Record…

局域网内dns欺骗

今天学习了dns欺骗&#xff0c;对自己的试验结果进行一次记录。 一&#xff1a;对dns文件进行编辑 我们使用的欺骗工具是ettercap&#xff0c;首先对dns的文件进行编辑&#xff0c;通过终端打开 通过 i 键进入编辑状态&#xff0c;然后在红色的矩形中输入&#xff0c;前面的*…

应用“Cain Abel”实现DNS欺骗

环境的搭建&#xff1a; 1&#xff0c;在Windows 7安装IIS服务&#xff0c;访问www.baidu.com或其他任意站点&#xff0c;保存首页文件至本地wwwroot文件夹中&#xff1b; &#xff08;1&#xff09;打开控制面板&#xff0c;找到“程序”&#xff0c;点进去 点击“打开或关闭…

DNS欺骗及防御技术

一、DNS工作原理 1、DNS&#xff1a;域名服务协议&#xff0c;提供主机域名和IP地址之间的转换。 属应用层协议&#xff0c;端口号为53。DNS数据通过无连接的UDP协议传递 2、过程&#xff1a; 被 二、DNS欺骗原理原理及实现 1、DNS欺骗原理 当客户主机向本地DNS服务器查询域名的…

使用kali里的dnschef进行DNS欺骗

1. 前言 DNSChef是针对渗透测试人员和恶意软件分析师的高度可配置的DNS代理。它能够精细配置哪些DNS回复以修改或简单地代理真实响应。为了利用该工具&#xff0c;您必须手动配置DNS服务器以指向DNSChef。 2. 执行参数 选项参数&#xff1a; -h,--help显示帮助信息并退出--f…

DNS欺骗实战

DNS工作过程特点 • DNS 查询请求是层层传递&#xff0c;查询和应答无严格身份验证、会话无加密 • 收到应答后 DNS 服务器会缓存结果 DNS是什么 • DNS(Domain Name System&#xff0c;域名系统)&#xff0c;因特网上作为域名和IP地址相互映射的一个分布式数据库&#xff0c;能…

2.9 ARP和DNS欺骗

1、预备知识&#xff1a;ARP和DNS欺骗原理 1.1ARP欺骗 ARP&#xff08;Address Resolution Protocol&#xff0c;地址解析协议&#xff09;涉及TCP\IP体系结构中网络层的IP地址和数据链路层的MAC地址&#xff0c;即根据IP地址来查询对应的MAC地址。ARP欺骗的实质是破坏IP地址与…

网站被反诈中心DNS劫持解决教程

如果你的网站部分地区用户访问反馈访问不了&#xff0c;测试域名DNS被劫持到了127.0.0.1 或 0.0.0.0 可能是域名被墙了&#xff0c;或则被反诈中心拦截了&#xff0c;如果遇到该问题&#xff0c;需要检测单单被运营商拦截还是也有被反诈中心拦截。 排查过程: 可以把问题域名通过…