操作系统实验四:页式虚拟存储管理的模拟

一、实验目的:
掌握存储管理的基本原理、地址变换过程;用软件实现地址转换过程;用一种常用的页面置换算法来处理缺页中断并研究其命中率。
二、实验题目:
1、模拟请求分页存储管理的地址变换。
(1)请求分页虚拟存储器技术是把进程地址空间的全部信息存放在磁盘交换区上。当进程被选中运行时,先把进程的开始几页装入主存并启动运行。为此,在为进程建立页表时,应说明哪些页已在主存,哪些页不在主存。页表的格式如下表1所示:
表1 页表
页号 有效位 主存块号 修改位 外存地址
︙ ︙ ︙ ︙ ︙
其中:
有效位:表示对应页是否已经装入主存。0表示未装入,1表示已装入。
主存块号:表示该页面对应的主存块号地址。
修改位:表示该页进入主存后是否被修改过。0表示未修改过,1表示已修改过。
外存地址:表示该页内容存放在外存(磁盘)上的地址。
设计一个主存分块表,假定分配给进程的主存块数是M,且该进程开始的M页已装入主存。
(2)进程执行时,指令中的逻辑地址指出指令或操作数的地址中的页号和页内偏移量。硬件地址转换机构按页号查页表:
若该页有效位是1,表示该页已在主存,从而找到该页对应的主存块号。并根据如下公式计算出欲访问的主存地址:
绝对地址 = 块号*块的长度 + 页内偏移量
由于页的大小为2的整数次幂,所以,只要将块号和页内偏移量相拼接,放入主存地址寄存器,形成绝对地址。不去模拟指令的执行,而是输出被转换的地址即可。
若该页的有效位为0,则对应的页不在主存,将由硬件产生缺页中断,转操作系统处理。输出"该页号不在主存,产生缺页中断,转LRU缺页处理程序"。
假定主存每块长度为64个字节,主存共有128块。现有一个具有8页的进程,系统为它分配了4个主存块。其中第0~3页已经装入主存。该进程的页表如下表2所示,进程执行的指令序列如下表3所示,地址变换算法流程如图1所示。
表2 该进程的页表

页号 有效位 主存块号 修改位 外存地址
0 1 5 1 011
1 1 8 1 012
2 1 9 0 013
3 1 10 0 015
4 0 017
5 0 025
6 0 212
7 0 213

表3 进程的指令序列

操作 页号 单元号 操作 页号 单元号
+ 0 040 移位 4 052
+ 1 050 + 5 022
* 2 016 1 034
3 022 7 056
0 054 + 4 002
6 040 6 054
 表3中指令序列依次为左边6条、右边6条共12条指令,单元号即页内偏移量
2、模拟LRU置换算法实现分页管理的缺页处理。
在虚拟分页存储管理系统中,当硬件发出缺页中断后转操作系统处理缺页中断。如果主存中已无空闲块,采用LRU页面置换算法进行缺页处理。
用一个数组P构成堆栈,堆栈中的各元素为进程已在主存的页号。为了进行页面置换,可以设置一个栈指针HEAD,初始化为0;假设分配给每个进程的内存块数固定不变,为M;当栈满需要淘汰时,操作系统选择栈底的元素淘汰,其他元素向下移动一个位置,将新调入页放HEAD指示的栈顶。当访问的页在栈中时,还应调整页从当前位置到栈顶。采用LRU置换算法的过程如图2所示。每一次调整要求输出栈中元素。

三、实验过程记录:
根据以上说明设计一个(模拟)地址变换程序以及页面置换程序,程序的流程图分别如图1、图2所示。把运行结果显示到屏幕上。

import java.util.Objects;public class storerel {//初始化总页表static Pt Init(){Pt p1 = new Pt(0,1,5,1,11);Pt p2 = new Pt(1,1,8,1,12);Pt p3 = new Pt(2,1,9,0,13);Pt p4 = new Pt(3,1,10,0,15);Pt p5 = new Pt(4,0,-1,0,17);Pt p6 = new Pt(5,0,-1,0,25);Pt p7 = new Pt(6,0,-1,0,212);Pt p8 = new Pt(7,0,-1,0,213);Pt pstart = new Pt();pstart.next=p1;p1.next=p2;p2.next=p3;p3.next=p4;p4.next=p5;p5.next=p6;p6.next=p7;p7.next=p8;return pstart;}//初始化操作列表static Operate operlist(){Operate opstart = new Operate();Operate op1 = new Operate("+",0,40);Operate op2 = new Operate("+",1,50);Operate op3 = new Operate("*",2,16);Operate op4 = new Operate("存",3,22);Operate op5 = new Operate("取",0,54);Operate op6 = new Operate("减",6,40);Operate op7 = new Operate("移位",4,52);Operate op8 = new Operate("+",5,22);Operate op9 = new Operate("存",1,34);Operate op10 = new Operate("取",7,56);Operate op11 = new Operate("+",4,2);Operate op12 = new Operate("取",6,54);opstart.next = op1;op1.next=op2;op2.next=op3;op3.next=op4;op4.next=op5;op5.next=op6;op6.next=op7;op7.next=op8;op8.next=op9;op9.next=op10;op10.next=op11;op11.next=op12;return opstart;}//初始化页池(4个)static Pt ptpool(){Pt pstart = new Pt();Pt p1 = new Pt(0,1,5,1,11);Pt p2 = new Pt(1,1,8,1,12);Pt p3 = new Pt(2,1,9,0,13);Pt p4 = new Pt(3,1,10,0,15);pstart.next=p1;p1.next=p2;p2.next=p3;p3.next=p4;return pstart;}public static void main(String[] args) {Pt pt = Init();Pt ptpool=ptpool();Operate opt = operlist();Operate oppre=opt;while (oppre.next != null) {oppre=oppre.next;Pt psome = ptpool.find_pagenum(oppre.pagenum);if (psome.effectivenum!=-1){ptpool.send2first(psome);System.out.println("调用页面:"+ptpool.next.pagenum);int physicsaddress=64*psome.mmblocknum+oppre.pageoff;System.out.println("物理地址:"+physicsaddress);System.out.println(ptpool.toString());if(oppre.oper.equals("存")){psome.modify=1;}System.out.println("*******************************");}else {System.out.println("该页号不在主存,产生缺页中断,转LRU缺页处理程序");//LRU缺页处理;psome = pt.find_pagenum(oppre.pagenum);dosomething(ptpool,psome);System.out.println("调用页面:"+ptpool.next.pagenum);int physicsaddress=64*ptpool.next.mmblocknum+oppre.pageoff;System.out.println("物理地址:"+physicsaddress);System.out.println(ptpool.toString());System.out.println("*******************************");}}}//pt:总页表//ptpool:页池//ptsome:需要调用的页面,但其不在页池中static void dosomething(Pt ptpool,Pt ptsome) {Pt ptsome1 = new Pt(ptsome.pagenum, ptsome.effectivenum, ptpool.next.next.next.next.mmblocknum, ptsome.modify, ptsome.externaladdr);ptsome1.next=ptpool.next;ptpool.next=ptsome1;ptpool.next.next.next.next.next=null;ptsome1.effectivenum=1;}
}
class Pt{int pagenum;//页号int effectivenum;//有效位int mmblocknum;//主存块号int modify;//修改位int externaladdr;    //外存地址Pt next;public Pt() {this.pagenum = -1;this.effectivenum = -1;this.mmblocknum = -1;this.modify = -1;this.externaladdr = -1;this.next=null;}public Pt(int pagenum, int effectivenum, int mmblocknum, int modify, int externaladdr) {this.pagenum = pagenum;this.effectivenum = effectivenum;this.mmblocknum = mmblocknum;this.modify = modify;this.externaladdr = externaladdr;this.next=null;}//按照页号查找页表或页池public Pt find_pagenum(int L){Pt psome=this;while (psome.next != null) {psome=psome.next;if (psome.pagenum == L) {return psome;}}return new Pt();}@Overridepublic String toString() {Pt ptprint=this;String str="栈中元素:\n";while(ptprint.next!=null){ptprint=ptprint.next;str+="Pt{" +"pagenum=" + ptprint.pagenum +", effectivenum=" + ptprint.effectivenum +", mmblocknum=" + ptprint.mmblocknum +", modify=" + ptprint.modify +", externaladdr=" + ptprint.externaladdr +'}'+"\n";}return str;}//将页池里面的ptsome排序到第一个位置public void send2first(Pt ptsome){Pt ptpost=this;Pt ptpre=this;while (ptpre.next != null && ptpost.next!=null) {ptpre=ptpre.next;if (ptpre.equals(ptsome)) {ptpost.next=ptpre.next;ptpre.next=this.next;break;}ptpost=ptpost.next;}this.next=ptpre;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Pt pt = (Pt) o;return pagenum == pt.pagenum;}@Overridepublic int hashCode() {return Objects.hash(pagenum);}
}
class Operate{String oper;//操作int pagenum;//页号int pageoff;//页内偏移量Operate next;public Operate() {this.oper = "";this.pagenum = -1;this.pageoff = -1;this.next = null;}public Operate(String oper, int pagenum, int pageoff) {this.oper = oper;this.pagenum = pagenum;this.pageoff = pageoff;this.next = null;}
}

操作系统实验四-LRU算法的模拟相关推荐

  1. C语言 操作系统实验 四种调度(最高响应比优先算法 HRN)

    注: 本文是四个调度算法的第一篇算法. 本文是根据CSDN上某一FCFS调度算法魔改来的,所以FCFS的算法不会发到网站. 我是个菜鸡,发文是为了纪念自己完成了代码,以及累计自己的经验. 如有知识错误 ...

  2. 计算机操作系统实验:银行家算法模拟

    目录 前言 实验目的 实验内容 实验原理 实验过程 代码如下 代码详解 算法过程 运行结果 总结 前言 本文是计算机操作系统实验的一部分,主要介绍了银行家算法的原理和实现.银行家算法是一种用于解决多个 ...

  3. 操作系统课程设计---实验六 银行家算法的模拟与实现

    实验六 银行家算法的模拟与实现 完整课程设计源码及其报告查看:陈陈的操作系统课程设计 1.实验目的 (1) 进一步理解进程的并发执行. (2) 加强对进程死锁的理解,理解安全状态与不安全状态的概念. ...

  4. 广州大学2020操作系统实验四:文件系统

    相关资料 广州大学2020操作系统实验一:进程管理与进程通信 广州大学2020操作系统实验二:银行家算法 广州大学2020操作系统实验三:内存管理 广州大学2020操作系统实验四:文件系统 广州大学2 ...

  5. 操作系统实验四——使用命名管道实现进程通信

    操作系统实验四--使用命名管道实现进程通信 一. 实验目的 (1)了解windows系统环境下的进程通讯机制. (2)熟悉Windows系统提供的进程通信API. 二. 实验准备 相关API函数介绍 ...

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

    实验内容: 实现时间片轮转算法(模拟),要求如下: 1.用到的数据结构 /* PCB / struct PCB { pid_t pid;//进程 PID int state; //状态信息,1 表示正 ...

  7. 操作系统实验八:页面置换模拟程序设计

    一.实验目的 1.通过软件模拟页面置换过程,加深对请求页式存储管理实现原理的理解 2.理解和掌握OPT.FIFO和LRU三种页面置换算法,深入分析三者之间的优缺点. 二.实验环境 硬件环境:计算机一台 ...

  8. 操作系统实验六:作业调度算法模拟

    一.实验目的 (1)掌握周转时间.等待时间.平均周转时间等概念及其计算方法. (2)理解五种常用的进程调度算法(FCFS.SJF.HRRF.HPF.RR),区分算法之间的差异性,并用C语言模拟实现各算 ...

  9. 广州大学 操作系统实验之银行家算法

    实验二 银行家算法 一.实验目的 1.了解什么是操作系统安全状态和不安全状态: 2.了解如何避免系统死锁: 3.理解银行家算法是一种最有代表性的避免死锁的算法,掌握其实现原理及实现过程 二.实验环境 ...

最新文章

  1. 我的 FPGA 学习历程(11)—— 实验:按键消抖
  2. VTK:几何对象之QuadraticHexahedron
  3. Android 动画(一)---布局动画
  4. 标量函数,多语句表值函数,内嵌表值函数
  5. 中国长租公寓市场白皮书
  6. 4G通信技术LTE介绍
  7. Python NLP英文文本转小写
  8. Android性能优化——界面流畅度优化
  9. 【MTSP】遗传和粒子群算法求解多旅行商问题【Matlab 1156期】
  10. Aho - Corasick string matching algorithm
  11. 【以太网交换安全】---端口安全及MAC地址飘移防止与检测
  12. 猫和计算机连接网络,计算机路由器与猫的连接方法步骤
  13. web页面实现剪切板图片黏贴功能
  14. sqlserver 导入导出数据向导
  15. 《菜鸟教程》之基础教程
  16. 极飞P20植保无人机测评
  17. 我认为还是得学会自己焊接贴片元件,有专门的贴片元件焊接练习板,虽然有SMT,就像无人机要练习飞自稳一样。我们不能什么都靠SMT
  18. 【牛客 错题集】Linux系统方面错题合集
  19. suma++[代碼分析一]: 主入口visualizer.cpp
  20. mysql经常断电_MySQL突然断电异常解决

热门文章

  1. 第023、024讲:这帮小兔崽子汉诺塔 | 学习记录(小甲鱼零基础入门学习Python)
  2. Uigg - 免费开源、灵活的高颜值前端 UI 工具套件,专为设计师打造
  3. 故障:安装OFFICE2007时,刚开始安装,就提示“windows installer 服务不能更新一个或多个受保护的windows文件”,然后安装回滚,最后退出安装。
  4. python中迭代对象是什么_python中的迭代对象和迭代器
  5. 2016年-2021年【总目录】
  6. 成功职业指导:我适合往管理方向发展吗?
  7. 数影周报:程序员离职后锁公司硬盘;Salesforce 遭遇高管离职潮
  8. php飞信接口,中国移动飞信发送接口(Fetion API)
  9. 软件包应用分享|基于RT-Thread的百度语音识别(二)
  10. [生存志] 第112节 义军起山东