内存页替换算法C++

自己写了两个内存页替换算法,一个FIFO,一个LRU,贴在博客上,记录一下。

MemPage.h
#include<vector>
using namespace std;
class MemPageList {
private:
	int* name;		//内存也编号
	vector<int> que;//进入先后内存页队列
	int maxSize;	//最大储存大小
public:
	MemPageList(int n) { 
		name = new int[n];
		maxSize = n;
	}
	void printName() { for (int i = 0; i <maxSize; i++)cout << name[i] << " "; }
	int FIFO(int pages[],int n);
	int LRU(int pages[],int n);
};
int MemPageList::FIFO(int pages[],int n) {
	int count = 0;		//用于记录错误次数
	for (int i = 0; i < n; i++) {
		bool k = 0;		//用于判断该页是否存在于页表中
		for (int j = 0; j < que.size(); j++) {
			if (pages[i] == name[j])
				k = 1;
		}
	/*内存页存在页表中,则加载下一页*/
		if (k)continue;	
	/*内存页不在页表中*/
		/*页表未满*/
		if (que.size() < maxSize) {
			name[que.size()] = pages[i];	//载入页
			que.push_back(pages[i]);
			count++;
		}
		/*页表已满*/
		else {
			/*将页表中的页替换成新的页*/
			for (int j = 0; j < que.size(); j++) {
				if (que[0] == name[j]) {
					name[j] = pages[i];
					break;
				}
			}
			que.erase(que.begin());		//删除队列中被替换的页
			que.push_back(pages[i]);	//将新的页号加入队列
			count++;
		}
	}
	return count;
}
int MemPageList::LRU(int pages[], int n) {
	int count = 0;
	for (int i = 0; i < n; i++) {
		bool k = 0;		//用于判断该页是否存在于页表中
		for (int j = 0; j < que.size(); j++) {
			/*该页已存在列表中*/
			if (pages[i] == que[j]) {
				que.erase(que.begin() + j);		//更新列表中页的使用序列
				que.push_back(pages[i]);
				k = 1;
			}
		}
	/*内存页存在页表中,载入下一页*/
		if (k)continue;
	/*内存页不在页表中*/
		/*页表未满*/
		if (que.size() < maxSize) {
			name[que.size()] = pages[i];	//载入页
			que.push_back(pages[i]);
			count++;
		}
		/*页表已满*/
		else {
			for (int j = 0; j < que.size(); j++) {
				if (que[0] == name[j]) {
					name[j] = pages[i];
					break;
				}
			}
			que.erase(que.begin());
			que.push_back(pages[i]);
			count++;
		}
	}
	return count;
}
Main.cpp
#include<iostream>
#include"MemPage.h"
#include<random>
#include<ctime>
#include<vector>
using namespace std;
/*随机生成内存页序列*/
int* random(int n,int num) {	//n为生成的最大内存页号,num为内存页数
	int* randnum;
	randnum = new int[num];
	srand((unsigned)time(NULL));
	for (int i = 0; i < num; i++)randnum[i] = rand() % n;
	return randnum;
}
void main() {
	MemPageList a(4);
	MemPageList c(4);
	int* b;
	int max = 8, num = 20;	//max为生成的最大内存页号,num为内存页数
	b = random(max,num);
	/*输出数组b*/
	for (int i = 0; i < num; i++)cout << b[i]<<" ";
	cout << endl;
	/*执行FIFO算法*/
	cout<<"FIFO的错误次数为"<<a.FIFO(b,num);
	cout << endl<<"最后的内存页表为";
	a.printName();
	cout << endl;
	/*执行LRU算法*/
	cout <<"LRU的错误次数为"<< c.LRU(b, num);
	cout << endl<<"最后的内存页表为";
	c.printName();
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分别有三个程序都能使用!1) 进一步理解父子进程之间的关系。 2) 理解内存面调度的机理。 3) 掌握面置换算法的实现方法。 4) 通过实验比较不同调度算法的优劣。 5) 培养综合运用所学知识的能力。 面置换算法是虚拟存储管理实现的关键,通过本次试验理解内存面调度的机制,在模拟实现FIFO、LRU等经典面置换算法的基础上,比较各种置换算法的效率及优缺点,从而了解虚拟存储实现的过程。将不同的置换算法放在不同的子进程中加以模拟,培养综合运用所学知识的能力。 2. 内容及要求: 这是一个综合型实验,要求在掌握父子进程并发执行机制和内存面置换算法的基础上,能综合运用这两方面的知识,自行编制程序。 程序涉及一个父进程和两个子进程。父进程使用rand()函数随机产生若干随机数,经过处理后,存于一数组Acess_Series[]中,作为内存面访问的序列。两个子进程根据这个访问序列,分别采用FIFO和LRU两种不同的面置换算法对内存面进行调度。要求: 1) 每个子进程应能反映出面置换的过程,并统计面置换算法的命中或缺情况。 设缺的次数为diseffect。总的面访问次数为total_instruction。 缺率 = disaffect/total_instruction 命中率 = 1- disaffect/total_instruction 2)将为进程分配的内存面数mframe 作为程序的参数,通过多次运行程序,说明FIFO算法存在的Belady现象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值