页面置换算法
Posted bearcarl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了页面置换算法相关的知识,希望对你有一定的参考价值。
要求:
写了三种算法:FIFO, LRU, OPT.
指导书上有一个错误,即要求的磁道是0 - 319, 但是如果按照指导书上的指令生成方法, 可能会生成320这条指令,自己写个检测语句就成了。。
FIFO可能有点小问题,就是检测某页面是否在内存中是时可能出错(极低概率),还没有找出来。
#include<iostream> #include<cstdio> #include<stdlib.h> #include<cstring> #include<ctime> using namespace std; int inst[330]; //指令 void start() { cout << "Start memory management" << endl; cout << "Producing address flow, wait for while, please." << endl; } void produce_addstream() { srand((unsigned)time(NULL)); int n = 0; int m, m1, m2; while(n < 320) { m = rand() % 320; if(m == 319) m--; //防止出现320的指令 inst[n++] = m + 1; m1 = rand() % (m + 2); inst[n++] = m1; inst[n++] = m1 + 1; m2 = (rand() % (320 - m1 - 2)) + m1 + 2; } } int check(int page[], int mem, int checkInst) { //检查内存中是否有当前指令所在页面 for(int i = 0; i < mem; i++) if(checkInst / 10 == page[i]) return 1; return 0; } int chooseOutPage(int page[], int mem, int i) { int temp[32], outPage = mem; for(int j = 0; j < 32; j++) temp[j] = page[j]; for(int k = i + 1; k < 320; k++) { int ans = inst[k] / 10; for(int s = 0; s < mem; s++) if(temp[s] == ans) { temp[s] = -1; --outPage; break; } if(outPage == 1) { //选择要置换的页面 for(int s = 0; s < mem; s++) if(temp[s] != -1) return s; } } for(int s = 0; s < mem; s++) //最后仅剩几条指令时,选择要置换的页面 if(temp[s] != -1) return s; } int chooseOutPage2(int page[], int mem, int i) { int temp[32], outPage = mem; for(int j = 0; j < 32; j++) temp[j] = page[j]; for(int k = i - 1; k >= 0; k--) { int ans = inst[k] / 10; for(int s = 0; s < mem; s++) if(temp[s] == ans) { temp[s] = -1; --outPage; break; } if(outPage == 1) { for(int s = 0; s < mem; s++) if(temp[s] != -1) return s; } } for(int s = 0; s < mem; s++) if(temp[s] != -1) return s; } void FIFO(int mem) { int page[32]; int remain = mem; int notFound = 0; int point = 0; //指针用来标记最先进入的页面。 memset(page, -1, sizeof(page)); for(int i = 0; i < 320; i++) { if(check(page, mem, inst[i]) == 0) { //内存中无所需页面 ++notFound; if(remain > 0) { page[mem - remain] = inst[i] / 10; --remain; } else { page[point] = inst[i] / 10; point = (point + 1) % mem; } } } cout << " memPage: " << mem << " notFound: " << notFound << " 命中率:" << float(320 - notFound) / 320 << endl; } void OPT(int mem) { int page[32]; int remain = mem; //内存中的空闲页面 int notFound = 0; memset(page, -1, sizeof(page)); for(int i = 0; i < 320; i++) { if(check(page, mem, inst[i]) == 0) { //内存中无所需页面 ++notFound; if(remain > 0) { //如果内存中还有空闲页面 page[mem - remain] = inst[i] / 10; --remain; } else { int outPage = chooseOutPage(page, mem, i); page[outPage] = inst[i] / 10; } } } cout << " memPage: " << mem << " notFound: " << notFound << " 命中率:" << float(320 - notFound) / 320 << endl; } void LRU(int mem) { int page[32]; int remain = mem; //内存中空闲页面 int notFound = 0; memset(page, -1, sizeof(page)); for(int i = 0; i < 320; i++) { if(check(page, mem, inst[i]) == 0) { ++notFound; if(remain > 0) { page[mem - remain] = inst[i] / 10; --remain; } else { int outPage = chooseOutPage2(page, mem, i); page[outPage] = inst[i] / 10; } } } cout << " memPage: " << mem << " notFound: " << notFound << " 命中率:" << float(320 - notFound) / 320 << endl; } int main() { int test[35]; //freopen("in.txt", "r", stdin); start(); produce_addstream(); cout << "choose the algorithm(1-4)\\n"; int n; cin >> n; switch(n) { case 1: for(int i = 4; i <= 32; i++) OPT(i); break; case 2: for(int i = 4; i <= 32; i++) LRU(i); break; case 3: for(int i = 4; i <= 32; i++) FIFO(i);break; default: break; } memset(test, 0, sizeof(test)); cout << "\\n检测超出范围的页面...\\n"; for(int i = 0; i < 320; i++) { int x = inst[i] / 10; test[x] = 1; if(inst[i] < 0 || inst[i] >= 320) cout << inst[i] << " ==超出范围==\\n "; } cout << "\\n检测未取到的页面...\\n"; for(int i = 0; i < 32; i++) if(test[i] == 0) cout << i << " "; return 0; }
以上是关于页面置换算法的主要内容,如果未能解决你的问题,请参考以下文章
操作系统概念 页面置换算法:分别使用FIFOOPTLRU三种置换算法来模拟页面置换的过程。