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