我的大学之操作系统(五)

实验五

【实验题目】:虚拟内存页面置换算法

【实验目的】
通过这次实验,加深对虚拟内存页面置换概念的理解,进一步掌握先进先出FIFO,最佳置换OPI和最近最久未使用LRU页面置换算法的实现方法。

【实验内容及要求】
算法思路:
FIFO:FIFO 策略把分配给进程的页框视为一个循环缓冲区,按循环方式移动页。它所需的只是一个指针,这个指针在该进程的页框中循环。因此这是一种最简单的页面置换策略。除了它的简单性,这种选择方法所隐含的逻辑是置换驻留在内存中最长时间的页:一个很久以前取入内存的页,到现在可能已经不会再用了。这个推断是错误的,因为经常出现一部分程序或数据在整个程序的生命周期中使用频率很高的情况,如果使用 FIFO 算法,则这些页会被反复的换入换出,增加了系统开销。
OPI:OPI策略选择置换下次访问距当前时间最长的那些页,可以看出该算法能导致最少的缺页中断,但是由于它要求操作系统必须知道将来的事件,显然这是不可能实现的。但它仍然能作为一种标准来衡量其他算法的性能。
LRU:LRU 策略置换内存中上次使用距当前最远的页。根据局部性原理,这也是最不可能访问的页。实际上,LRU 策略的性能接近于 OPT 策略。该方法的问题在于比较难以实现。一种实现方法是给每一页添加一个最后访问的时间戳,并且必须每次访问内存时,都更新这个时间戳。即使有这种方案的硬件,开销仍然是非常大的。另外一种可选的方法是维护一个关于访问页的栈,但开销同样很大。
问题描述:
设计程序模拟先进先出FIFO,最佳置换OPI和最近最久未使用LRU页面置换算法的工作过程。假设内存中分配给每个进程的最小物理块数为m,在进程运行过程中要访问的页面个数为n,页面访问序列为P1, … ,Pn,分别利用不同的页面置换算法调度进程的页面访问序列,给出页面访问序列的置换过程,计算每种算法缺页次数和缺页率。
程序要求如下:
1)利用先进先出FIFO,最佳置换OPI和最近最久未使用LRU三种页面置换算法模拟页面访问过程。
2)模拟三种算法的页面置换过程,给出每个页面访问时的内存分配情况。
3)输入:最小物理块数m,页面个数n,页面访问序列P1, … ,Pn,算法选择1-FIFO,2-OPI,3-LRU。
4)输出:每种算法的缺页次数和缺页率。
【流程图】
在这里插入图片描述

【实验结果】
核心代码:
FIFO:
在这里插入图片描述

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

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

可读文本文件:
在这里插入图片描述

实验结果截图:
在这里插入图片描述

【源代码】

#include <iostream>
#include <fstream>
#include <iomanip>
#include <stdlib.h>
using namespace std;
 
#define MaxNumber 100
int MinBlockNum,PageNum,LackNum,LackPageNum;  //物理块数,页面个数,缺页次数,缺页数
double  LackPageRate;   //缺页率
int PageOrder[MaxNumber];  //页面序列
int PageDisCount[MaxNumber]; //当前内存距离下一次出现的距离
int LRUtime[MaxNumber];   //存储队列中各个页面最近使用情况
int VirtualQueue[MaxNumber];   //虚拟队列
int Simulate[MaxNumber][MaxNumber];
int choose;
void Enter();  //输入物理块数、页面号顺序
void initial();  //模拟物理块顺序被填满,初始化物理块
void FIFO();    //先进先出FIFO
void OPI();     //最佳置换OPI
void LRU();    //最近最久未使用LRU
void display(); //显示执行结果
void choose_Algorithm();//选择算法
 
int main(){
   
    Enter();
 
   choose_Algorithm();
    return 0;
}
 
void Enter(){
   
	int i;
	ifstream readData;
	readData.open("datainput.txt");
	readData>>MinBlockNum;
	readData>>PageNum;
	for (i=0;i<PageNum;i++)
	{
   
		readData>>PageOrder[i];
	}
 
	cout<<"读取数据结果如下:"<<endl;
	cout<<"最小物理块数 = "<<MinBlockNum<<endl;
	cout<<"页面个数 = "<<PageNum<<endl;
	cout<<"页面序列如下:"<<endl;
	for (i = 0;i<PageNum;</
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值