操作系统页面置换模拟系统

这是一个C++实现的页面置换算法模拟系统,包括FIFO、LRU和OPT三种算法。程序首先生成随机访问串,然后根据给定的页面大小和内存块数计算缺页率。用户可以选择不同的算法查看缺页率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <map>
#include <set>
#include <list>
#include <deque>
#include <stack>
#include <string>
#include <cstdio>
#include <math.h>
#include <iomanip>
#include <cstdlib>
#include <limits.h>
#include <string.h>
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

int address[322];//指令地址
int num[322];//访问串
int cnt;//合并后的访问串个数
//随机生成指令地址
void GenerateAddress(int page)
{
	srand(unsigned(0));
	int cur,tmp[322];
	for(int i=0;i<320;i++)
	{
		if(i%3==0)
		{
			cur = rand() % 320;
			cur = (cur+1) % 320;
			address[i] = cur;//顺序执行一条指令,即执行地址为m+1的指令
		} else
		if(i%3==1)
		{
			cur = rand() % (cur+2);//在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m'
			cur = (cur+1) % 320;
			address[i] = cur;//顺序执行一条指令,其地址为m'+1
		} else 
		if(i%3==2)
		{
			cur = rand() % 320 + (cur + 2);
			cur = cur%320;
			address[i] = cur;
		}
		tmp[i] = address[i] / page;
	}
	num[cnt++] = tmp[0];
	for(cnt = 0,i=1;i<320;i++)//相邻相同的合并
	{
		if(tmp[i]==tmp[i-1])continue;
		num[cnt++] = tmp[i];
	}	
}
struct node{
	int id;
	int rec;
};
node block[322];
//FIFO算法:在所给的内存块中查找最早进入的页面号
double FIFO(int memory){
	int sum = 0;
	int k = 0;
	for(int i=0;i<cnt;i++) {
		bool find = false;
		int minm = (1<<30);
		int tag;
		for(int j=0;j<k;j++){
			if(block[j].id == num[i]){
				find = true;
				break;
			}
			if(block[j].rec < minm){
				minm = block[j].rec;
				tag = j;
			}
		}
		if(!find){
			if(k<memory){
				block[k].id = num[i];
				block[k++].rec = i;//每当更新就记录当前i下标值,查找的时候找出最小值就是最早的页面号
			} else {
				block[tag].id = num[i];
				block[tag].rec = i;
			}
			sum++;//统计缺页数
		} 
	}
	return (sum*1.0)/(cnt*1.0);
}
//LRU算法:在所给的内存中查找最久没有使用过的页面号
double LRU(int memory){
	int sum = 0;
	int k = 0;
	for(int i=0;i<cnt;i++){
		bool find = false;
		int maxm = -1;
		int tag;
		for(int j=0;j<k;j++){
			if(block[j].id==num[i]){
				find = true;
				block[j].rec = 0;
				break;
			}
			if(block[j].rec>maxm){
				maxm = block[j].rec;
				tag = j;
			}
		}
		if(!find){
			if(k<memory){
				block[k].id = num[i];
				block[k++].rec = 0;
			} else {
				block[tag].id = num[i];
				block[tag].rec = 0;
			}
			sum++;//统计缺页数
		} 
		for(j=0;j<k;j++){
			block[j].rec++;
		}
	}
	return (sum*1.0)/(cnt*1.0);
}
//OPT算法:在未来一段时间中查找最久不使用的页面号
double OPT(int memory){
	int next[322];
	int i,j,k = 0;
	for(i=0;i<cnt;i++){//预处理,处理每个访问串的未来不使用的时长
		for(j=0;j<cnt;j++){
			if(num[i]==num[j])break;
		}
		if(j==cnt){
			next[i] = (1<<30);//置为无穷大表示以后不再使用
		} else next[i] = j-i;
	}
	int sum = 0;
	for(i=0;i<cnt;i++){
		bool find = false;
		int maxm = -1;
		int tag;
		for(j=0;j<k;j++){
			if(block[j].id==num[i]){
				find = true;
				break;
			}
			if(block[j].rec>maxm){
				maxm = block[j].rec;
				tag = j;
			}
		}
		if(!find){
			if(k<memory){
				block[k].id = num[i];
				block[k++].rec = next[i];
			} else {
				block[tag].id = num[i];
				block[tag].rec = next[i];
			}
			sum++;//统计缺页数
		}
	}
	return (sum*1.0)/(cnt*1.0);
}
int main()
{
	cout<<"************************欢迎来到操作系统页面置换模拟系统************************"<<endl;
	while(1){
		int page, memory;
		cout<<"请输入页面大小(以数字表示,退出请按0):1K,2K,4K,8K,16K"<<endl;
		cin>>page;
		if(page==0)break;
		cout<<"请输入分配给程序的内存块数:"<<endl;
		cin>>memory;
		int res = 10*page;
		page = 320/(10*page);//页数
		if(page <= memory){
			cout<<"缺页率:";
			cout<<"0.00%"<<endl;
		} else {
			GenerateAddress(res);
			cout<<"320个随机访问串:";
			for(int i=0;i<cnt;i++){//输出320个随机访问串
				cout<<"["<<num[i]<<"]"<<" ";
			}cout<<endl<<endl;
			cout<<"请选择算法(数字表示,以0 结束):1、FIFO;2、LRU;3、OPT"<<endl;
			int choice;
			while(cin>>choice && choice){
				switch (choice){
				case 1:printf("FIFO算法的缺页率:%.2lf%%\n\n",FIFO(memory)*100.0);
					   break;
				case 2:printf("LRU算法的缺页率:%.2lf%%\n\n",LRU(memory)*100.0);
					   break;
				case 3:printf("OPT算法的缺页率:%.2lf%%\n\n",OPT(memory)*100.0);
					   break;
				case 0:break;
				}
			}
		}
	}
	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、付费专栏及课程。

余额充值