本文主要是介绍操作系统分页式存储管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
每次输入地址后,计算出页号,若页号越界,则给出错误提示。否则依次调用FIFO和LRU算法,这里值得注意的是,由于我们的FIFO算法先于LRU算法被调用,那么当在处理FIFO算法时,我们暂且不将位视图相应位置做变化,留到处理LRU算法再做处理。
对于FIFO、LRU算法的缺页,我们分两种情况考虑,第一种是模拟栈内还有空间,那么直接将其入栈。第二种是模拟栈内无空间,要发生置换。发生置换时把模拟栈最底的弹出,新来的加入栈顶。
对于FIFO、LRU算法的命中,二者不同之处就是对于LRU算法,当元素命中时,要将该元素移至栈顶。
对于OPT算法,每次置换时向后查找,与栈内未来最久不使用的进行置换,若无法找到最久不使用的元素,那么默认与栈底元素进行置换。
回填位视图时只要对FIFO页表或LRU页表进行扫描,找到状态为true的位置,将其在位视图中对应的位置置回原值即可。
对于三种算法的输出格式,只要开三个相对应的二维数组,然后每次按照格式对二维数组进行赋值即可。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <time.h>
#include <string>
#include <algorithm>
#include <deque>
#include <queue>
using namespace std;int N , M;
#define Length 4132
const int maxn = 101;struct Page
{int id;int block;bool stau;
};struct Page page_fifo[maxn] , page_lru[maxn] , page_opt[maxn];int fifo[maxn];
int inva_fifo;int lru[maxn];
int inva_lru;int opt[maxn];
int inva_opt;
int cols;int fifo_2[maxn][maxn] , lru_2[maxn][maxn] , opt_2[maxn][maxn];bool view[maxn];int address[maxn];
int add_len;void out_rate_fifo()
{system("cls");cout << "FIFO缺页率 : ";cout << inva_fifo << "/" << add_len << endl;cout << endl;system("PAUSE");
}void out_rate_lru()
{system("cls");cout << "LRU缺页率 : ";cout << inva_lru << "/" << add_len << endl;cout << endl;system("PAUSE");
}void out_rate_opt()
{system("cls");cout << "OPT缺页率 : ";cout << inva_opt << "/" << add_len << endl;cout << endl;system("PAUSE");
}void out_pageFifo()
{system("cls");cout << "页表(FIFO):" << endl;for(int i = 0 ; i < M ; i ++)cout << page_fifo[i].id << " " << page_fifo[i].block << " " << page_fifo[i].stau << endl;cout << endl;system("PAUSE");
}void out_pageLru()
{system("cls");cout << "页表(LRU):" << endl;for(int i = 0 ; i < M ; i ++)cout << page_lru[i].id << " " << page_lru[i].block << " " << page_lru[i].stau << endl;cout << endl;
这篇关于操作系统分页式存储管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!