操作系统的页面置换C++算法:OPT FIFO LRU CLOCK 计算缺页率

暴力直接上代码,主要是用了vector来实现,有些方法比较费时,不太好,请各位大神斧正。这是个人的作业,  这是代码下载页http://download.csdn.net/detail/l631068264/7644569   里面还有多级反馈队列进程调度的MFC版

#include <iostream>
#include <algorithm>
#include <vector>
#include <stdio.h>
#include <stdlib.h> /*用到了srand函数*/
#include <time.h> /*用到了time函数*/
using namespace std;

const int AddressSize = 320;//地址数组大小
const int AddressRange = 319;//地址值范围
struct TimeNode{
	int data;//页面序列号
	int read;//引用位
};
class PageReplace{
public:
	void Create();//创建地址序列
	void AddChangePage(int size);//转换为页面序列
	void Print();//打印控制
	PageReplace();
	~PageReplace();
private:
	int PageSize;//页面大小
	int PageNum;//页面数
	int* Address;//地址数组
	vector< int > PageOrder;//页面序列
	double OPT(int j);//j 是物理块数
	double FIFO(int j);
	double LRU(int j);
	double CLOCK(int j);
};
PageReplace::PageReplace()
{
	Address = new int[AddressSize];
}
PageReplace::~PageReplace()
{
	delete[]Address;
}
void PageReplace::Create()
{
	srand((unsigned)time(NULL));
	int i;
	int Range = AddressRange;
	for (i=0;i<AddressSize;i=i+5)
	{
		Address[i]  = rand()%AddressRange;
		Address[i+1] = Address[i]+1;
		Address[i+2] = rand()%Address[i+1];
		Address[i+3] = Address[i+2]+1;
		//rand%(b-a+1) + a =>[a,b]随机数
		Address[i+4] = Address[i+3]+1+(rand()%AddressRange-Address[i+3]);
	}
	for (int j=0;j<AddressSize;j++)
	{
		printf("%3d ",Address[j]);
		if ((j+1)%18==0)
		{
			cout<<endl;
		}
	}
	cout<<endl;
}
void PageReplace::AddChangePage(int size)
{
	//页面大小	K
	PageSize = size;
	int i,j;
	int AddNum_PerPage = 10*PageSize;//每K 10条指令排列虚地址  每页指令数
	PageNum = AddressSize/AddNum_PerPage;//页面数
	for (i=0;i<AddressSize-1;i++)
	{//计算页号
		int m = Address[i]/AddNum_PerPage;
		int n = Address[i+1]/AddNum_PerPage;
		if (m != n)
		{//序列相邻相同的不要
			PageOrder.push_back(m);
		}
	}
	for (j=0;j<PageOrder.size();j++)
	{
		printf("%2d ",PageOrder[j]);
		if ((j+1)%20==0)
		{
			cout<<endl;
		}
	}
	cout<<endl;
}
double PageReplace::OPT(int j)
{
	vector<int> opt;//代替内存块
	int i,d2,k;
	double l=0;
	for (i=0;i<PageOrder.size();i++)
	{//缺页判断
		vector<int >::iterator flag = find(opt.begin(),opt.end(),PageOrder[i]);
		if (flag == opt.end())
		{
			l++;//缺页数
			if (opt.size()<j)
			{
				opt.push_back(PageOrder[i]);
			}
			else
			{//找出当前序列位置 最迟访问
				vector<int>::iterator m = find(PageOrder.begin()+i,PageOrder.end(),PageOrder[i]);
                int max = 0;
				for ( k=0;k<opt.size();k++)
				{
					vector<int>::iterator n = find(PageOrder.begin()+i,PageOrder.end(),opt[k]);
					if (max < n-m)
					{
						max = n-m;
						d2 = k;//块下标
					}
				}
				opt[d2] = PageOrder[i];
			}
		}
	}
	return (double)l/PageOrder.size();//缺页率
}

double PageReplace::FIFO(int j)
{
	int i;
	double l=0;
	vector<int> fifo;

	for (i=0;i<PageOrder.size();i++)
	{
		vector<int >::iterator flag = find(fifo.begin(),fifo.end(),PageOrder[i]);
		if (flag==fifo.end())
		{
			l++;
			if (fifo.size()<j)
			{
				//头插入
				fifo.push_back(PageOrder[i]);
			}
			else{
				fifo.erase(fifo.begin());
				fifo.push_back(PageOrder[i]);
			}
		}
	}
	return (double)l/PageOrder.size();
}
double PageReplace::LRU(int j)
{
	vector<int> lru;
	int i;
	double l=0;
	for (i=0;i<PageOrder.size();i++)
	{
		vector<int >::iterator flag = find(lru.begin(),lru.end(),PageOrder[i]);
		if (flag == lru.end())
		{//缺页
			l++;
			if (lru.size()<j)
			{	//头插入
				lru.push_back(PageOrder[i]);
			}
			else{
				lru.erase(lru.begin());
				lru.push_back(PageOrder[i]);
			}
		}
		else
		{//不缺页
			for (int m =0 ;m<lru.size();m++)
			{
				if (lru[m] == PageOrder[i])
				{
					lru.erase(lru.begin()+m);
					lru.push_back(PageOrder[i]);
					break;
				}
			}
		}
	}
	return (double)l/PageOrder.size();
}
double PageReplace::CLOCK(int j)
{
	int i,m,flag;
	double l=0;
	TimeNode p;
	vector<TimeNode> time;
	for (i=0;i<PageOrder.size();i++)
	{
		for (m=0;m<time.size();m++)
		{
			if(time[m].data ==PageOrder[i])
			{
				 flag = m;
				break;
			}
		}
		//vector<TimeNode>::iterator flag = find(time.begin(),time.end(),PageOrder[i]);
		if (flag<0)
		{
			l++;
			if (time.size()<j)
			{
				p.data = PageOrder[i];
				p.read = 0;
				time.push_back(p);
			}
			else
			{
				for (m=0;m<time.size();m++)
					if (time[m].read == 0)
					{
						time.erase(time.begin()+m);
						p.data = PageOrder[i];
						p.read = 0;
						time.push_back(p);
						break;
					}
			}
		}
		else
		{
			time[flag].read = 1;
		}
		//相当于定时器 每调用5个页面所有引用位清0
		if ((i+1)%5 == 0)
		{
			for (m=0;m<time.size();m++)
				time[m].read = 0;
		}
	}
	return (double)l/PageOrder.size();
}
void PageReplace::Print()
{
	int i;
	printf("页面大小 %d K\n",PageSize);
	printf("输入分配内存块数( 1 ~ %d )\n",PageNum);
	scanf("%d",&i);
	printf("OPT 算法 缺页中断率: %.2f%%\n",OPT(i)*100);
	printf("FIFO 算法 缺页中断率: %.2f%%\n",FIFO(i)*100);
	printf("LRU 算法 缺页中断率: %.2f%%\n",LRU(i)*100);
	printf("CLOCK 算法 缺页中断率: %.2f%%\n",CLOCK(i)*100);
	cout<<endl;
}

int main()
{
	PageReplace p;
	bool flag=true;
	while(flag)
	{
		cout<<"1. 页面置换实验  0. 退出"<<endl;
		int choice,size;
		cin>>choice;
		switch (choice)
		{
		case 1:
			cout<<"生成新序列"<<endl;
			p.Create();
			cout<<"输入页面大小(1/2/4/8/16)单位 K    按0 退出页面大小选择"<<endl;
			cin>>size;
			while (size)
			{
				p.AddChangePage(size);
				p.Print();

				cout<<"输入页面大小(1/2/4/8/16)单位 K    按0 退出页面大小选择"<<endl;
				cin>>size;
			}
			break;
		case 0:
			flag = false;
			break;
		}
	}
	return 0;
}

操作系统的页面置换C++算法:OPT FIFO LRU CLOCK 计算缺页率,布布扣,bubuko.com

时间: 2024-10-26 22:01:52

操作系统的页面置换C++算法:OPT FIFO LRU CLOCK 计算缺页率的相关文章

C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)

目录 00 简介 01 算法概述 02 公用方法 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存的忙闲状态,为进程分配和释放内存.当主存的空间太小而无法装入所有的进程时,就需要在内存和硬盘之间进行调度操作. 多数操作系统只采用某种特定的页面置换算法进行置换,无法预先探测当前运行进程的页面访问模式,因此不能根据不同的页面访问模式,选用不同的页面置换算法.当然,如果能对不同的访问模式选取相应的页面置换算法,

虚存管理页面置换算法 — FIFO和RUL算法模拟实现

本篇博文为追忆曾经写过的算法系列第一篇(20081021) 温故知新 目的: 为了解决内存容量有限与多作业运行的冲突,运用了虚拟存储技术,能从逻辑上对内存进行扩充,达到扩充内存的效果.分页存储管理是实现虚拟存储的一种方案.通过模拟算法的实验,加深理解,虚拟存储器的基本原理和方法. 要求: 1.请求分页的置换算法(FIFO && RUL算法实现):2.按给定的顺序列,输出页面调度过程包括命中 / 缺页,调入/调出:3.计算缺页率,频率. 说明: vp_list[N] //访问序列 bs[M]

存储管理的页面置换算法

存储管理的页面置换算法在考试中常常会考到,操作系统教材中主要介绍了3种常用的页面置换算法,分别是:先进先出法(FIFO).最佳置换法(OPT)和最近最少使用置换法(LRU).大家要理解3种置换算法的含义,然后能熟练地运用在具体的练习中就可以了. 为什么要进行页面置换 在请求分页存储管理系统中,由于使用了虚拟存储管理技术,使得所有的进程页面不是一次性地全部调入内存,而是部分页面装入. 这就有可能出现下面的情况:要访问的页面不在内存,这时系统产生缺页中断.操作系统在处理缺页中断时,要把所需页面从外存

操作系统中10种页面置换算法的总结

页面置换算法总结 当发生缺页中断时,操作系统必须将内存中选择一个页面置换出去为要调入的新页面腾出空间. 那究竟选择哪一个淘汰哪一个一面比较好呢? 1.      最优页面置换算法 选择最长时间内不会被访问的页面丢掉.越久越好.但是理论上不能实现. 2.      最近未使用页面置换算法(NRU)算法 找到最久没有使用的页面置换出去,页面被访问时设置R位,修改时设置M位,R位定期清0: 把页面分四类 0类.未被访问,未被修改的R=M=0 1类未被访问,被修改R=0,M=1 2类被访问,未被修改R=

操作系统页面置换算法(opt,lru,fifo,clock)实现

#include <iostream> #include<map> #include<set> #include <algorithm> #include<cstdio> #include<cstring> #include<cmath> #define N 200 using namespace std; int page[N];//页面引用号 int block[N];//物理块,内存 int dist[N][N];/

操作系统之页面置换算法(最佳置换OPT,先进先出FIFO,最近最久未使用LRU)

最近学习操作系统时,实验要求实现常见的三种页面置换算法,博主按照书上要求试着编写,实现了案例,并记录在博客随记中,以便后续自己复习并也给需要的同学分享参考一下!水平有限,若有错,请悄悄告诉博主!博主好立即改正. 最佳置换算法(optimal replacement,OPT)是从内存中选择今后不再访问的页面或者在最长一段时间后才需要访问的页面进行淘汰.如下例子: 1 #include <iostream> 2 #include <stdio.h> 3 #include <std

操作系统 页面置换算法LRU和FIFO

LRU(Least Recently Used)最少使用页面置换算法,顾名思义,就是替换掉最少使用的页面. FIFO(first in first out,先进先出)页面置换算法,这是的最早出现的置换算法.该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最长的页面给予淘汰. FIFO置换算法有这样一个奇怪现象:内存空间块数越多,缺页中断率可能相反的越高(缺页中断次数越高). LFU(Least Frequently Used)最近最少使用算法,它是基于“如果一个数据在最近一段时间内使用次

页面置换算法(最佳置换算法、FIFO置换算法、LRU置换算法、LFU置换算法)

页面置换产生的原因是:分页请求式存储管理(它是实现虚拟存储管理的方法之一,其中一个特性是多次性-->多次将页面换入或换出内存) 效果最好的页面置换算法:最佳置换算法 比较常用的页面置换算法有:FIFO置换算法.LRU置换算法.LFU置换算法 最佳置换算法:不可能实现-->是衡量其他置换算法的方法. FIFO置换算法:先进先出置换算法,淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰.(实现简单) LRU置换算法:最近最久未使用置换算法,该算法赋予每个页面一个访问字段,用来记录一

先进先出算法(FIFO)——页面置换

原创 最近操作系统实习,写了先进先出算法(FIFO)的代码来实现页面置换. 题目阐述如下: 设计四:页面置换 设计目的: 加深对请求页式存储管理实现原理的理解,掌握页面置换算法. 设计内容: 设计一个程序,有一个虚拟存储区和内存工作区,实现下述三种算法中的任意两种,计算访问命中率 (命中率=1-页面失效次数/页地址流长度).附加要求:能够显示页面置换过程.算法包括:先进先出的 算法(FIFO).最少使用算法(LFU).最近未使用算法(NUR)该系统页地址流长度为320,页面失效 次数为每次访问相