操作系统之页面置换模拟程序设计_LFU

介绍

  1. 假设分给一作业的内存块数为4,每个页面中可存放10条指令。

  2. 用C语言设计一个程序,模拟一作业的执行过程。设该作业共有320条指令,即它的地址空间为32页,目前它的所有页面都还未调入内存。在模拟过程中,如果所访问的指令已经在内存,则显示其物理地址,并转下一条指令。如果所访问的指令尚未装入内存,则发生缺页,此时需记录缺页的次数,并将相应页调入内存。如果4个内存块中均已装入该作业的虚页面,则需进行页面置换。最后显示其物理地址,并转下一条指令。在所有320条指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。

  3. 置换算法:请考虑 LFU 算法。

  4. 作业中指令的访问次序要求按下述原则生成:

    • 50%的指令是顺序执行的。
    • 25%的指令是均匀分布在前地址(即低地址)部分。
    • 25%的指令是均匀分布在后地址(即高地址)部分。

    具体的实施办法是:
    ① 在[0,319]之间随机选取一条起始执行指令,其序号为m;
    ② 顺序执行下一条指令,即序号为m+1的指令;
    ③ 通过随机数,跳转到前地址部分[0,m-1]中的某条指令处,其序号为m1;
    ④ 顺序执行下一条指令,即序号为m1+1的指令;
    ⑤ 通过随机数,跳转到后地址部分[m1+2,319]中的某条指令处,其序号为m2;
    ⑥ 顺序执行下一条指令,即序号为m2+1的指令;
    ⑦ 重复“跳转到前地址部分、顺序执行、跳转到后地址部分、顺序执行”的过程,直至执行完全部320条指令。

  5. 指令序列转换成页访问序列。
    第 0 条-第 9 条指令为第0页(对应虚存地址为[0,9])
    第10条-第19条指令为第1页(对应虚存地址为[10,19])
    ………………………………
    第310条-第319条指令为第31页(对应虚存地址为[310,319])

最近最少使用 ( LFU )

基于“如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小”的思路。LFU是基于访问次数的。

代码

//页面置换_LFU
#include<bits/stdc++.h>
using namespace std; 
int s[320];
int cnt = 0;
int lost = 0;
typedef struct node {
	int order; //页面序号 
	int sum;	//页面访问次数 
}cache_;//页面元素 
list<cache_> cache ;

//初始化 
void init()
{ 
	cnt = 0;	//访问次数为 0 
	lost = 0;	//缺页次数为 0  
	for(int i=0;i<320;i++)
		s[i] = 220+i;	//设置指令的物理地址 
}
//寻找当前指令是否在内存块中
bool find (int x)
{
	bool judge = false;
	for(list<cache_>::iterator iter = cache.begin() ; iter != cache.end() ; iter++)
    {
        if((*iter).order == x ){
        	judge = true; 
			(*iter).sum ++;  
		} 
    } 
    return judge;
} 
//当内存空间已满的时候,进行页面置换 
void delete_cache(){
	//找到最少使用的页面
	int minn = 10000; 
	list<cache_>::iterator it ;
	for(list<cache_>::iterator iter = cache.begin() ; iter != cache.end() ; iter++)
    {
        if((*iter).sum < minn ){
        	it = iter; 
        	minn = (*iter).sum;
		} 
    } 
     //将该页面从内存块中删除 
    cache.erase( it);
}
//执行每一条指令 
int process(int x)
{
	cout<<"第"<< cnt<<" 条指令  " ;  
	cnt++; 
	cache_ y;
	y.order = x/10;
	y.sum = 0;
	//判断当前指令是否在内存块中 
	bool judge = find(x/10);
	//如果当前指令在内存块中,显示其物理地址 
	if(judge == true) {
		cout <<"  物理地址:"<<s[x]<<endl;
	}
	//如果当前指令不在内存块中 
	else{ 
		lost ++;
		//如果内存块还有空余,直接将该指令所在页面调入内存块 
		if(cache.size() < 4 ){
			cache.push_back(y);
		}
		//如果内存块没有空余,进行页面置换 
		else {
			delete_cache();
			cache.push_back(y);
		} 
		cout <<"  物理地址:"<<s[x]<<endl;
	}
	return 1;
}
int main()
{
	init();
	int m=rand()%320;//在[0,319]之间随机选取一条起始执行指令,其序号为m 
	process(m);//执行指令,即序号为 m的指令
	process(m+1);//顺序执行下一条指令,即序号为m+1的指令 
	//	重复"跳转到前地址部分、顺序执行、跳转到后地址部分、顺序执行"的过程,159次 
	for(int i=0;i<316;i+=4)
	{ 
		int m1=rand()%m;//通过随机数,跳转到前地址部分[0,m-1]中的某条指令处,其序号为m1
		process(m1);//执行指令,即序号为m1的指令
		process(m1+1);//顺序执行下一条指令,即序号为m1+1的指令
		int m2=rand()%(320-(m1+2)) + m1 + 2;//通过随机数,跳转到后地址部分[m1+2,319]中的某条指令处,其序号为m2
		process(m2);//执行指令,即序号为m1的指令
		process(m2+1);//顺序执行下一条指令,即序号为m2+1的指令
	}
	int m1=rand()%m;//通过随机数,跳转到前地址部分[0,m-1]中的某条指令处,其序号为m1
	process(m1);//执行指令,即序号为m1的指令
	process(m1+1);//顺序执行下一条指令,即序号为m1+1的指令
	cout<<endl<<"缺页率为"<<lost/320.0  <<endl; 
	return 0;
} 

测试结果

在这里插入图片描述

一、实验名称 模拟操作系统页面置换 二、实验目的 1、掌握操作系统页面置换过程,加深理解页式虚拟存储器的实现原理。 2、掌握用随机数生成满足一定件的指令地址流的方法。 3、掌握页面置换模拟方法。 三、实验要求与提示 1、 采用一种熟悉的语言,如C、PASCAL或C++等,编制程序。 2、 模拟操作系统采用OPT、FIFO和LRU算法进行页面置换的过程。 3、 设程序地址范围为0到32767,采用随机数生成256个指令地址,满足50%的地址是顺序执行,25%向前跳,25%向后跳。为满足上述件,可采取下列方法:设d0=10000,第n个指令地址为dn,第n+1个指令地址为dn+1,n的取值范围为0到255。每次生成一个1到1024范围内的随机数a,如果a落在1到512范围内,则dn+1=dn+1。如果a落在513到768范围内,则设置dn+1为1到dn范围内一个随机数。如果a落在769到1024范围内,则设置dn+1为dn到32767范围内一个随机数。 4、 页面大小的取值范围为1K,2K,4K,8K,16K。按照页面大小将指令地址转化为页号。对于相邻相同的页号,合并为一个。 5、 分配给程序内存数取值范围为1,2,直到程序页面数。 6、 分别采用OPT、FIFO和LRU算法对页号序列进行调度,计算出对应的缺页断率。 7、 打印出页面大小、分配给程序内存数、算法名、对应的缺页断率。 8、 分析页面大小和分配给程序内存数对缺页断率的影响。分析不同的页面置换算法的调度性能。 9、 在上机实现该程序之后,要求写出实验报告,其包括实验名称、实验目的、实验内容、程序的主要流程图、实验心得和主要源程序清单等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值