OS_页面置换算法:C++实现
一、实验目的:
通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种页面置换算法的基本思想和实现过程,并比较它们的效率。
二、实验内容:
本实验要求使用C语言编程模拟一个拥有若干个虚页的进程在给定的若干个实页中运行、并在缺页中断发生时分别使用FIFO、OPT和LRU算法进行页面置换的情形。
三、实验要求:
- 虚页的个数可以事先给定(例如10个),对这些虚页访问的页地址流(其长度可以事先给定,例如20次虚页访问)可以由程序随机产生,也可以事先保存在文件中。
- 要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的页面命中率(命中率=1-页面失效次数/页地址流长度)。
- 程序应允许通过为该进程分配不同的实页数,来比较几种置换算法的稳定性。
首先贯彻我们的初始风格,我们给出头文件和定义
#include<iostream>
using namespace std;
int page[] = {7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1,-1};//-1结束标志
int t[3] = {-1,-1,-1}; //三个物理块,由结束标志可以判断是否中间有内容
#define N 3
这个page就是我们的页,我们即将申请的页,t是物理块,都是以-1作为结束标志。
在我们的main函数中其实就是调用这些页面置换算法,看缺页次数和命中率即可。
接下来来到我们的第一个算法:先进先出FIFO
//先进先出
//主要算法思想:可以取一个时间数组记载每个物理块的时间,控制可以采取也可以采取递减
//我采用的是递减:我们可以使用一个bool记录是否被改变,未改变说明是刚刚使用的这个块我们立马
//使用,一共三块,然后继续,当我们要置换时,我们
//我们先去判断是否被改变过这个块,假设已经都改变过了,就看其时间
//时间长的就会减一减一,当我们要置换时,最先插入的已经被递减成了时间最短的,最短是0
//基本思想总结:每个插入就标记最长时间,每一次进入内存都在原在的时间-1,等到要置换的看有没有为0,
void FIFO(){
t[0]=t[1]=t[2] = -1;//init物理块
int time[3] = {0,0,0};//记录每个页面时间到达的先后
int num = 0,error = 0;//缺页次数
cout<<"+++++++++++FIFO++++++++++++"<<endl;
while(page[num] != -1){
if(cunzai(t,page[num])){
cout << page[num]<<','<<endl;//页面已经存在,不需要置换
}
else{
error++;
bool haschanged = false;
for(int i = 0;i<3;i++){
if(time[i] == 0&& haschanged == false){
time[i] = 2;
t[i] = page[num];
haschanged = true;
}
if(t[i]!= page[num] && time[i]!=0)time[i]--;
}
show(num);
cout<<endl;
}
num++;
}
cout<<"缺页次数:"<<error<<endl;
cout<<"命中率"<<1-((float)error/20)<<endl;
}
这里有两个方法,因为后面两个算法都要进行,所以我将其封装成了函数
cunzai()顾名思义判断是否存在在物理块中
show()是展示物理块中的情况,如果没有也就是等于-1我们可以用*代替,每次进行一次页面查找或置换我们都可以让它输出一次情况
最后输出缺页次数和命中率,代码很明显可以看懂,再此不进行叙述了。
ORT和LRU
基本思想我已经给出,希望读者自行体会
//最近最久未使用
//time还是一个计时变量,最开始进入物理块的时候是2,在已经存在的时候使用也会更新
//最后如果没有就找为0的将其替换,或者--使其为0再替换即可
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//最佳置换:<淘汰最长时间内不再被访问的页面 / 向后看>
//基本思想:用一个d来记录当前物理块中各个页再次出现的长度,如果不出现则是最长,
//将最长的与新的进行置换即可完成
对此已经完成了我们的需求
结束结束!休息
OS_页面置换算法:C++实现的更多相关文章
- 操作系统页面置换算法(opt,lru,fifo,clock)实现
选择调出页面的算法就称为页面置换算法.好的页面置换算法应有较低的页面更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页面先调出. 常见的置换算法有以下四种(以下来自操作系统课本). ...
- [Operate System & Algorithm] 页面置换算法
页面置换算法是什么?我们看一下百度百科对页面置换算法给出的定义:在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断.当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必 ...
- 操作系统 页面置换算法LRU和FIFO
LRU(Least Recently Used)最少使用页面置换算法,顾名思义,就是替换掉最少使用的页面. FIFO(first in first out,先进先出)页面置换算法,这是的最早出现的置换 ...
- (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)
目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...
- 页面置换算法 - FIFO、LFU、LRU
缓存算法(页面置换算法)-FIFO. LFU. LRU 在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO. LFU ...
- 页面置换算法(最佳置换算法、FIFO置换算法、LRU置换算法、LFU置换算法)
页面置换产生的原因是:分页请求式存储管理(它是实现虚拟存储管理的方法之一,其中一个特性是多次性-->多次将页面换入或换出内存) 效果最好的页面置换算法:最佳置换算法 比较常用的页面置换算法有:F ...
- 操作系统笔记(六)页面置换算法 FIFO法 LRU最近最久未使用法 CLOCK法 二次机会法
前篇在此: 操作系统笔记(五) 虚拟内存,覆盖和交换技术 操作系统 笔记(三)计算机体系结构,地址空间.连续内存分配(四)非连续内存分配:分段,分页 内容不多,就不做index了. 功能:当缺页中断发 ...
- 虚存管理页面置换算法 — FIFO和RUL算法模拟实现
本篇博文为追忆以前写过的算法系列第一篇(20081021) 温故知新 目的: 为了解决内存容量有限与多作业执行的冲突.运用了虚拟存储技术.能从逻辑上对内存进行扩充,达到扩充内存的效果.分页存储管理是实 ...
- 页面置换算法——最近最久未使用算法(c语言实现)
操作系统实验:用C语言编程实现最近最久未使用置换算法(LRU) 最近最久未使用置换算法(LRU),全称Least Recently Used,是一种页面置换算法. 对于在内存中但又不用的数据块(内存块 ...
随机推荐
- 前端自动化构建之gulp
前言 之前学完html的基础后就去学js框架了,每次都是用脚手架搭好的文件,在无形中体验了一波前端自动化带来的方便.然后前一段时间才开始学习前端自动化. 基本介绍 gulp说得简单一点就是一个自动化把 ...
- 写给程序员的机器学习入门 (五) - 递归模型 RNN,LSTM 与 GRU
递归模型的应用场景 在前面的文章中我们看到的多层线性模型能处理的输入数量是固定的,如果一个模型能接收两个输入那么你就不能给它传一个或者三个.而有时候我们需要根据数量不一定的输入来预测输出,例如文本就是 ...
- 函数:exit()
函数名: exit() 所在头文件:stdlib.h(如果是"VC6.0"的话头文件为:windows.h) 功 能: 关闭所有文件,终止正在执行的进程. exit(1)表示异常退 ...
- 【C++】常见易犯错误之数值类型取值溢出与截断(2)
本节内容紧接上节,解决红色字体遗留问题.本节所有例子运行环境: win10 + VS2015 + X64 + debug 在上节例子中,查看变量 c .d .d+1 的类型. //// Console ...
- [Python进阶]001.不定参数
不定参数 介绍 元组参数 字典参数 混合 介绍 不定参数用 * 和 ** 定义 不定参数必须在其他所有参数之后 例子:os.path.join 方法就可以写入不定数量的参数 元组参数 定义:*args ...
- [apue] 一个工业级、跨平台的 tcp 网络服务框架:gevent
作为公司的公共产品,经常有这样的需求:就是新建一个本地服务,产品线作为客户端通过 tcp 接入本地服务,来获取想要的业务能力. 与印象中动辄处理成千上万连接的 tcp 网络服务不同,这个本地服务是跑在 ...
- Java-语言基础梳理
1.java命名规范 包名:全小写 类名,接口名:首字母大写 变量名,方法名:第一个单词皆字母小写,后面单词首字母大写 常量名:所有字母都大写 2.变量 2.1 注意事项 作用域:一对{}之间有用 必 ...
- HDL-数字电路建模的要点
https://mp.weixin.qq.com/s/tEDMWf1gk0e7u4hIWKM9bQ 一. 拓扑 数字电路的拓扑抽象出来之后比较简单,就是线(Wire)和开关(Swit ...
- Rocket - decode - Term
https://mp.weixin.qq.com/s/CbBWdTlc_DESlUzd8KFcSg 介绍Term类各方法的实现. 1. prime 表示一个项是否是质项,即这 ...
- Java实现 LeetCode 817 链表组件(暴力)
817. 链表组件 给定一个链表(链表结点包含一个整型值)的头结点 head. 同时给定列表 G,该列表是上述链表中整型值的一个子集. 返回列表 G 中组件的个数,这里对组件的定义为:链表中一段最长连 ...