页面置换算法

#include<iostream>
#include<vector>
#include<list>
#include<deque>
#include<set>
#include<map>
#include<algorithm>
#include<ctime>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::list;
using std::deque;
using std::set;
using std::map;
using std::pair;
class Page
{
public:
	bool visited;//访问位,false表示没有被访问过,true表示被访问过
	bool changed;//修改位,false表示没有被修改过,true表示被修改过
	bool valid;//表示该页面是否在内存,true表示在,false表示不在
	Page()
	{
		visited = changed = valid = false;
	}
};

#include"stdfax.h"
vector<int>order;
void create_order()
{
	srand((unsigned)time(NULL));
	while (order.size() <= 320)
	{
		auto m = rand() % 320;
		//A:在[0,319]的指令地址之间随机选取一起点m;B:顺序执行一条指令,即执行地址为m+1的指令
		order.push_back((m + 1)%320);
		auto n = rand() % (m + 2);
		//C:在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’
		order.push_back(n);
		//D:顺序执行一条指令,其地址为m’ + 1
		order.push_back((n + 1) % 320);
		//E:在后地址[m’+2,319]中随机选取一条指令并执行
		order.push_back(n + 2 + rand()%(318-n));
	}
	order.resize(320);
}
void RAN();
void FIFO();
void LRU();
void OPT();
int page;//用户进程所能分配最多页面数
int main()
{
	printf("Page\tRAN\tFIFO\tLRU\tOPT\n");
	create_order();
	for (page = 4;page<=32;page++)
	{
		printf("%2d\t", page);	
		RAN();
		FIFO();
		LRU();
		OPT();
	}
	getchar();
	return 0;
}

#include"stdfax.h"
extern void RAN();
extern vector<int>order;
extern int page;
void RAN()
{
	vector<Page>page_table(32);//页表
	vector<int>memory;//在内存中的页数
	int count = 0;//指令所在页面在内存中的次数
	for (int i = 0; i < 320; i++)//每次调入一条指令
	{
		//查看当前指令所在的页面是否在内存中
		if (page_table[order[i]/10].valid)//如果指令所在页面在内存中
		{
			count++;
		}
		else
		{
			if (memory.size() < page)//如果用户进程页面还有剩余
			{
				count++;
				memory.push_back(order[i] / 10);//把页面信息塞入内存
				page_table[order[i] / 10].valid = true;//记录页面为已访问
			}
			else
			{
				//随机选择在内存中的一个页面
				srand((unsigned)time(NULL));
				auto tmp = rand() % page;//选择内存中被替换的页面
				page_table[memory[tmp]].valid = false;//该页面标记为不在内存中
				page_table[order[i] /  10].valid = true;//新加入的页面标记为已访问
				memory[tmp] = order[i] / 10;//内存中的页面进行更新
			}
		}
	}
	printf("%.4lf\t",(double)count/320.0);
}

#include"stdfax.h"
extern void FIFO();
extern vector<int>order;
extern int page;
void FIFO()
{
	vector<Page>page_table(32);//页表
	deque<int>memory;//在内存中的页数
	int count = 0;//指令所在页面在内存中的次数
	for (int i = 0; i < 320; i++)//每次调入一条指令
	{
		//查看当前指令所在的页面是否在内存中
		if (page_table[order[i] / 10].valid)//如果指令所在页面在内存中
		{
			count++;
		}
		else
		{
			if (memory.size() < page)//如果用户进程页面还有剩余
			{
				count++;
				memory.push_back(order[i] / 10);//把页面信息塞入内存
				page_table[order[i] / 10].valid = true;//记录页面为已访问
			}
			else
			{
				//把最早的页面在页表中标记为已不在内存
				page_table[memory.front()].valid = false;
				//从内存中删除这一页
				memory.pop_front();
				//把当前页面设置为已在内存中
				page_table[order[i] / 10].valid = true;
				//在内存中加入这一页
				memory.push_back(order[i] / 10);
			}
		}
	}
	printf("%.4lf\t", (double)count / 320.0);
}

#include"stdfax.h"
extern void LRU();
extern vector<int>order;
extern int page;
void LRU()
{
	vector<Page>page_table(32);//页表
	map<int, int>memory;//key=页码,value=该页被用的次数
	int count = 0;//指令所在页面在内存中的次数
	for (int i = 0; i < 320; i++)//每次调入一条指令
	{
		//查看当前指令所在的页面是否在内存中
		if (page_table[order[i] / 10].valid)//如果指令所在页面在内存中
		{
			count++;
		}
		else
		{
			if (memory.size() < page)//如果用户进程页面还有剩余
			{
				count++;
				memory[order[i] / 10]++;//把页面信息塞入内存
				page_table[order[i] / 10].valid = true;//记录页面为已访问
			}
			else
			{
				auto tmp = memory.begin()->first;
				//把最早的页面在页表中标记为已不在内存
				page_table[tmp].valid = false;
				//从内存中删除这一页
				memory.erase(memory.begin());
				//把当前页面设置为已在内存中
				page_table[order[i] / 10].valid = true;
				//在内存中加入这一页
				memory[order[i] / 10]++;
			}
		}
	}
	printf("%.4lf\t", (double)count / 320.0);
}

#include"stdfax.h"
extern void OPT();
extern vector<int>order;//指令集
extern int page;
void OPT()
{
	vector<Page>page_table(32);//页表
	vector<int>memory;//在内存中的指令
	vector<list<int>>table(32);
	for (int i = 0; i < 320; i++)
	{
		table[order[i] / 10].push_back(i);
	}
	int count = 0;//指令所在页面的命中次数
	for (int i = 0; i < 320; i++)
	{
		if (page_table[order[i] / 10].valid)//如果指令所在页面在内存中
		{
			count++;
		}
		else
		{
			if (memory.size() < page)//如果用户进程页面还有剩余
			{
				count++;
				memory.push_back(order[i]);//把页面信息塞入内存
				page_table[order[i] / 10].valid = true;//记录页面为已访问
				table[order[i] / 10].pop_front();
			}
			else
			{
				int exPage = 0;//内存中需要被替换的页面
				int far_order;//最远的下一条指令
				if (table[memory[0] / 10].size())
				{
					far_order = table[memory[0] / 10].front();
				}
				else
				{
					far_order = 320;
				}
				for (int j = 1; j < page; j++)
				{
					if (table[memory[j] / 10].empty())
					{
						exPage = j;
						break;
					}
					if (far_order < table[memory[j] / 10].front())
					{
						far_order = table[memory[j] / 10].front();
						exPage = j;
					}
				}
				//内存的指令替换为当前指令
				memory[exPage] = order[i];
				page_table[order[i] / 10].valid = true;//记录页面为已访问
				table[order[i] / 10].pop_front();
			}
		}
	}
	printf("%.4lf\n", (double)count / 320.0);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值