自己写了两个内存页替换算法,一个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();
}